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 }
A-Maximum Multiple

 

技术分享图片
 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 }
C-Triangle Partition

 

技术分享图片
 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 }
K-Time Zone

 

·场次Ⅱ

技术分享图片
 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 }
D-Game

 

技术分享图片
 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 }
J-Swaps and Inversions

 

·场次Ⅲ

技术分享图片
 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 }
D-Euler Function

 

技术分享图片
 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 }
F-Grab The Tree

 

技术分享图片
 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,,sizeof ans);
13         int R=2*b+2*c+1,C=2*b+2*a+1;
14         for(int i=0;i<2*b;i++)
15             for(int j=0;j<2*b-i;j++)
16                 ans[i+1][j+1]=.,
17                 ans[R-i][C-j]=.;
18         for(int i=0;i<2*b;i++)
19             for(int j=1;j<=2*a+1;j++)
20                 if(i%2)
21                     ans[i+1][2*b-i+j]=j%2?/:.;
22                 else
23                     ans[i+1][2*b-i+j]=j%2?+:-;
24         for(int i=2*b+1;i<=R;i++)
25             for(int j=1;j<=2*a+1;j++)
26                 if(i%2)
27                     ans[i][j]=j%2? +:-;
28                 else
29                     ans[i][j]=j%2? |:.;
30         for(int i=1;i<=2*b;i++)
31         {
32             int x=C-i+1,y=i;
33             for(int j=0;j<=2*c;j++)
34                 if(i%2)
35                     ans[y+j][x]=j%2?|:+;
36                 else
37                     ans[y+j][x]=j%2? .:/;
38         }
39         for(int i=1;i<=R;i++)
40         {
41             for(int j=1;j<=C;j++)
42                 printf("%c",ans[i][j]);
43             printf("
");
44         }
45     }
46     return 0;
47 }
L-Visual Cube

 

·场次Ⅳ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 #define MAXN 100
 8 #define LL long long
 9 int T;
10 ll n,m;
11 LL a[MAXN+5];
12 int main()
13 {
14     scanf("%d",&T);
15     while(T--)
16     {
17         scanf("%lld%lld",&n,&m);
18         for(int i=1;i<=n;i++)
19         {
20             ll ac;
21             scanf("%lld%lld",&ac,&a[i]);
22         }
23         sort(a+1,a+n+1);
24         int ans=0,AC=m;
25         for(int i=1;i<=n;i++)
26         {
27             AC=AC/(a[i]+1);
28             if(AC==0)break;
29                 ans++;
30         }
31         printf("%d
",ans);
32     }
33     return 0;
34 }
D-Nothing is Impossible

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 bool work()
 7 {
 8     bool zero[505]={};
 9     char str[505]="";
10     scanf("%s",str);
11     int len=strlen(str);
12     if(str[0]==+ || str[0]==* || str[len-1]==+ || str[len-1]==*) return false;
13     if(str[0]==?) str[0]=1;
14     if(str[len-1]==?) str[len-1]=1;
15     if(len==2)
16     {
17         if(str[0]==0) return false;
18         printf("%s
",str);
19         return true;
20     }
21     if(1<=str[0] && str[0]<=9) zero[0]=true;
22     for(int i=1;i<len;i++)
23     {
24         if(str[i]==?)
25         {
26             if(0<=str[i-1] && str[i-1]<=9 && !zero[i-1]) str[i]=+;
27             else str[i]=1,zero[i]=true;
28         }
29         if((str[i]==* || str[i]==+) && (str[i-1]==* || str[i-1]==+))
30             return false;
31         if(0<=str[i] && str[i]<=9)
32         {
33             if(str[i]!=0) zero[i]=true;
34             if((0<=str[i-1] && str[i-1]<=9) && !zero[i-1]) return false;
35         }
36         if(zero[i-1] && 0<=str[i] && str[i]<=9)
37             zero[i]=true;
38     }
39     printf("%s
",str);
40     return true;
41 }
42 int main()
43 {
44     int T;scanf("%d",&T);
45     while(T--)
46     {
47         bool res=work();
48         if(!res) printf("IMPOSSIBLE
");
49     }
50     return 0;
51 }
K-Expression in Memories

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int MAXN=int(1e5);
 8 int dis[MAXN+5];
 9 int main()
10 {
11     int T;scanf("%d",&T);
12     while(T--)
13     {
14         int n;scanf("%d",&n);
15         for(int i=0;i<n;i++)
16             scanf("%d",&dis[i]);
17         printf("%d
",int(sqrt(fabs(dis[n-1]-dis[0]))));
18     }
19     return 0;
20 }
L-Graph Theory Homework

 

·场次Ⅴ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<iostream>
 3 #include<string>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,len;
 7 string s,s1,s2,a1,a2;
 8 void dfs1(string s1,int x,int v)
 9 {
10     if(x>=len)
11     {
12         a1=min(a1,s1);
13         return;
14     }
15     for(int i=0;i<x;i++)
16     {
17         if(s1[i]>a1[i])
18             return;
19         else if(s1[i]<a1[i])
20             break;
21     }
22     for(int j=x+1;j<len;j++)
23     {
24         if(v<m&&(s1[j]!=0||x!=0))
25         {
26             swap(s1[x],s1[j]);
27             dfs1(s1,x+1,v+1);
28             swap(s1[j],s1[x]);
29         }
30     }
31     dfs1(s1,x+1,v);
32 }
33 void dfs2(string s2,int x,int v)
34 {
35     if(x>=len)
36     {
37         a2=max(a2,s2);
38         return;
39     }
40     for(int i=0;i<x;i++)
41     {
42         if(s2[i]<a2[i])
43             return;
44         else if(s2[i]>a2[i])
45             break;
46     }
47     for(int j=x+1;j<len;j++)
48     {
49         if(v<m&&(s2[j]!=0||x!=0))
50         {
51             swap(s2[x],s2[j]);
52             dfs2(s2,x+1,v+1);
53             swap(s2[j],s2[x]);
54         }
55     }
56     dfs2(s2,x+1,v);
57 }
58 int main()
59 {
60     int T;
61     cin>>T;
62     while(T--)
63     {
64         cin>>s>>m;
65         len=s.length();
66         s1=s2=a1=a2=s;
67         dfs1(s1,0,0);
68         dfs2(s2,0,0);
69         cout<<a1<<" "<<a2<<endl;
70     }
71 }
B-Beautiful Now

 

·场次Ⅵ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstring>
 7 using namespace std;
 8 int T;
 9 double a,b,ans;
10 int main()
11 {
12     scanf("%d",&T);
13     while(T--)
14     {
15         scanf("%lf%lf",&a,&b);
16         a*=10000,b*=10000;
17         ans=3.1415926535897932384626433832795028841971*a+2.0*b;
18         printf("%.6lf
",ans/10000-0.0000005);
19     }
20 }
A-oval-and-rectangle

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 #define N 100005
 8 int n,m,ans,a1[N],f2[N];
 9 bool f3[N];
10 struct mzls
11 {
12     int to;
13     bool f;
14 }g[N];
15 int main()
16 {
17     int T;
18     scanf("%d",&T);
19     while(T--)
20     {
21         memset(a1,0,sizeof(a1));
22         scanf("%d",&n);
23         ans=n;
24         for(int i=1;i<=n;i++)
25         {
26             char s[15];
27             scanf("%d%s",&m,s);
28             g[i].to=m;
29             if(s[0]==v)
30                 g[i].f=0;
31             else
32                 g[i].f=1;
33         }
34         for(int i=1;i<=n;i++)
35             if(!a1[i])
36             {
37                 bool ff=0;
38                 //memset(f3,0,sizeof(f3));
39                 int tot=1,x=i;
40                 f2[tot]=x;
41                 f3[x]=1;
42                 while(1)
43                 {
44                     bool fl=g[x].f;
45                     x=g[x].to;
46                     if((fl&&f3[x])||(!fl&&a1[x]==2))
47                     {
48                         int x1=x;
49                         bool fff=0;
50                         if(!fl)
51                             fff=1;
52                         for(int j=tot;j>=1;j--)
53                         {
54                             if(f2[j]==x1)
55                                 fff=1;
56                             if(fff)
57                                 a1[f2[j]]=2;
58                             f3[f2[j]]=0;
59                         }
60                         ff=1;
61                         break;
62                     }
63                     if((!fl&&f3[x])||(fl&&!f3[x]))
64                         break;
65                     f3[x]=1;
66                     f2[++tot]=x;
67                 }
68                 if(!ff)
69                 {
70                     for(int j=1;j<=tot;j++)
71                     {
72                         f3[f2[j]]=0;
73                         a1[f2[j]]=1;
74                     }
75                 }        
76             }
77         for(int i=1;i<=n;i++)
78             ans-=a1[i]==1;
79         printf("0 %d
",ans);
80     }    
81 }
I-Werewolf

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const double g=9.8,EPS=1e-10;
 8 int main()
 9 {
10     int T;scanf("%d",&T);
11     while(T--)
12     {
13         double a,b,x,y;
14         scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
15         double tana=b/a;
16         double reala=atan(tana);
17         double cosa=cos(reala),sina=sin(reala);
18         a*=-1;
19         double hgt=y-b/a*x;
20         double now=0,vx,vy=sqrt(2*hgt*g),_1=sina*g,_2=cosa*g;
21         vx=vy*sina;vy*=cosa;
22         int ans=0;
23         while(x+cosa*now<0)
24         {
25             ans++;
26             double ta,tb,fx,tot;
27             ta=vy/_2;
28             fx=vy*ta-_2/2*ta*ta;
29             tb=sqrt(2.0*fx/_2);
30             tot=ta+tb;
31             now+=vx*tot+_1/2*tot*tot;
32             vx+=_1*tot;
33             vy=_2*tb;
34         }
35         printf("%d
",ans);
36     }
37     return 0;
38 }
L-Pinball

 

·场次Ⅶ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<climits>
 6 #include<algorithm>
 7 #include<cmath>
 8 #include<queue>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 #define MAXN 100000
13 #define MAXM 200000
14 #define INF INT_MAX
15 int n,m;
16 struct node
17 {
18     int next,to,w;
19 }e[MAXM*2+5];
20 int b[MAXN+5];
21 int x,y,z,cnt,s,t,ans;
22 map<int,int> Ncolor[MAXN+5];
23 int dist[MAXN+5];
24 priority_queue < pair<int,int> > Q;
25 void fpush(int u,int v,long long w)
26 {
27     e[++cnt].next=b[u];
28     e[cnt].w=w;
29     e[cnt].to=v;
30     b[u]=cnt;
31 }
32 void Dijkstra()
33 {
34      Q.push({0,s});
35     dist[s]=1;
36     while(!Q.empty())
37     {
38         int now=Q.top().second,xval=-Q.top().first;
39         Q.pop();
40         for(int i=b[now];i;i=e[i].next)
41         {
42             int xnext=e[i].to,color=e[i].w;
43             int val=xval;
44             if(!Ncolor[now].count(color))val++;
45             if(dist[xnext]>val)
46             {
47                 Ncolor[xnext].clear();
48                 Ncolor[xnext][color]=1;
49                 dist[xnext]=val;
50                 Q.push({-val,xnext});
51             }
52             if(dist[xnext]==val)Ncolor[xnext][color]=1;
53         }
54     }
55 }
56 int main()
57 {
58     while(~scanf("%d%d",&n,&m))
59     {
60         cnt=0;
61         for(int i=1;i<=n;i++)
62         {dist[i]=INF;Ncolor[i].clear();b[i]=0;}
63         s=1,t=n;
64         for(int i=1;i<=m;i++)
65         {
66             scanf("%d%d%d",&x,&y,&z);
67             fpush(x,y,z);
68             fpush(y,x,z);
69         }
70         Dijkstra();
71         if(dist[n]!=INF)printf("%d
",dist[n]);
72         else printf("-1
");
73     }
74 }
A-Age of Moyu

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define mod 1000000007
 7 struct mzls
 8 {
 9     int a,b,g[4][4];
10 }a1,b1,c1,d1;
11 inline mzls X(mzls x1,mzls x2)
12 {
13     d1.a=x1.a,d1.b=x2.b;
14     memset(d1.g,0,sizeof(d1.g));
15     for(int i=1;i<=x1.a;i++)
16         for(int j=1;j<=x2.b;j++)
17             for(int k=1;k<=x2.a;k++)
18                 d1.g[i][j]=int((1ll*d1.g[i][j]+1ll*x1.g[i][k]*x2.g[k][j])%mod);
19     return d1;
20 }
21 inline mzls Pow(int n1)
22 {
23     c1.a=c1.b=3;
24     memset(c1.g,0,sizeof(c1.g));
25     for(int i=1;i<=3;i++)
26         c1.g[i][i]=1;
27     while(n1)
28     {
29         if(n1&1) 
30             c1=X(c1,b1);
31         b1=X(b1,b1);
32         n1>>=1;
33     }
34     return c1;
35 }
36 int n,A,B,C,D,P;
37 int main()
38 {
39     int T;
40     scanf("%d",&T);
41     while(T--)
42     {
43         scanf("%d%d%d%d%d%d",&A,&B,&C,&D,&P,&n);
44         if(n<=2)
45         {
46             printf("%d
",n==1?A:B);
47             continue;
48         }
49         memset(a1.g,0,sizeof(a1.g));
50         a1.a=3,a1.b=1;
51         a1.g[1][1]=B,a1.g[2][1]=A,a1.g[3][1]=1;
52         int v;
53         for(int i=3;i<=n;i=v+1)
54         {
55             if(i>P)
56                 v=n;
57             else
58                 v=min(n,P/(P/i));
59             b1.a=3,b1.b=3;
60             b1.g[1][1]=D,b1.g[2][1]=1,b1.g[3][1]=0;
61             b1.g[1][2]=C,b1.g[2][2]=0,b1.g[3][2]=0;
62             b1.g[1][3]=P/i,b1.g[2][3]=0,b1.g[3][3]=1;
63             b1=Pow(v-i+1);
64             a1=X(b1,a1);
65         }
66         printf("%d
",a1.g[1][1]%mod);
67     }
68 }
J-Sequence

 

·场次Ⅷ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m;
 7 bool g[205][205];
 8 int main()
 9 {
10     int T;
11     scanf("%d",&T);
12     while(T--)
13     {
14         memset(g,0,sizeof(g));
15         char s[2]={(,)};
16         bool f=0;
17         scanf("%d%d",&n,&m);
18         if((n%2==1)||(m%2==1))
19         {
20             f=n%2;
21             if(!f)
22             {
23                 for(int i=0;i<n;i++)
24                 {
25                     for(int j=0;j<m;j++)
26                         printf("%c",s[i%2]);
27                     printf("
");
28                 }
29             }
30             else
31             {
32                 for(int i=0;i<n;i++)
33                 {
34                     for(int j=0;j<m;j++)
35                         printf("%c",s[j%2]);
36                     printf("
");
37                 }
38             }
39         }
40         else
41         {
42             if(n<m)
43             {
44                 f=1;
45                 swap(n,m);
46             }
47             for(int i=1;i<=n;i+=2)
48                 for(int j=1;j<=m;j++)
49                     g[i][j]=(1+j)%2;
50             for(int i=2;i<=n;i+=2)
51             {
52                 g[i][1]=0;
53                 for(int j=2;j<m;j++)
54                     g[i][j]=(j%2);
55                 g[i][m]=1;
56             }
57             if(n+m-4>n+m/2-1)
58             {
59                 for(int i=1;i<=m;i++)
60                     g[1][i]=0;
61                 for(int i=1;i<=m;i++)
62                     g[n][i]=1;    
63             }
64             if(!f)
65             {
66                 for(int i=1;i<=n;i++)
67                 {
68                     for(int j=1;j<=m;j++)
69                         printf("%c",s[g[i][j]]);
70                     printf("
");
71                 }
72             }
73             else
74             {
75                 for(int i=1;i<=m;i++)
76                 {
77                     for(int j=1;j<=n;j++)
78                         printf("%c",s[g[j][i]]);
79                     printf("
");
80                 }
81             }
82         }
83     }
84 }
D-Parentheses Matrix

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,squ[5][5],fsqu[5][5];
 7 int main(){
 8     int T;scanf("%d",&T);
 9     while(T--)
10     {
11         scanf("%d",&n);
12         for(int i=1;i<=3;i++)
13         {
14             char str[5]="";scanf("%s",str+1);
15             for(int j=1;j<=3;j++)
16                 squ[i][j]=str[j]-0;
17         }
18         for(int i=0;i<n;i++)
19         {
20             int x;char s[2]="";scanf("%d%s",&x,s);
21             int a,b;
22             switch(x)
23             {
24                 case 1: a=b=1;break;
25                 case 2: a=1;b=2;break;
26                 case 3: a=2;b=1;break;
27                 case 4: a=b=2;break;
28             }
29             memcpy(fsqu,squ,sizeof squ);
30             if(s[0]==C)
31                 squ[a][b]=fsqu[a+1][b],
32                 squ[a+1][b]=fsqu[a+1][b+1],
33                 squ[a][b+1]=fsqu[a][b],
34                 squ[a+1][b+1]=fsqu[a][b+1];
35             else
36                 squ[a][b]=fsqu[a][b+1],
37                 squ[a][b+1]=fsqu[a+1][b+1],
38                 squ[a+1][b]=fsqu[a][b],
39                 squ[a+1][b+1]=fsqu[a+1][b];
40         }
41         for(int i=1;i<=3;i++)
42         {
43             for(int j=1;j<=3;j++)
44                 printf("%d",squ[i][j]);
45             printf("
");
46         }
47     }
48     return 0;
49 }
E-Magic Square

 

·场次Ⅸ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int r,c;
 7 long long mod;
 8 long long dp[85][85][6405];
 9 int main(){
10     int T;scanf("%d",&T);
11     while(T--)
12     {
13         scanf("%d%d%lld",&r,&c,&mod);
14         memset(dp,0,sizeof dp);
15         dp[1][1][1]=1ll;
16         for(int i=1;i<=r;i++)
17             for(int j=(i==1? 2:1);j<=c;j++)
18                 for(int k=1;k<=i*j;k++)
19                 {
20                     int A=0,B=0,C=0;
21                     A=dp[i-1][j][k-1]*j*(r-i+1)%mod;
22                     B=dp[i][j-1][k-1]*i*(c-j+1)%mod;
23                     if(i*j-k+1>=0) C=dp[i][j][k-1]*(i*j-k+1)%mod;
24                     dp[i][j][k]=((A+B)%mod+C)%mod;
25                 }
26         printf("%lld
",dp[r][c][r*c]*r%mod*c%mod);
27     }
28     return 0;
29 }
A-Rikka with Nash Equilibrium

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 ll a1,b1,c1,a2,b2,c2;
 7 bool f;
 8 ll n,m;
 9 ll gcd(ll x,ll y)
10 {
11     return y==0?x:gcd(y,x%y);
12 }
13 int main()
14 {
15     int T;
16     scanf("%d",&T);
17     while(T--)
18     {
19         f=0;
20         scanf("%lld%lld%lld%lld%lld%lld",&a1,&b1,&c1,&a2,&b2,&c2);
21         n=a2*(c1-b1)+b2*(a1-c1)+c2*(b1-a1);
22         m=a2+b2+c2;
23         if(m<0)
24             m=-m,n=-n;
25         if(n<0)
26             n=-n,f=1;
27         ll x1=gcd(n,m);
28         n/=x1,m/=x1;
29         if(f)
30             n=-n;
31         printf("%lld",n);
32         if(m!=1)
33             printf("/%lld",m);
34         printf("
");
35     }
36 }
D-Rikka with Stone-Paper-Scissors

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define mod 998244353
 5 using namespace std;
 6 typedef long long ll;
 7 ll Pow(ll a,ll b)
 8 {
 9     ll ans=1,base=a;
10     while(b!=0)
11     {
12         if(b&1!=0)
13             ans=(ans*base)%mod;
14         base=(base*base)%mod;
15         b/=2;
16     }
17     return ans%mod;
18 }
19 ll a,b,c,d;
20 int main()
21 {
22     int T;
23     scanf("%d",&T);
24     while(T--)
25     {
26         scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
27         printf("%lld
",((b+1)*Pow(2ll,a+c)%mod+d*Pow(2ll,a+c)%mod+((Pow(2ll,b)-b-1)*Pow(2ll,a)%mod)+mod)%mod);
28     }
29 }
K-Rikka with Badminton

 

·场次Ⅹ

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const long long MOD=998244353;
 7 long long A[100005]={1,0,0};
 8 int main(){
 9     for(int i=3;i<=100000;i++)
10         A[i]=(i-3)*A[i-1]%MOD+(i-2)*((2*A[i-2]%MOD+A[i-3])%MOD)%MOD,
11         A[i]%=MOD;
12     int T,x;scanf("%d",&T);
13     while(T--)
14         scanf("%d",&x),
15         printf("%lld
",A[x]);
16     return 0;
17 }
G-Cyclic

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 int a[1000005];
 5 using namespace std;
 6 int main()
 7 {
 8     int x,n,T;
 9     scanf("%d",&T);
10     while(T--)
11     {
12         scanf("%d",&n);
13         memset(a,0,sizeof(a));
14         int len=1;
15         a[1]=1;
16         for(int i=1;i<=n;i++)
17         {
18             x=0;
19             for(int j=1;j<=len;j++)
20             {
21                 a[j]=a[j]*2+x;
22                 x=a[j]/10;
23                 a[j]%=10;
24                 if(x!=0&&j==len)
25                     len++;
26             }
27         }
28         for(int i=len;i>=1;i--)
29             printf("%d",a[i]);
30         printf("
");
31     }
32     return 0;
33 }
H-Pow

 

技术分享图片
 1 /*Lucky_Glass*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N int(2e7)
 6 using namespace std;
 7 int phi[N+10];
 8 long long sum[N+10];
 9 int prime[N+10],tot,ans;  
10 bool mark[N+10];
11 long long Ans[N+5];
12 void getphi()  
13 {  
14    int i,j;  
15    phi[1]=1;  
16    for(i=2;i<=N;i++)
17    {  
18        if(!mark[i])  
19            {  
20              prime[++tot]=i;
21              phi[i]=i-1;
22              }  
23        for(j=1;j<=tot;j++)  
24        {  
25           if(i*prime[j]>N)  break;  
26           mark[i*prime[j]]=1;
27           if(i%prime[j]==0)
28           {  
29              phi[i*prime[j]]=phi[i]*prime[j];break;  
30           }  
31           else  phi[i*prime[j]]=phi[i]*(prime[j]-1); 
32        }  
33    }  
34 }
35 int main(){
36     Ans[1]=0;Ans[2]=1;Ans[3]=2;
37     getphi();
38     long long add=0;
39     for(int i=1;i<=N;i++)
40     {
41         sum[i]=sum[i-1]+phi[i];
42         if(i>=4)
43         {
44             if(i%2==0) add+=phi[i]/2;
45             Ans[i]=sum[i]/2+add;
46         }
47     }
48     int T;scanf("%d",&T);
49     while(T--){
50         int x;scanf("%d",&x);
51         printf("%lld
",Ans[x]);
52     }
53     return 0;
54 }
I-Count

 

技术分享图片
  1 /*Lucky_Glass*/ 
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #include<iostream>
  6 #include<algorithm>
  7 using namespace std;
  8 const int N = 50002;
  9 const int M = 500005;
 10 #define INF 0x3f3f3f3f
 11 struct E
 12 {
 13     int to,cap,cost,flow,next;
 14 }e[2*M];int head[N] , ecnt;
 15 int  pre[N];
 16 int dis[N];
 17 bool vis[N];
 18 int n,m,S,T;
 19 
 20 void Clear()
 21 {
 22     ecnt = 0;
 23     memset(head,-1,sizeof head);
 24 }
 25 
 26 void adde(int fr,int to,int cap,int cost)
 27 {
 28     e[ecnt]=(E){to,cap,-cost,0,head[fr]};
 29     head[fr] = ecnt++;
 30     e[ecnt]=(E){fr,0,cost,0,head[to]};
 31     head[to] = ecnt++;
 32 }
 33 
 34 bool SPFA(int s,int t)
 35 {
 36     memset(vis,0,sizeof vis);
 37     memset(dis,0x3f,sizeof dis);
 38     memset(pre,-1,sizeof pre);
 39     queue <int> q;
 40     q.push(s);dis[s] = 0;vis[s]=1;
 41 
 42     while (!q.empty())
 43     {
 44         int cur = q.front();q.pop();vis[cur] = false;
 45         for (int j=head[cur];j!=-1;j=e[j].next)
 46         {
 47             int to = e[j].to;
 48             if (dis[to] > dis[cur] + e[j].cost && e[j].cap > e[j].flow )
 49             {
 50                 dis[to] = dis[cur] + e[j].cost;
 51                 pre[to] = j;
 52                 if (!vis[to])
 53                 {
 54                     q.push(to);
 55                     vis[to] = true;
 56                 }
 57             }
 58         }
 59     }
 60     return pre[t] != -1;
 61 }
 62 
 63 void MCMF (int s,int t,int &maxflow,int &mincost)
 64 {
 65     maxflow = mincost = 0;
 66     while (SPFA(s,t))
 67     {
 68         int MIN = INF;
 69         for (int j=pre[t]; j!=-1;j=pre[e[j^1].to])
 70         {
 71             MIN = min(MIN,e[j].cap - e[j].flow);
 72         }
 73         for (int j=pre[t]; j!=-1;j=pre[e[j^1].to])
 74         {
 75             e[j].flow += MIN;
 76             e[j^1].flow -= MIN;
 77             mincost += MIN * e[j].cost;
 78         }
 79         maxflow += MIN;
 80     }
 81 }
 82 
 83 #define MAXN 3000
 84 
 85 int L[MAXN+5],R[MAXN+5],Lk[MAXN+5],Kd[MAXN+5];
 86 int main(){
 87     int TT;
 88     cin>>TT;
 89     while(TT--){
 90         Clear();
 91         int nn,mm,kk,ht;
 92         cin>>nn>>mm>>kk>>ht;
 93         for(int i=1;i<=mm;i++)
 94             cin>>L[i]>>R[i]>>Lk[i]>>Kd[i];
 95         S=1,T=kk+mm*2+2;
 96         for(int i=1;i<=kk;i++)
 97             adde(S,i+1,1,0);
 98         for(int i=1;i<=kk;i++)
 99             for(int j=1;j<=mm;j++)
100                 adde(i+1,j+kk+1,1,Lk[j]);
101         for(int i=1;i<=mm;i++)
102             adde(i+kk+1,i+kk+mm+1,1,0);
103         for(int i=1;i<=mm;i++)
104             adde(i+kk+mm+1,T,1,0);
105         for(int i=1;i<=mm;i++)
106             for(int j=1;j<=mm;j++)
107                 if(i!=j&&R[i]<=L[j]){
108                     if(Kd[i]!=Kd[j])
109                         adde(i+kk+mm+1,j+kk+1,1,Lk[j]);
110                     else
111                         adde(i+kk+mm+1,j+kk+1,1,Lk[j]-ht);
112                 }
113         int ans1,ans2;
114         MCMF(S,T,ans1,ans2);
115         cout<<-ans2<<"
";
116     }
117 }
L-Videos

 


 

◇ 前行

2018的多校赛结束了,但学习编程的步伐尚未停止。尚且初三,路还很长,在 AFO 之前至少要做出一些,才对得起5年的学习。NOIP也不早了,多校赛,来年再见吧……


 

The End

Thanks for reading!

- Lucky_Glass

(Tab:如果我有没讲清楚的地方可以直接在邮箱[email protected] email我,在周末我会尽量解答并完善博客~??)

以上是关于ACM之行◇第一站◇ 2018HDU多校赛总结的主要内容,如果未能解决你的问题,请参考以下文章

2019杭电多校赛第四场 HDU6621 K-th Closest Distance 主席树 二分

杭电多校赛三 Find the answer 离散化

HDU6298-2018ACM暑假多校联合训练1001-Maximum Multiple

HDU6298-2018ACM暑假多校联合训练1001-Maximum Multiple

HDU6301-2018ACM暑假多校联合训练1004-Distinct Values

HDU6342-2018ACM暑假多校联合训练4-1011-Problem K. Expression in Memories