Codeforces Round #652 (Div. 2) A~E

鏈接:題目

Codeforces Round #652 (Div. 2)

A.FashionabLee

題意:能不能構造多邊形和x軸,y軸同時平行
思路:邊數得是偶數的同時,同時滿足(n-2)/2爲奇數

int main(){
    int _;
    for(scanf("%d" , &_); _ ; _ --){
        int n ;
        scanf("%d" , &n);
        if(n % 2)no;
        else {
            if(((n - 2) / 2) % 2 == 1 )yes;
            else no;
        }
    }
    return 0;
}

B.AccurateLee

題意:對於每一個1,0都可以任意刪除一個
思路:第一個1後面的所有0都可以刪掉,但是最後一個0刪掉就不行了,然後從後往前第一個0前面的1都可以刪掉

int a[N];
int vis[N];
int main(){
    int _;
    for(scanf("%d" , &_); _ ; _ --){
        int n ;
        scanf("%d" , &n);
        int num[2] = {0 , 0};
        for(int i = 1;i <= n ; i ++){
            scanf("%1d" , &a[i]);
            vis[i] = 0;
        }
        int flag = 1;
 
        for(int i = n ; i >= 1;i --){
            if(a[i] == 1){
                if(flag)continue;
                else vis[i] = 1;
            }
            else flag = 0;
        }
        flag = 0;
        for(int i = 1;i <= n ;i ++){
            if(a[i] == 0){
                if(flag) vis[i] = 1;
                else continue;
            }
            else flag = 1;
        }
        for(int i = n ; i >= 1;i --){
            if(a[i] == 0){vis[i] = 0;break;}
        }
        for(int i = 1;i <= n ; i++){
            if(vis[i])continue;
            printf("%d",a[i]);
        }
        puts("");
    }
 
    return 0;
}

C. RationalLee

題意:每一個朋友要wi個快樂值,其中只有最大最小值有貢獻,讓你最大化這個貢獻
思路:對於只要求一個快樂值得,肯定給他最大的快樂值,其他兩個以上得要求都是等價的,但是要求把每個最大快樂值都取到,剩下的所有快樂值都依次取最小,很簡單的貪心。

LL a[N] , b[N];
int vis[N];
int main(){
    int _;
    for(scanf("%d" , &_); _ ; _ --){
        int n ,k ;
        scanf("%d %d" , &n , &k);
        for(int i = 1;i <= n ; i ++){
            scanf("%lld" ,&a[i]);
        }
        for(int i = 1; i <= k ; i ++){
            scanf("%lld",&b[i]);
        }
        sort(b + 1, b + k + 1);
        sort(a + 1, a + n + 1);
        int l = 1, r = n ;
        LL ans = 0 ;
        for(int i = 1;i <= k ; i ++){
            if(b[i] == 1){
                ans += 2*a[r];
                r --;
            }
        }
        for(int i = k ;i >= 1; i --){
            if(b[i] > 1){
                ans += a[r];
                ans += a[l];
                l += b[i] - 1;
                r --;
            }
        }
        printf("%lld\n",ans);
    }
 
    return 0;
}

D. TediousLee

題意:對於一棵構造樹
找到爪子形的樣式就算一次貢獻,問你x層的最大貢獻是多少?
思路:這題算是比較優秀的題吧,我當時思考的過程我覺得對自己還是挺有參考價值的。因爲對於一個獨立節點每一次形成爪子都需要經歷兩步,也就是說兩步以後每一個獨立節點一定會形成一個爪子,於是我們可以先維護出每一層新生成的獨立節點,這個還是很好求的:
a[i] = (a[i-2] * 2 % mod + a[i-1] % mod) % mod
接下來每一層的爪子就是上兩層的獨立節點:
b[i] = a[i-2]
然後就是貪心隔兩層的前綴和
f[i] = (f[i-3]%mod + b[i]%mod)%mod;
於是整體就可以維護出來了,當然題解上說的那個1e18,用的那個公式我還不太會。暫時先這樣。

LL f[N];
LL a[N];
LL b[N];
int main(){
    int _;
    a[1] = 1;
    a[2] = 1;
 
    for(int i = 3; i <= M ;i ++){
        a[i] = (a[i-2] * 2 % mod + a[i-1] % mod) % mod ;
    }
    /**
 
    b[3] = 1;
    b[4] = 1;
    b[5] = 3;
    b[6] = 5;
    **/
    b[1] = 0;
    b[2] = 0;
    for(int i = 3 ; i <= M; i ++){
        b[i] = a[i-2];
    }
    f[1] = 0;
    f[2] = 0;
    f[3] = 1;
    f[4] = 1;
    f[5] = 3;
    for(int i = 5;i <= M; i ++){
        f[i] = (f[i-3]%mod + b[i]%mod)%mod;
    }
    for(scanf("%d" , &_); _ ; _ --){
        int n;
        scanf("%d",&n);
        printf("%lld\n",(f[n]*4)%mod);
    }
 
    return 0;
}

E. DeadLee

題意:每人都會喫一盤最喜歡的食物,問你最後他能喫完生成的序列。
思路:類拓撲排序,反相思維

int a[N], vis[N],in[N] , n ,m;
vector<PII> G[N];
int main(){
    while(~scanf("%d %d", &n ,&m)){
        for(int i = 1;i <= n ; i ++){
            scanf("%d" ,&a[i]);
            in[i] = 0,vis[i] = 0;
            G[i].clear();
        }
        for(int i = 1;i <= m ; i ++){
            int x,y;
            scanf("%d %d" ,&x,&y );
            G[x].pb({y,i});
            G[y].pb({x,i});
            a[x] --; a[y] --;
        }
        queue<int> q;
        for(int i = 1;i <= n ;i ++){
            if(a[i] >= 0) q.push(i),in[i]=1;
        }
        VI ans;
        while(q.size()){
            int x = q.front();
            q.pop();
            for(auto y:G[x]){
                if(!vis[y.se])vis[y.se] = 1, ans.pb(y.se);
                if(!in[y.fi]){
                    a[y.fi] ++;
                    if(a[y.fi] >= 0){
                        in[y.fi] = 1;
                        q.push(y.fi);
                    }
                }
            }
        }
        reverse(ans.begin(),ans.end());
        if(SZ(ans) == m){
            puts("ALIVE");
            for(auto x:ans)cout << x <<" ";
            puts("");
        }
        else puts("DEAD");
 
    }
}

小總結

在這裏插入圖片描述
這一次整體做的十分流暢,可能是才睡了一覺的緣故 ,重要的還是這一場帶來的經驗,冷靜思考,沉着應對吧,這一次的E題大約是有點小自滿,剛開始覺得是一個2-SAT或者二分圖,(當然這是我接下來打算跟進的知識點)我覺得自己不太會這類型的題,後來賽後發現竟然是個拓撲排序,難度簡直就是while(1) s–;這說實話同樣提醒着我,在icpc區域賽中其實經常也會出現這樣的情況,就是這一道題其實你能做,但是你不去開。當然現在還是得好好補習自己關於區域賽類型的題,不然到時候只有被虐和拖隊友後腿的情況了。題解還是要堅持寫的。題還是要快快補的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章