2016東北四省賽 小結


第二次參加東北四省賽,賽前還是有點緊張。

反而隊友表現的比較淡定。可能是我太重視了吧,呵呵。

吉大很大很美。

賽前幾分鍾入場。讀題。按照平時的順序來讀。

刷新一下榜,A題過了一片了,我問zr能做嗎,他說沒看懂題 =_= 好吧我看了下,水水水。。一個圖,n個點,1~n,任意兩個點之間的邊長為lcm(u,v),求最小生成樹。

直接1連每個點就好了2+3+...+n=(2+n)*(n-1)/2。1Y

再刷一下榜,C題過了一片,ys打了個表,說直接輸出這兩個數就好了,1Y

再刷一下榜,E題過了一片,我讀,寫完了zr說寫的不對,我倆討論下題意,我改。。。然后交了兩發,都wa了,又讓ys讀題,mdzz果然讀錯了。。。是說三條首尾相連的線,並不是線的長度是3。3Y

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <string>
using namespace std;
int a[50][50];
int n, m;

bool ok(int x, int y) {
    if (x < n && x >= 0 && y < m &&  y >= 0) return true;
    return false;
}

int main(){
    //freopen("in.txt","r",stdin);
    int T, cas = 0;
    scanf("%d", &T);
    while (T--) {
        cout << "Case #" << ++cas << ": ";
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                scanf("%d", &a[i][j]);
            }
        }
        bool fg = false;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {

                if (ok(i, j+1) && a[i][j] == a[i][j+1]) fg = true;

                if (ok(i+1, j) && a[i][j] == a[i+1][j]) fg = true;

            }
        }

        for (int i = 0; i < m; ++i) {
            for (int j = i+1; j < m; ++j) {
                if (a[0][i] == a[0][j] || a[n-1][i] == a[n-1][j]) fg = true;
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = i+1; j < n; ++j) {
                if (a[i][0] == a[j][0] || a[i][m-1] == a[j][m-1]) fg = true;
            }
        }

        if (fg) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
比賽代碼E

 

由於E題卡了很久,這時有點急。

刷一下榜,沒變化。

看看題,刷一下榜,沒變化。

上個廁所,刷一下榜,沒變化。

卧槽是不是榜壞了,沒榜怎么做題。。。

好久之后,終於有那么幾個隊過了第四題。。。

於是跟榜做H,F。。。

zr說H是水題,我在看K題,沒思路,於是他寫H。。。寫完之后wa了。又看了一遍題,原來不是異或,,,,woc隊友今天智商絕對不在線,異或不寫xor寫nand?看了下,說改不了。於是他去看F。

看完題他就要暴力一發,我很不理解1e10他怎么敢暴力,然而我覺得阻止他的話,他會一直有這種1e10能過的心理,於是沒管他,但心里挺生氣的,兩個人討論的時候語氣也不太好。

后來他寫完果然T了。

然后我又看了下H,感覺以前做的CF有一個和這個挺像的,我就和zr說了下記錄0的位置,判斷第一個0的位置就可以了,具體怎么實現還沒想清楚。zr說可以寫,於是他去寫。我看F。

我發現F題面特別提示了sigma(mi)<=100000,這不是暗示用m個不重要的點建圖嗎Orz。於是紙上寫了下,感覺沒什么問題。

zr的H題又wa。打印了代碼去找錯。

我的F,,,,我真的是,我把函數應該返回的是2,可是一直返回1,后來發現。。。。返回類型是bool型。。。。我再也不用bool類型的返回值了!!!!

調了好久才找出來,中間H都wa了好幾次了。。。。

改好后T了。。。。媽蛋。。。。。

 

真的都有點絕望了。。。。三題打鐵嗎?。。。。。

 

