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题卡了很久,这时有点急。
刷一下榜,没变化。
看看题,刷一下榜,没变化。
上个厕所,刷一下榜,没变化。
卧槽是不是榜坏了,没榜怎么做题。。。
好久之后,终于有那么几个队过了第四题。。。
于是跟榜做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; }
我把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; }
还有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; }
-----------