廃棄ゲームCodeForces - 1250G(思维)

廃棄ゲーム

\ [制限時間:3000ミリ秒\クアッドメモリ制限:524288キロバイト\]

問題の意味

コンピュータゲームをプレイする人は、ゲームのルール

  1. ゲームが持っている\(N \)ラウンド人々の各ラウンドを取得するには、\(a_iを\) コンピュータが取得(b_i \)\
  2. 場合は、複数のスコア(K \)\ 2つの政党が複数ある場合側が勝つと、(\ k)を\、誰が勝ちます。
  3. ときに誰かがスコアに到達した(K \)\ゲームが途中で終了した後。ゲームは誰のスコアを超える場合は以上(K \)\、双方はありません、1つの勝利を描きます。
  4. プレイヤーが持っている\(RESET \)ヒト画分を想定し、ボタンを(X \)\スコア用コンピュータは、(Y \)\、プレス後、(X「= MAX(0、XY)\)\ \、 Y '= MAX(0、YX )\) と\(X'、Y「は\ ) 再度画分およびコンピュータになります。

今、選手たちは、彼が勝つことができれば、彼はそれらの車輪を押す必要があるかを知りたい\(RESET \) 出力Yaoanは、プログラムの最小数。

思考

まず、我々は見つけることができます:

  1. \(RESET \)ボタンとコンピュータが、スコアは、それらの小さい方の値を差し引き、実際にあります。
  2. 考慮せず\(Kを\)限界の下に、ある\(A、B、C \ ) で3つのゲーム、\(B \)を押し\(RESET \)\(C \)とプレス\ (RESET \)効果直接的かつ\(C \)押される\(RESET \)の効果は同じです。
  3. 考慮しない(K \)\プレスの限界で(M \)\\(RESET \)最後から二番目のラウンドが一度押さとして、見ることができ、最終ラウンドで1回押します。

注文\(SA \)\(A \)プレフィックスと、\(SB \)\(B \)プレフィックスと、\(W \)\(SA \)\(SB \)より小さな値。
セクション場合は\(I \)ホイールは勝つことができる、そして最後の押しで\(L \)ホイールには、次の基準を満たしている必要があります
\ [ケース\ {SA} [I] -w [L] <K始めます\\ SB [i]は-w [L ]> = K \端{ケース} \\ \ {ケース} SAを開始する[I] -k <W [L] \\ SB [i]は-k> = [L W ] \エンド{例} \]
が満たされるのであれば、ゲームの各ラウンドのために、ちょうど見つける\(L \) あなたは勝利することが可能であるかどうかを判断することができます。
そのための(、\ W SA、SB \ ) ので、インクリメントされ(私は\)\増加させ、\(L \)単調で、その後、見つける(L \)\プロセスが線形です。
それからちょうど最小見つける\(I \)とそれに対応する\(Lを\)そして、ときに最初の人\(L \)端数ホイールを超えていない(\ Kを)\、および\(L \)ホイールを押して\(RESET \) で確保することができます\(I \)ホイールを受賞。
このため、見つかった(私は\)\最小で、元\(I-1 \)ラウンドは勝つことができない、そのような操作の数は最小限でなければなりません。

/*************************************************************** 
    > File Name     : G.cpp
    > Author        : Jiaaaaaaaqi
    > Created Time  : Sun 03 Nov 2019 10:37:18 PM CST
 ***************************************************************/
 
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define  lowbit(x)  x & (-x)
#define  mes(a, b)  memset(a, b, sizeof a)
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
 
typedef unsigned long long int ull;
typedef long long int ll;
const int    maxn = 2e5 + 10;
const int    maxm = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;
using namespace std;
 
int n, m;
int cas, tol, T;
 
ll a[maxn], b[maxn], k;
ll sa[maxn], sb[maxn], w[maxn];
vector<int> vv;
 
int findwin() {
    int L = 0;
    int ans = -1;
    for(int i=1; i<=n; i++) {
        while(L<=n && sa[i]-k >= w[L])  L++;
        if(sa[i]-k < w[L] && w[L] <= sb[i]-k) {
            ans = i;
            break;
        }
    }
    if(!L || ans == -1) return ans;
    {
        ll A, B;
        A = B = 0;
        for(int i=1; i<L; i++) {
            A += a[i], B += b[i];
            if(A+a[i+1] >= k) {
                vv.pb(i);
                ll x = min(A, B);
                A -= x, B -= x;
                if(A+a[i+1]>=k) return -1;
            }
        }
        vv.pb(L);
    }
    return ans;
}
 
int main() {
    // freopen("in", "r", stdin);
    scanf("%d", &T);
    while(T--) {
        vv.clear();
        scanf("%d%lld", &n, &k);
        sa[0] = sb[0] = w[0] = 0;
        for(int i=1; i<=n; i++) {
            scanf("%lld", &a[i]);
            sa[i] = sa[i-1]+a[i];
        }
        for(int i=1; i<=n; i++) {
            scanf("%lld", &b[i]);
            sb[i] = sb[i-1]+b[i];
            w[i] = min(sa[i], sb[i]);
        }
        // printf("sa: "); for(int i=1; i<=n; i++) printf("%lld%c", sa[i], i==n?'\n':' ');
        // printf("sb: "); for(int i=1; i<=n; i++) printf("%lld%c", sb[i], i==n?'\n':' ');
        // printf("w : "); for(int i=1; i<=n; i++) printf("%lld%c", w[i], i==n?'\n':' ');
        int pos = findwin();
        if(pos == -1) {
            printf("-1\n");
        } else {
            if(vv.size() == 0) {
                printf("0\n\n");
            } else {
                sort(vv.begin(), vv.end());
                printf("%d\n", vv.size());
                for(int i=0; i<vv.size(); i++) {
                    printf("%d%c", vv[i], i==vv.size()-1?'\n':' ');
                }
            }
        }
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/Jiaaaaaaaqi/p/11971732.html