标签:define 集合 记录 字符 完全 icpc syn 重复 映射
暑期训练以来首次参赛,体验还行吧,过程有些战战兢兢。
刚开始以为是正式队,热身赛只过了一题,有很大的压力,正赛前一天晚上才知道是打星队,有点如释重负的感觉。也幸好都是打星队,不然真的有可能打铁,虽然实际上我们队伍下半程整体状态还不错,终场甚至接近铜牌区,但比赛中就是一切皆有可能。
熟悉了参赛的流程,每个阶段该干什么,有了首次的体验,蓝色的马甲不错hhhh。
实际比赛过程中,很大的感觉是,区域赛的题目更加注重对题目的分析,对思维的考量,从一个题目中看出它是怎么构造运转的,用什么样的算法去实现,和我们平时对着一类带标签的题目去做感觉完全不一样。
比如说K题,我就是不知道它用啥去做,一直想着搜索,却又不知道怎么在后效性下保持最优。
赛后才知道是二分图,然而这学期才刚学离散数学,还没学到,无奇环=二分图!
卡了队伍保守估计3小时以上,出不来。赛后我队长给出了bfs建图再找的做法(感觉还挺优的),我在学了二进制枚举之后,写了O(2^16*m)的枚举找的做法。有收获吧。
E题靠着队长的神奇思维,说是无论怎么走,一个图可以获取的最大边数是固定的n-1,验证了一下,发现确实,得出了最大生成树的做法,码了板子,调了一会儿,我没清tot导致RE了一发(紧张过度,我的锅,贡献罚时),也就过了,其实E题花的时间也不多吧?感觉就30分钟多?所以说想到用什么做,甚至是猜想,并且能验证,就可以不用多久码出来。
B题据说字典树裸题,判有没有别的字符串是它的前缀,虽然也看出来了字典树,但幸好板子上正好没有这个(滑稽),省的抄板子调了,然后和队友讨论,发现最长的是10个字符所以可以暴力map,记录每个string,出现就映射到1,重复出现显然已经不行,再遍历对每个当前的串去分解取0~k位置的子串,最多O(10n)?这里我还想转化到int 除10再转化回来,队友说可以直接考虑substr,然后虽然substr运用的比较少,但最后还是搞出来了。我队友nb!
然后D答案很好猜,我们队最后几分钟疯狂写构造的代码,最后还是没调好,机时欠缺,大家都有自己的想法和代码,有些混乱,还是时间没把握好,思路不够清晰明确。
赛后我补了一下我的D的构造,只是还没有OJ可以交,不知对不对。
总体而言,虽然成绩表面上似乎还行(与其他队相比之下),但实际上比赛确实充满着运气,我f们的实力还不足以克服压制一切运气,还需努力呀!熟悉板子,主要还是思考和模拟构造。
然后BDEHK都可以再补或者熟悉一下吧,字符串、树、和图。
D代码(未提交):
(如果构造错了我再改
1 #include <bits/stdc++.h> 2 #define debug(x) cout << #x << ": " << x << endl 3 using namespace std; 4 typedef long long ll; 5 const int MAXN=2e5+7; 6 const int INF=0x3f3f3f3f; 7 const int MOD=1e9+7; 8 9 int main() 10 { 11 ios::sync_with_stdio(false); 12 cin.tie(0); 13 int t; 14 cin>>t; 15 for(int i=1,n;i<=t;++i) 16 { 17 cin>>n; 18 cout<<"Case #"<<i<<": "<<n/2<<endl; 19 for(int j=1;j<=n/2;++j) 20 { 21 int t=j; 22 for(int k=1;k<=n-1;++k) 23 { 24 int tmp=(k+j)%n ? (k+j)%n : n; 25 cout<<k<<‘ ‘<<tmp<<endl; 26 } 27 } 28 } 29 return 0; 30 }
K代码
(未提交,感觉应该对的吧?):
#include <bits/stdc++.h> #define debug(x) cout << #x << ": " << x << endl using namespace std; typedef long long ll; const int MAXN=3e2+7; const int INF=0x3f3f3f3f; const int MOD=1e9+7; struct edge { int x,y; }e[MAXN]; int vis[21]; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; int kase=1; while(t--) { int n,m; cin>>n>>m; for(int i=0;i<m;++i) { cin>>e[i].x>>e[i].y; e[i].x--; //便于左移 1号点代表二进制最低位 即 1<<0; e[i].y--; } int ans=0; for(int i=0;i<(1<<n);++i)//二进制枚举 { //debug(i); int tmp=0; for(int j=0;j<m;++j) { int t1=i&(1<<e[j].x); // 取出第e[j].x位 int t2=i&(1<<e[j].y); //debug(t1); //debug(t2); if((t1==0 &&t2 )|| (t2==0 && t1)) //一个0,一个非0,说明属于不同集合,连边 tmp++; } // debug(tmp); ans=max(ans,tmp); //cout<<endl; } cout<<"Csse #"<<kase++<<": "<<ans<<endl; } return 0; }
标签:define 集合 记录 字符 完全 icpc syn 重复 映射
原文地址:https://www.cnblogs.com/Zzqf/p/11939266.html