codeforces round #648 (div2)總結

2020.6.8
最近連續兩場翻車讓我不得不加緊了一下訓練。前幾天沒再划水了,昨天上午去醫院看完奶奶下午回來鍛鍊完就坐在電腦前刷題,把二分做了做,重點練了下手動模擬,還是蠻重要的,因爲前幾場就是吃了手動模擬的虧,手速太慢導致明明ac/wa/tle情況一樣別人漲分我掉分的情況。到了八點買了杯coco就坐在電腦前等待開始。昨天心態有點小小的波動,因爲還是太曲折了。看這個結果就不難想到爲什麼了hhhh
在這裏插入圖片描述

A題果不其然又是開幕雷擊,題目很好想,就是找到行和列同時全都爲0的點的數量,若是奇數則先手必勝,偶數則必敗,然後wa2,淦。窩自己看了好一會才發現我把col[]加了兩遍,然而row根本沒動,就這還把樣例水過去了也是太慘。結果就是改了之後秒了A。一起打的大三的羣友估計對我無語了吧,什麼菜雞a題都能卡。

B題很有意思,問的是數組a內的元素分爲0和1兩種,只有種類不同才能合法互換,問能不能通過無限次數合法的互換將數列完全排好序。思路是不可能的,這輩子都不可能的。一開始以爲是獨立集排序然後比較端點大小。後來窩發現好像沒考慮全情況,樣例都過不了,朋友wa4,這可咋辦呢。然後我看着數據手動模擬了下,有一種感覺是除了一開始升序的情況直接可以判斷之外,其餘只要同時有0和1同時存在,那麼就一定可以排好序,但窩不會證明。樣例過了就交了一發,然後re了點4,後來發現是數組沒開夠,開大之後一發過了???剛纔被我微信自言自語煩死的老哥都懵了。事後我發郵件問了下Piot教授,Piot說他覺得對,但是沒法證明。

然後看C,C是問a和b序列都是隻包含1-n中的數字,每個數字出現一次,可以把a的元素集體左移或者右移,問a通過任意移動之後和b數組同位置元素相同的最大數量是多少。窩一開始沒看見1-n每個數字只出現一次,寫了個假算法跟朋友說我算法fAke了,不能處理重複數字。然後朋友跟我說,喵的每個數字本來就出現一次好吧?窩:???看到n可以開數組,然後這樣就簡單了,和之前一道dp類似。那麼直接預處理a的元素對應的位置,然後算和b中元素的下標差值,開個桶投票,最多的一個即爲答案。窩因爲沒查0和比n大的元素各wa了一次。後來想想邊跑邊統計難道不行麼??就A了,窩太菜了。然後隔壁老哥寫到C估計覺得這人好沒意思,拿羣友當聊天垃圾桶和工具人了麼?

D有意思,問能不能在矩陣中空地(".")添加牆壁,讓"B"代表的壞人不能到達(n,m),好人(“G”)可以。然後窩一開始就覺得首先要逃出去壞人不能和好人相鄰,然後wa3。朋友告訴我我忘了在壞人周圍築牆,就是把壞人旁邊的空地換成牆,然後在終點bfs看能不能收集齊所有的好人並且壞人不能和好人相鄰。之後因爲judge函數寫串了差點沒交上hhhh

E我覺得挺簡單,但當時前面耽誤時間太多了,沒能開,嗚嗚嗚嗚。陪我一起打的老哥估計被我大話癆給折磨慘了。基本都是我自己自言自語一堆,然後莫名其妙就AC了。道個歉。不過也證明了訓練的重要性,以前划水太厲害了,導致之前思維有所下降。還是得加強訓練。po代碼

A題:

#include <bits/stdc++.h>
using namespace std;
#define limit (100 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define MOD 998244353
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
typedef long long ll;
typedef unsigned long long ull;
ll read(){
    ll sign = 1, x = 0;char s = getchar();
    while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
    while(s >= '0' && s <= '9'){x = x * 10 + s - '0';s = getchar();}
    return x * sign;
}//快讀
void write(ll x){
    if(x < 0) putchar('-'),x = -x;
    if(x / 10) write(x / 10);
    putchar(x % 10 + '0');
}
int n ,k,kase;
int f[limit][limit],row[limit],col[limit];
int main() {
#ifdef LOCAL
    FOPEN;
#endif
    cin>>kase;
    while(kase--){
        cin>>n>>k;
        int tot = 0;
        rep(i ,1, n){
            rep(j ,1, k){
                int val;
                cin>>val;
                if(val)f[i][j] = 1;
                else f[i][j] = 0;
            }
        }
        rep(j ,1, k){
            int flag = 0;
            rep(i ,1, n){
                if(f[i][j])flag = 1;
            }
            col[j] = flag;
        }
        rep(i ,1, n){
            int flag = 0;
            rep(j ,1, k){
                if(f[i][j])flag = 1;
            }
            row[i] = flag;
        }
        int ans2 = 0;
        rep(i ,1, n){
            if(!row[i])++tot;
        }
        rep(i ,1, k){
            if(!col[i])++ans2;
        }
        tot = min(tot, ans2);
        puts(tot % 2 == 1 ? "Ashish" : "Vivek");
    }

    return 0;
}

B題:

#include <bits/stdc++.h>
using namespace std;
#define limit (100000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define MOD 998244353
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
typedef long long ll;
typedef unsigned long long ull;
ll read(){
    ll sign = 1, x = 0;char s = getchar();
    while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
    while(s >= '0' && s <= '9'){x = x * 10 + s - '0';s = getchar();}
    return x * sign;
}//快讀
void write(ll x){
    if(x < 0) putchar('-'),x = -x;
    if(x / 10) write(x / 10);
    putchar(x % 10 + '0');
}
int n ,k,kase;
struct node{
    int at, bt;
}a[limit];
int g[limit] , f[limit];
int main() {
#ifdef LOCAL
    FOPEN;
#endif
    cin>>kase;
    while(kase--){
        cin>>n;
        int cnt = 0 , cnt2 = 0;
        int last = -INF;
        int flag = 0;
        rep(i ,1, n){
            cin>>a[i].bt;
            if(a[i].bt < last)flag = 1;
            last = a[i].bt;
        }
        rep(i , 1, n){
            cin>>a[i].bt;
        }
        if(!flag){
            cout<<"Yes"<<endl;
            continue;
        }
        rep(i ,1, n){
            int s = a[i].at , t = a[i].bt;
            if(t){
                f[++cnt] = s;
            }else{
                g[++cnt2] = s;
            }
        }
        puts(min(cnt2, cnt) ? "Yes" : "No");
    }

    return 0;
}

C題:

#include <bits/stdc++.h>
using namespace std;
#define limit (1000000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define MOD 998244353
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
typedef long long ll;
typedef unsigned long long ull;
ll read(){
    ll sign = 1, x = 0;char s = getchar();
    while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
    while(s >= '0' && s <= '9'){x = x * 10 + s - '0';s = getchar();}
    return x * sign;
}//快讀
void write(ll x){
    if(x < 0) putchar('-'),x = -x;
    if(x / 10) write(x / 10);
    putchar(x % 10 + '0');
}
int n ,k,kase;
int a[limit] , b[limit];
int posa[limit], dist[limit];
int bucket[limit];
int main() {
#ifdef LOCAL
    FOPEN;
#endif
    cin>>n;
    rep(i ,1, n){
        cin>>a[i];
        posa[a[i]] = i;//反映射
    }
    rep(i ,1, n){
        cin>>b[i];
        if(posa[b[i]] < i){
            bucket[(posa[b[i]] + n - i)]++;
        }else{
            bucket[(posa[b[i]] - i)]++;
        }
    }
    int maxx = 0;
    rep(i ,0, 2 * n){
        maxx = max(maxx, bucket[i]);
    }
    cout<<maxx<<endl;
    return 0;
}

D題:

#include <bits/stdc++.h>
using namespace std;
#define limit (100 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步兩步
#define EPS 1e-6
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define MOD 998244353
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
typedef long long ll;
typedef unsigned long long ull;
ll read(){
    ll sign = 1, x = 0;char s = getchar();
    while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
    while(s >= '0' && s <= '9'){x = x * 10 + s - '0';s = getchar();}
    return x * sign;
}//快讀
void write(ll x){
    if(x < 0) putchar('-'),x = -x;
    if(x / 10) write(x / 10);
    putchar(x % 10 + '0');
}
int n ,k,kase;
char mapp[limit][limit];
int vis[limit][limit];
bool legal(int x, int y){
    return x >= 1 && y >= 1 && x <=n && y <= k && mapp[x][y] != 'G' && mapp[x][y] != 'B'&& !vis[x][y] ;
}
bool legal2(int x, int y){
    return x >= 1 && y >= 1 && x <=n && y <= k && !vis[x][y] && mapp[x][y] != '#';
}

int main() {
#ifdef LOCAL
    FOPEN;
#endif
    cin>>kase;
    while(kase--){
        cin>>n>>k;
        int flag = 0;
        memset(vis, 0 , sizeof(vis));
        rep(i ,1, n){
            string str;
            cin>>str;
            rep(j ,1, k){
                mapp[i][j] = str[j - 1];
                if(mapp[i][j] == 'G')flag++;
            }
        }

        if(!flag){
            puts("Yes");
            continue;
        }
        int status = 0;
        rep(i ,1, n){
            rep(j , 1, k){
                if(mapp[i][j] == 'B'){
                    if(legal(i + 1, j)){
                        mapp[i+1][j] = '#';
                    }
                    if(legal(i - 1, j)){
                        mapp[i-1][j] = '#';
                    }
                    if(legal(i, j + 1)){
                        mapp[i][j+1] = '#';
                    }
                    if(legal(i, j - 1)){
                        mapp[i][j-1] = '#';
                    }
                }
            }
        }
        queue<pi(int, int)>q;
        vis[n][k] = 1;
        q.push({n,k});
        int t = 0;
        while(q.size()){
            auto it = q.front();
            q.pop();
            int i = it.first, j = it.second;
            if(legal2(i + 1, j)){
                vis[i+1][j] = 1;
                if(mapp[i+1][j] == 'G'){
                    ++t;
                }
                if(mapp[i+1][j] == 'B'){
                    status = 1;
                }
                q.push({i+1,j});
            }
            if(legal2(i - 1, j)){
                vis[i-1][j] = 1;
                if(mapp[i-1][j] == 'G'){
                    ++t;
                }
                if(mapp[i-1][j] == 'B'){
                    status = 1;
                }
                q.push({i-1,j});
            }
            if(legal2(i, j + 1)){
                vis[i][j+1] = 1;
                if(mapp[i][j+1] == 'G'){
                    ++t;
                }
                if(mapp[i][j+1] == 'B'){
                    status = 1;
                }
                q.push({i,j+1});
            }
            if(legal2(i, j - 1)){
                vis[i][j-1] = 1;
                if(mapp[i][j-1] == 'G'){
                    ++t;
                }
                if(mapp[i][j-1] == 'B'){
                    status = 1;
                }
                q.push({i,j-1});
            }
        }
        if(status){
            puts("No");
            continue;
        }
        if(t == flag){
            puts("Yes");
        }else{
            puts("No");
        }
    }

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