然后zr改H,終於啊,終於過了。。。。比賽代碼,丑的不行。。。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <string>
#include <set>
using namespace std;
const int maxn = 2e5 + 10;
char s[10];
int n,sta[maxn*3],top,bo,fg,pos,cnt1;
set<int>q;
int main()
{
   // freopen("in.txt","r",stdin);
    int T;
    cin>>T;
    int ans;
    int cas = 0;
    //cout<<1.414*3.14<<endl;
    while(T--)
    {
        cas++;
        top = maxn,bo = maxn,fg = 0;
        memset(sta,0,sizeof(sta));
        q.clear();
        int a;
        int cnt = 0;
        printf("Case #%d:\n",cas);
        scanf("%d",&n);
        getchar();
        while(n--)
        {
            scanf("%s",s);
            if(s[0] == 'P'&&s[1] == 'U')
            {
                scanf("%d",&a);
                if(fg) {
                    top++;
                    if(top == maxn) top++;
                    sta[top] = a;
                    if(a == 0) q.insert(top);

                }
                else {
                    top--;
                    if(top == maxn) top--;
                    sta[top] = a;
                    if(a == 0) q.insert(top);

                }
                cnt++;
            }
            if(s[0] == 'P'&&s[1] == 'O')
            {

                if(fg == 0){
                    if(top == maxn) top++;
                    q.erase(sta[top]);
                    top++;
                    if(top == maxn) top++;
                }
                else{
                    if(top == maxn) top--;
                    q.erase(sta[top]);

                    top--;
                    if(top == maxn) top--;
                }
                cnt--;
            }
            if(s[0] == 'R'){
                fg ^= 1;
                swap(top,bo);
            }
            if(s[0] == 'Q')
            {
                if(cnt == 0)
                    printf("Invalid.\n");
                else{
                    int l,r;
                    if(cnt == 1){
                    int num;
                    if(top != maxn) num = top;
                    else num = bo;
                    printf("%d\n",sta[num]);
                        continue;
                    }
                    if(q.size() > 0){
                    set<int>::iterator it = q.end();
                        l = *q.begin(),r = *(--it);
                       // cout<<l<<" "<<r<<endl;
                    }
                    else{
                        int num = abs(bo - top) + 1;
                        if((bo >= maxn&&top <= maxn)||(bo <= maxn&&top >= maxn)) num--;
                        if(num % 2 == 1) printf("1\n");
                        else printf("0\n");
                        continue;
                    }
                    //else
                      //  cout<<l<<" "<<r<<endl;
                    if(fg){
                        int num = l - bo + 1;
                        if((bo >= maxn&&l <maxn)||(bo <= maxn&&l > maxn)) num--;
                        if(top == maxn){
                            if(l == top - 1)
                                num--;
                        }
                        else {
                            if(l == top) num--;
                        }
                        if(num % 2 == 1) printf("1\n");
                        else printf("0\n");
                    }
                    else{
                        int num = bo - r + 1;
                        if((bo >= maxn&&r <maxn)||(bo <= maxn&&r > maxn)) num--;
                        if(top == maxn){
                            if(r == top+1) num--;
                        }
                        else{
                            if(r == top) num--;
                        }
                        if(num % 2 == 1) printf("1\n");
                        else printf("0\n");
                    }
                }
            }
        }
    }
    return 0;
}
比賽代碼-H

 

我把F的每次的初始化改了下,嘗試着再交一發,啊啊啊終於過了。。。。兩題隔了不到十分鍾的樣子。。。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <string>
using namespace std;
const int maxn = 1e5 + 10;
int head[maxn],cnt;
int fa[maxn];
int tot[maxn];
int vm[maxn], um[maxn];
map<int, int> mp;
vector<int> G[maxn];
int q,n,m;
struct st {
    int to,nxt;
}edge[maxn*2];
void add(int u,int v){
    edge[cnt].nxt = head[u];
    edge[cnt].to = v;
    head[u] = cnt;
    cnt++;
}
bool dfs1(int u,int pre){
    fa[u] = pre;
    tot[u] = 0;
    for(int i = head[u];i != -1;i = edge[i].nxt){
        int v = edge[i].to;
        if(v == pre) continue;
        if (dfs1(v,u));
        tot[u]++;
    }
}
int dfs2(int u){
    if (mp[u] != -2) return mp[u];
    int son = 0;
    int tol = 0;
    for(int i = 0;i < G[u].size();++i){
        if (dfs2(G[u][i]) >= 1) tol++;
        son++;
    }
    if (tot[u] - son + tol >= 2) return mp[u] = 2;
    if (tot[u] - son + tol == 1) return mp[u] = 1;
    return mp[u] = -1;
}
int main(){
    //freopen("in.txt","r",stdin);
    int T;
    cin>>T;
    int cas = 0;
    while(T--){
        printf("Case #%d:\n", ++cas);
        scanf("%d%d",&n,&q);
        int a,b;
        memset(head,-1,sizeof(head));
        cnt = 0;
        for(int i = 1; i < n; i++){
            scanf("%d%d",&a,&b);
            add(a,b); add(b,a);
        }
        dfs1(1, 0);
        //for (int i = 1; i <= n; ++i) printf("%d %d\n", fa[i], tot[i]);
        while(q--){
            mp.clear();
            cnt = 0;
            scanf("%d",&m);
            for(int i = 1; i <= m; i++){
                scanf("%d",&vm[i]);
                G[vm[i]].clear();
                mp[vm[i]] = -2;
            }
            for (int i = 1; i <= m; ++i) {
                if (mp[ fa[vm[i]] ] == -2) {
                    G[ fa[vm[i]] ].push_back(vm[i]);
                }
            }
            int ans = 0;
            for (int i = 1; i <= m; ++i) {

                if (dfs2(vm[i]) == 2) ans++;
                //printf(">>%d %d\n", dfs2(vm[i]), dp[vm[i]]);
            }
            printf("%d\n",  n - (m - ans));
        }
    }
    return 0;
}
比賽代碼-F

 

