zoukankan      html  css  js  c++  java
  • 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

    -----------

  • 相关阅读:
    查看Linux内核版本的命令
    Viterbi算法
    在matlab 画箭头
    BST和DST简单的matlab程序(图的广度和深度遍历)
    灯光设置(light)
    VC++安装window8.1系统
    prim algorithm
    模拟退火
    Kruskal最小生成树
    matlab练习程序(演化策略ES)
  • 原文地址:https://www.cnblogs.com/wenruo/p/5907905.html
Copyright © 2011-2022 走看看