ACM之行◇第一站◇ 2018HDU多校赛总结
Posted luckyglass-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM之行◇第一站◇ 2018HDU多校赛总结相关的知识,希望对你有一定的参考价值。
◇第一站◇ 2018HDU多校赛
十场多校赛下来,也算是给一个初中生开了眼界……看着清华一次次AK(默默立下flag),看着自己被同校的高中生完虐,一个蒟蒻只能给dalao们垫脚??
无论如何,这十场多校赛结束了——胆战心惊、士气高涨或是低头沉思,结果无法改变,比结果更有意义的是在比赛中学会了高校赛的团队攻法,以及一些闻所未闻的算法QwQ
不得不说,前5场的比赛状态实在是太差了,可能是不习惯ACM团队赛制,与队友的配合不是很默契,再加上心态非常的紧张,就把应该做的题做错甚至是忽略了??
垫了5次底后对多校赛的心态也就逐渐平稳了,不必与高校相争,清华的队伍不是我们能力能够触及的,我们的目光逐渐放在跟上本校高中生的步伐上。接下来的第六场比赛,在较为稳定的心态支持下,我们超过了一个高中队(虽然是本校倒数第二),得到了第257名,并与第200名通过数相同,得到了第一个分数~接着第六场的状态,我们加速做出了两道题(还是非常菜鸡,但至少尽力了),再一次得分~最后两场,比赛技巧也逐渐了解了,于是我们的发挥更加稳定,最终摆脱垫底的命运……
◇ Score Ⅰ
只得到了569名QwQ。可以说是把水题都刷了吧,也就是A,C,K题,前一个小时还好,其他高中队基本上也还是做了两道题,但是一个半小时后就逐渐掉队了,终于在接近两个小时的时候做出了C题……但发现没有改变掉队的事实,然后剩下的3个小时就自闭了??
第一道:K题 Time Zone
其实就是一道模拟题,是队友做的,只是因为不怎么了解时区错了几次。
第二道:C题 Triangle Partition
一开始看到的时候以为很难,是一道计算几何……实际上就是一道贪心,按照横坐标排序,再按顺序连取3个点,我竟然想了这么久
第三道:A题 Maximum Multiple
一道结论题,靠打表找规律最后还是做出来了——当x是3的倍数时,答案是(x/3)^3,是4的倍数时,答案是(x/4)^3*2,其他都是-1……打表大法好啊!
比赛历程:信心满满 -> 刷掉A题(签到)-> 看其他题 -> 发现不会 -> 心态渐渐爆炸 -> 突然刷掉C题 -> 异常激动 -> 发现清华要AK了?? -> Boom! -> 终于刷掉A题 -> 不会做了 -> 坐飞机?
◇ Score Ⅱ
吃午饭太晚了……回来的时候队友已经做了一道博弈论的题了,于是我开始找题做。突然发现一道逆序对的题,愉快的刷掉了。然后我就做了一道题???后来整个队3个人都在搞Hack it(记忆犹新??),感觉非常有希望,于是就开始码代码……一直WA……最后突然找到了反例QwQ,整个人都不好了。Hack It 错10次凉凉……
第一题:D题 Game
明显博弈论。手算几个情况,就发现然而先手必胜……然后队友就不知道在坐什么飞机,并没有注意到多组数据,一行代码就交了TAT,然后又改了多组数据,发现 PE 了!!!结果是没加换行……
第二题:J题 Swaps and Inversions
不得不说隐藏得非常深,一开始根本没有看出来是逆序对(破题能力还不够啊),直到另外一个队在讨论逆序对,然后突然懂了什么。于是我就copy了一个版~??
比赛历程:有点害怕 -> 刷掉博弈论 -> 发现掉队 -> J题通过人数很多 -> 听到其他队在讨论 -> 恍然大悟 -> copy版 -> 除了Hack It就看不懂了 -> 疯狂找规律 -> 以为对了 -> 一直WA -> 找到反例 -> 崩溃 -> over
◇ Score Ⅲ
每个人都做了一道题,感觉还好,然而其他队好像感觉更好??结果就GG了,但是也学会了一种方法——因为我们这些蒟蒻的英语非常的弱,读题要读很久(尤其是那一大啪啦奇奇怪怪的背景),然后我们就会时刻关注排行榜,一般来说清华AC的第一道题都是水题(还是非常人性化),然后就去看那道题QwQ。但有个缺点是速度会很慢。
第一题:D题 Euler Function
不知道队友怎么找到的结论,看代码的话就只是当 x=1 时答案为5,其他时候都是 x+5。
第二题:F题 Grab The Tree
又是一道博弈论,仍然手算……就发现结论了——只有当节点值的异或值不为零时,小Q才会赢。
第三题:L题 Visual Cube
一道模拟题不知道我为什么会做这么久。把原图像分成5块,即左上角的空白、正面、顶面、侧面和右下角的空白,几个for循环搞定QwQ
比赛历程:迅速地连续A掉D,F题 -> 比较愉快 -> 终于码完L题 -> 有点激动 -> 在200名以内 -> 开始瞎码A,C题 -> WA,MLE…… -> 颓废
◇ Score Ⅳ
清华迅速的AC了L题,然后一大堆队相继也AC了,凭借经验,这应该是一道结论题。不知道哪来的直觉,我就想出了结论,然而队友直到我AC之前都不相信……然后感觉状态还不错,又做了一道构造题,最后在队友的思路下又把D题写出来了。然而结果并没有改变……还是没有分。
第一题:L题 Graph Theory Homework
不知道怎么证明,只是凭直觉找到了结论——直接从起点到终点。
第二题:K题 Expression in Memories
一道构造题……用了一个zero[]数组判断了一下前导零,再判断有没有两个符号并在一起以及开头、末尾不能为符号;碰到?的时候就尽量换成数字1,若不满足条件(比如前导零),就换成符号+。
第三题:D题 Nothing is Impossible
出题人煞费苦心啊,把这道题改来改去,改到最后就变得很水了,直接 ai=1 了QwQ,于是在原来队友的思路上改了一改就AC了——定义全部正确人数为AC,初值为m,则AC每次除以a[i],直到结束或者AC等于0,循环的次数就是答案。
比赛历程:感觉状态不错 -> 刷了D,K两道题 -> 队友开始做E题 -> D题改了过后就水了 -> 通过D题 -> 整个队开始做E题 -> WA到最后,样例都没过 -> 发现横纵坐标反了QwQ -> [考试后十几分钟AC了]
◇ Score Ⅴ
感觉这场比赛好难啊,凉得最透的一场??,只AC了一道题,而且是队友写的,代码都看不懂……然后就一直WA。
(由于代码看不懂,直接跳过)
◇ Score Ⅵ
一开始是崩溃的,直到3个小时40分钟才AC签到,最后AC3道竟然有分!【第一次得分的时刻】
第一题:I题 Werewolf
简单的说就是一个染色的搜索……代码是队友写的,看不太懂QwQ
第二题:A题 oval-and-rectangle
莫名结论,好像就是 πa+2b ,我也不知道为什么。
第三题:L题 Pinball
从头做到尾终于AC的高中物理题,一个初中生的我自己在网上搜资料,推抛物线、加速度(我还没学)、反弹、速度拆分……最后发现太复杂,还写WA了,样例都过不了。还得请教高中dalao,原来有定理。
比赛历程:每个人都找了一道题来做 -> 不知道为什么我就是对物理题感兴趣 -> 先AC了I题 -> 另外一个队友相继AC A题 -> 发现只要做3道题就有分 -> 仿佛全队希望就在我这道题上(大多数队都做出来了L题)-> 瞎推结论 -> 过不了样例 -> 请教dalao -> 终于AC
◇ Score Ⅶ
突然发现一道原题(在AtCoder上,还做过),只是加了一个多组数据,然后恰好队友有一个优秀的代码,加上多组数据就AC了QwQ;一道队友写的矩阵快速幂,根本看不懂。感觉这场比赛我什么都没做,好颓废啊……
第一题:A题 Age of Moyu
真的是一道原题,连样例都一样,原题链接-https://arc061.contest.atcoder.jp/tasks/arc061_c?lang=en。
第二题:J题 Sequence
矩阵快速幂真的看不懂(真的抱歉)
(我也不知道怎么描述了……全程懵过去的)
◇ Score Ⅷ
只做了两道题的蒟蒻又没分了??,发现清华迅速的AC,就把那一道模拟大水题做出来了。然后队友最后几分钟的时候终于把D题AC了。尽管如此,还是没分……
第一题:E题 Magic Square
对于每一次操作,直接模拟,先把每一种旋转的规律找到,就可以直接用了。
第二题:D题 Parentheses Matrix
队友一直在找规律,然后就是一道构造结论题,也不知道他是怎么分类讨论的,就几种情况对应不同的构造方案……
比赛历程:秒A水题 -> 非常轻松 -> 一道题都不会做 -> 队友正在钻研D题 -> 坐飞机 -> 最后几分钟终于把D题AC了
◇ Score Ⅸ
看来组合数学还是我们这个队比较擅长的,两道组合数学基本上没有什么困难。在另一个高中队的帮助下终于AC了DP题。
第一题:K题 Rikka with Badminton
通过加法原理直接统计——不符合条件的情况有:a*n;a*n+b*n;b+c*n;c*n;a*n+c*n;d+c*n;a*n+d。注意统计后将重复计算的容斥一下。
第二场:D题 Rikka with Stone-Paper-Scissors
大概是结论题——分子是 剪刀胜的场数-剪刀负的场数+石头胜的场数-石头负的场数+布胜的场数-布负的场数 ;分母是 石头、剪刀、布的总数。注意实际上是统计第二个人的胜场。
第三场:A题 Rikka with Nash Equilibrium
这道题非常的有感想,然后我写了另外一篇博客QwQ-https://www.cnblogs.com/LuckyGlass-blog/p/9507466.html
比赛历程:AC了K题 -> 懵了一会儿 -> 找了找规律 -> 从样例中发现了什么东西 -> 莫名其妙AC了 -> 钻研A题 -> 瞎乱想 -> 高中dalao指点 -> DP终于写出来了 -> 终于AC了 -> 有分了!
◇ Score X
自己做了两道题,队友做了两道题,心态还不错。
第一题:H题 Pow
没看题目描述,直接发现样例就是2^n,只是高精度,非常高兴地找来了高精度的版QwQ
第二题:G题 Cyclic
OEIS大法好啊!!队友发现一个网站:(OEIS)http://oeis.org/;然后就找到了答案的数列,得到的递推式就是: A[i]=(i-3)*A[i-1]+(i-2)*((2*A[i-2]+A[i-3]));注意时刻模MOD!
第三题:I题 Count
打表和OEIS简直是绝配!凭借队友敏锐的思维,正解直接锁定欧拉函数——发现一个结论:当i≥4时 ans[i]=phi[i]/2+add,其中add=Σphi[i/2*2]/2(1~i),前三个就直接计算……
第四题:L题 Videos
其实我们都不会费用流,在网上照搬过来的……还是要好好学习一下网络流,对于这道题也是挺有想法的,https://www.cnblogs.com/LuckyGlass-blog/p/9519886.html
比赛历程:找模板 -> 过H题 -> 在OEIS上乱找 -> 过G题 -> 打表 -> 在OEIS上乱找 -> 过I题 -> 一群人围着网络流 -> 瞎乱搞 -> 竟然AC了!
◇ 源代码
就当是一个记录……
·场次Ⅰ
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,x; 6 int main() 7 { 8 scanf("%d",&n); 9 while(n--) 10 { 11 scanf("%d",&x); 12 if(x%3==0) 13 { 14 int a=x/3; 15 printf("%lld ",1LL*a*a*a); 16 } 17 else if(x%4==0) 18 { 19 int a=x/2,b=x/4; 20 printf("%lld ",1LL*a*b*b); 21 } 22 else 23 printf("-1 "); 24 } 25 }
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct POINT{ 7 int x,y,id; 8 }pnt[3005]; 9 bool cmp(POINT A,POINT B) 10 { 11 return A.x<B.x; 12 } 13 int main() 14 { 15 int t,n; 16 scanf("%d",&t); 17 while(t--) 18 { 19 scanf("%d",&n); 20 for(int i=0;i<3*n;i++) 21 scanf("%d%d",&pnt[i].x,&pnt[i].y),pnt[i].id=i+1; 22 sort(pnt,pnt+3*n,cmp); 23 for(int i=0;i<n;i++) 24 printf("%d %d %d ",pnt[i*3].id,pnt[i*3+1].id,pnt[i*3+2].id); 25 } 26 return 0; 27 }
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,x,y,len; 7 char s[15]; 8 int main() 9 { 10 scanf("%d ",&n); 11 while(n--) 12 { 13 bool f; 14 memset(s,0,sizeof(s)); 15 scanf("%d %d %s",&x,&y,s); 16 len=strlen(s); 17 if(s[3]==‘+‘) 18 f=1; 19 else 20 f=0; 21 if(s[5]==‘.‘||s[6]==‘.‘) 22 { 23 int d=s[len-1]-‘0‘; 24 d*=6; 25 if(!f) 26 d=-d; 27 y+=d; 28 if(y>=60) 29 x++,y-=60; 30 else if(y<0) 31 x--,y+=60; 32 } 33 int d=0; 34 for(int i=4;i<len;i++) 35 { 36 if(s[i]==‘.‘) 37 break; 38 d=d*10+s[i]-‘0‘; 39 } 40 if(!f) 41 d=-d; 42 d-=8; 43 x+=d; 44 if(x<0) 45 x+=24; 46 else if(x>=24) 47 x-=24; 48 if(x<10) 49 printf("0"); 50 printf("%d:",x); 51 if(y<10) 52 printf("0"); 53 printf("%d ",y); 54 } 55 }
·场次Ⅱ
1 #include<cstdio> 2 #include<vector> 3 #include<climits> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 int main() 8 { 9 int n; 10 while(~scanf("%d",&n)) 11 printf("Yes "); 12 }
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<vector> 4 using namespace std; 5 int n,num[100005],x,y; 6 long long ans; 7 void Sort(int left,int right) 8 { 9 if(left==right) return; 10 int mid=(left+right)/2,i=left,j=mid+1,len=0; 11 vector<int> snum; 12 Sort(left,mid);Sort(mid+1,right); 13 while(i<=mid && j<=right) 14 if(num[i]<=num[j]) snum.push_back(num[i++]); 15 else ans+=mid-i+1,snum.push_back(num[j++]); 16 while(i<=mid) snum.push_back(num[i++]); 17 while(j<=right) snum.push_back(num[j++]); 18 for(int i=left,j=0;i<=right;i++,j++) num[i]=snum[j]; 19 } 20 int main() 21 { 22 while(~scanf("%d%d%d",&n,&x,&y)) 23 { 24 ans=0; 25 for(int i=0;i<n;i++) scanf("%d",&num[i]); 26 Sort(0,n-1); 27 printf("%lld ",ans*(long long)min(x,y)); 28 } 29 return 0; 30 }
·场次Ⅲ
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 int main() 8 { 9 int T; 10 scanf("%d",&T); 11 while(T--) 12 { 13 int x; 14 scanf("%d",&x); 15 printf("%d ",x==1?5:x+5); 16 } 17 return 0; 18 }
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 100000 7 int T,n; 8 int w[MAXN+5],sum; 9 int main() 10 { 11 scanf("%d",&T); 12 while(T--) 13 { 14 scanf("%d",&n); 15 sum=0; 16 for(int i=1;i<=n;i++) 17 { 18 scanf("%d",&w[i]); 19 sum^=w[i]; 20 } 21 for(int i=1;i<n;i++) 22 { 23 int u,v; 24 scanf("%d%d",&u,&v); 25 } 26 if(sum==0)printf("D "); 27 else printf("Q "); 28 } 29 }
1 /*Lucky_Glass*/ 2 #include<cstdio> 3 #include<cstring> 4 char ans[100][100]; 5 int main() 6 { 7 //freopen("out.txt","w",stdout); 8 int T;scanf("%d",&T); 9 while(T--) 10 { 11 int a,b,c;scanf("%d%d%d",&a,&b,&c); 12 memset(ans,‘