還有40分鍾,看到D題過的比較分散,感覺可能是比較有想法的題,看完題,我就說離散化一下,但是思路不是很明確。

zr想直接bfs,但是嘗試了幾種思路感覺又都不對。

還有十幾分鍾,我才上手寫,越寫越覺得靠譜。。。。

可是沒時間了。。。。

沒時間了啊啊啊。。。我都寫了一大半了。。。。

哭瞎。。。。默默安慰自己寫完也過不了(??)

 

5題滾粗,罰時太多了,一等獎無緣。。。。

 

太不熟練了。太弱了。太辣雞了。

 

繼續。。。。努力。。。。嗎?

 

 

----------

 

10.6

 

今天杭電重現賽-- (要知道有重現賽就不放代碼了Orz

 

於是有機會把04交了……

 

果然比賽是不可能做出來的……

 

 

做了大概一個半小時

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;

typedef long long ll;
const int N = 1000;
int zx[N], zy[N];
int gx[N], gy[N];
int vis[N][N];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

int r, c;

struct node {
    int v, p;
    bool operator<(const node rhs) const {
        if (v == rhs.v) return p < rhs.p;
        return v < rhs.v;
    }
} x[N], y[N];


ll dfs(int x, int y) {
    ll ans = (ll)gx[x] * gy[y];
    vis[x][y] = 1;
    for (int i = 0; i < 4; ++i) {
        int nx = x + dx[i], ny = y + dy[i];
        if (nx > 0 && ny > 0 && nx <= r && ny <= c && !vis[nx][ny])
            ans += dfs(nx, ny);
    }
    return ans;
}

int main(){
    #ifndef ONLINE_JUDGE
       freopen("in.txt", "r", stdin);
    #endif // ONLINE_JUDGE
    int T, cas  = 0;
    scanf("%d", &T);
    while (T--) {
        printf("Case #%d:\n", ++cas);
        int n, m, cnt;
        scanf("%d%d", &n, &m);
        scanf("%d", &cnt);
        for (int i = 1; i <= cnt; ++i) {
            scanf("%d%d", &x[i].v, &y[i].v);
            x[i].p = y[i].p = i;
        }

        sort(x+1, x+1+cnt);
        sort(y+1, y+1+cnt);

        cnt++;
        x[cnt].v = n;
        y[cnt].v = m;
        x[cnt].p = y[cnt].p = cnt+1;

        int nowv = 1;
        x[0].v = y[0].v = gx[1] = gy[1] = 1;

        for (int i = 1; i <= cnt; ++i) {
            if (x[i].v == x[i-1].v) {
                zx[x[i].p] = nowv;
                gx[nowv] = 1;
            } else if (x[i].v == x[i-1].v + 1) {
                zx[x[i].p] = ++nowv;
                gx[nowv] = 1;
            } else {
                zx[x[i].p] = nowv + 2;
                gx[nowv+1] = x[i].v - x[i-1].v - 1;
                gx[nowv+2] = 1;
                nowv += 2;
            }
        }
        r = nowv;

        nowv = 1;
        for (int i = 1; i <= cnt; ++i) {
            if (y[i].v == y[i-1].v) {
                zy[y[i].p] = nowv;
                gy[nowv] = 1;
            } else if (y[i].v == y[i-1].v + 1) {
                zy[y[i].p] = ++nowv;
                gy[nowv] = 1;
            } else {
                zy[y[i].p] = nowv + 2;
                gy[nowv+1] = y[i].v - y[i-1].v - 1;
                gy[nowv+2] = 1;
                nowv += 2;
            }
        }
        c = nowv;

        memset(vis, 0, sizeof vis);
        for (int i = 1; i < cnt; ++i) vis[zx[i]][zy[i]] = 1;
        vector<ll> ans;
        ll tmp;
        for (int i = 1; i <= r; ++i)
            for (int j = 1; j <= c; ++j)
                if (!vis[i][j]) ans.push_back(dfs(i, j));
        sort(ans.begin(), ans.end());
        int sz = ans.size();
        printf("%d\n", sz);
        for (int i = 0; i < sz; ++i)
            printf("%lld%c", ans[i], i==sz-1?'\n':' ');

    }
    return 0;
}
1004

-----------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM