CodeForces 522C Chicken or Fish?

Chicken or Fish?

题意比较难理解。

需要注意的是 就算某个人抱怨了 但是的t[i]也是他最后选择的结果。

题解:

首先考虑没有r[i] = 1的情况。 直接记录t[i]=0的数目,最后输出的时候比较a[i]和跳过的人的大小。

其次如果存在r[i]=1的情况, 则说明在前面就有一个菜品是被选完了。

        再明白的后面出现的菜品在这个点是不会被选完的。

        那么在后面不选完的菜品中,数目少于等于跳过的人都是可能被选完的。

        再其次为了考虑对其他菜品的影响,我们需要减去最少的菜品的数量,这样就可能使得更多的菜品也被选完。

 

#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod =  (int)1e9+7;
const int N = 2e5 + 100;
int a[N];
int t[N], r[N];
int ok[N];
int m, k, lf;
int vis[N];
int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d", &m, &k);
        lf = 0;
        for(int i = 1; i <= k; ++i)
            scanf("%d", &a[i]);
        int f = 0;
        for(int i = 1; i < m; ++i){
            scanf("%d%d", &t[i], &r[i]);
            f += r[i];
        }
        if(!f){
            int lf = 0;
            for(int i = 1; i < m; ++i){
                if(t[i]) a[t[i]]--;
                else lf++;
            }
            for(int i = 1; i <= k; ++i){
                if(a[i] <= lf) putchar('Y');
                else putchar('N');
            }
        }
        else{
            for(int i = 1; i <= k; ++i) vis[i] = 0, ok[i] = 1;
            int lf = 0;
            for(int i = 1; i < m; ++i){
                if(r[i] && f){
                    f = 0;
                    for(int j = i; j < m; ++j)
                        vis[t[j]] = 1;
                    int Mn = INF;
                    for(int j = 1; j <= k; ++j){

                        if(vis[j]) continue;
                        if(a[j] > lf) continue;
                        Mn = min(Mn, a[j]);
                        ok[j] = 0;
                    }
                    lf -= Mn;
                }
                if(t[i]) a[t[i]]--;
                else lf++;
            }
            for(int i = 1; i <= k; ++i){
                if(a[i] <= lf || !ok[i]) putchar('Y');
                else putchar('N');
            }
        }
        puts("");
    }
    return 0;
}
View Code

 

posted @ 2019-07-03 16:07  Schenker  阅读(148)  评论(0编辑  收藏  举报