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
");
        else printf("No
");
    }
    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:
",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.
");
                else{
                    int l,r;
                    if(cnt == 1){
                    int num;
                    if(top != maxn) num = top;
                    else num = bo;
                    printf("%d
",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
");
                        else printf("0
");
                        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
");
                        else printf("0
");
                    }
                    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
");
                        else printf("0
");
                    }
                }
            }
        }
    }
    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:
", ++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
", 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
", dfs2(vm[i]), dp[vm[i]]);
            }
            printf("%d
",  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:
", ++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
", sz);
        for (int i = 0; i < sz; ++i)
            printf("%lld%c", ans[i], i==sz-1?'
':' ');

    }
    return 0;
}
1004

-----------

原文地址:https://www.cnblogs.com/wenruo/p/5907905.html