AtCoder Grand Contest 010

A - Addition

翻译

黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数。

题解

洛谷认为此题过水,已被隐藏。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0;bool t=false;char ch=getchar();
  7. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  8. if(ch=='-')t=true,ch=getchar();
  9. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  10. return t?-x:x;
  11. }
  12. int main()
  13. {
  14. int n=read(),s=0;while(n--)s+=read()&1;
  15. puts((s&1)?"NO":"YES");return 0;
  16. }

B - Boxes

翻译

有\(n\)个盒子排成了一圈,第\(i\)个盒子里有\(a_i\)个石头,每次可以选择一个盒子,假定它是\(i\)号,那么对于\(j=[1,n]\),第\((i+j)\)号盒子会被丢掉\(j\)个石头,特别的,第\(i+n\)个盒子就是第\(i\)个盒子。问最终能否让所有盒子都变为空盒子。

题解

我表示不会做。

首先通过所有元素之和可以很容易计算出总共减了多少次。现在考虑相邻两项之间的差,设总共减了\(S\)次,在\(i\)位置减了\(x\)次。那么可以知道\(a_i-a_{i+1}=x*(n-1)-S\)。这样子可以很容易的解出所有的\(x\)来,最后再\(check\)一下是否合法即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define MAX 100100
  5. #define ll long long
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. int n,a[MAX];
  15. ll v[MAX],S,s,tot;
  16. int main()
  17. {
  18. n=read();s=1ll*n*(n+1)/2;
  19. for(int i=1;i<=n;++i)S+=(a[i]=read());a[n+1]=a[1];
  20. if(n==1){puts("YES");return 0;}
  21. if(S%s){puts("NO");return 0;}
  22. S/=s;
  23. for(int i=1;i<=n;++i)
  24. {
  25. v[i]=a[i]-a[i+1]+S;
  26. if(v[i]%n||v[i]<0){puts("NO");return 0;}
  27. tot+=v[i]/n;
  28. }
  29. if(tot!=S)puts("NO");else puts("YES");
  30. return 0;
  31. }

C - Cleaning

翻译

给定一棵树,每个点上有若干个石头,每次可以选择两个叶子节点,将路径上所有的点全部丢掉一块石头,问能否丢掉所有石头。

题解

考虑从叶子开始向上依次满足。如果一个点上有\(a_i\)个石子,那么它的叶子节点中的路径要达到这个点以及它的父亲总共\(a_i\)次。剩下的显然不能够出子树,只能够自己在子树内部匹配,显然子树内部每匹配一对点,那么它出去路径的总数就会减少\(2\)。对于每一个点,首先计算它的子树中最多能够出去的点数,然后计算一下在当前点的最大匹配数,如果当前所有点都出去了还满足不了当前点显然无解,如果当前点能够匹配的全部匹配上了还比当前点多显然也无解,否则恰好当前点需要的数量的路径出去就好了。

我怎么感觉乱搞,搞着搞着就过了呢???

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define MAX 100100
  5. #define ll long long
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. void WA(){puts("NO");exit(0);}
  15. struct Line{int v,next;}e[MAX<<1];
  16. int h[MAX],cnt=1,dg[MAX];
  17. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;++dg[u];}
  18. int n,a[MAX],rt;
  19. void dfs(int u,int ff)
  20. {
  21. int mx=0;ll sum=0;
  22. for(int i=h[u];i;i=e[i].next)
  23. {
  24. int v=e[i].v;if(v==ff)continue;
  25. dfs(v,u);mx=max(mx,a[v]);sum+=a[v];
  26. }
  27. if(dg[u]==1)return;
  28. ll mn=min(sum/2,sum-mx);
  29. if(a[u]>sum)WA();
  30. else
  31. {
  32. if(sum-mn>a[u])WA();
  33. else a[u]-=sum-a[u];
  34. }
  35. }
  36. int main()
  37. {
  38. n=read();
  39. for(int i=1;i<=n;++i)a[i]=read();
  40. if(n==2){puts(a[1]==a[2]?"YES":"NO");return 0;}
  41. for(int i=1;i<n;++i)
  42. {
  43. int u=read(),v=read();
  44. Add(u,v);Add(v,u);
  45. }
  46. for(int i=1;i<=n;++i)
  47. if(dg[i]>1){dfs(rt=i,0);break;}
  48. if(a[rt])WA();else puts("YES");
  49. sreturn 0;
  50. }

D - Decrementing

翻译

见洛谷

题解

先考虑简单情况,如果不考虑除去\(gcd\),那么胜负情况之和奇偶性相关。现在加上\(gcd\),如果\(gcd\)是一个奇数显然对于答案也没有影响。那么唯一对于答案有影响的只有\(gcd\)是一个偶数。显然如果有奇数个偶数的话,显然一定可以控制局面保证永远让自己赢。否则的话考虑先手能够改变一个数,使得自己能赢,然后我们并不知道是否可行,但是我们知道先手一定要去改这个数,所以递归算一下即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. #define MAX 100100
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. int n,s,a[MAX];
  15. bool calc(int p)
  16. {
  17. int s=0,mn=1e9;
  18. for(int i=1;i<=n;++i)s+=a[i]&1,mn=min(mn,a[i]);
  19. if((n-s)&1)return p;
  20. if(s>1||mn==1)return p^1;
  21. for(int i=1;i<=n;++i)a[i]>>=1;
  22. int d=a[1];
  23. for(int i=1;i<=n;++i)d=__gcd(d,a[i]);
  24. for(int i=1;i<=n;++i)a[i]/=d;
  25. calc(p^1);
  26. }
  27. int main()
  28. {
  29. n=read();for(int i=1;i<=n;++i)a[i]=read();
  30. puts(calc(1)?"First":"Second");
  31. return 0;
  32. }

E - Rearranging

翻译

给定一个数列,先手可以任意排列,后手每次可以交换相邻的两个互质的数,先手会让字典序最小,后手会让字典序最大,求最终排列。

题解

先考虑给定一个排列,后手如何让字典序最大。每个数向后面的所有和它不互质的数连边,求一遍拓扑序即可。那么我们现在来考虑如何让先手构造这个排列,首先我们把不互质的数之间连双向边,构成一个图,对于每一个联通块而言,我们显然要拉一条字典序最小的链出来,直接按顺序\(dfs\)一遍就好了。这样子给边定向跑拓扑排序即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<queue>
  9. using namespace std;
  10. #define ll long long
  11. #define MAX 2020
  12. inline ll read()
  13. {
  14. ll x=0;bool t=false;char ch=getchar();
  15. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  16. if(ch=='-')t=true,ch=getchar();
  17. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  18. return t?-x:x;
  19. }
  20. struct Line{int v,next;}e[MAX*MAX];
  21. int h[MAX],cnt=1,dg[MAX];
  22. vector<int> E[MAX];
  23. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;dg[v]+=1;}
  24. inline void ADD(int u,int v){E[u].push_back(v);}
  25. int n;
  26. ll a[MAX];
  27. priority_queue<int> Q;
  28. bool vis[MAX];
  29. void dfs(int u)
  30. {
  31. vis[u]=true;
  32. for(int v:E[u])if(!vis[v])dfs(v),Add(u,v);
  33. }
  34. int main()
  35. {
  36. n=read();
  37. for(int i=1;i<=n;++i)a[i]=read();
  38. sort(&a[1],&a[n+1]);
  39. for(int i=1;i<=n;++i)
  40. for(int j=i+1;j<=n;++j)
  41. if(__gcd(a[i],a[j])>1)ADD(i,j),ADD(j,i);
  42. for(int i=1;i<=n;++i)if(!vis[i])dfs(i);
  43. for(int i=1;i<=n;++i)if(!dg[i])Q.push(i);
  44. while(!Q.empty())
  45. {
  46. int u=Q.top();Q.pop();printf("%lld ",a[u]);
  47. for(int i=h[u];i;i=e[i].next)
  48. if(!--dg[e[i].v])Q.push(e[i].v);
  49. }
  50. return 0;
  51. }

F - Tree Game

翻译

见洛谷

题解

这场怕是博弈/构造疯了,我感觉后面几道题都长得一样的。

判定方法是,如果一个子树必胜,那么必定存在一个它的儿子,满足儿子的权值小于当前点的权值,并且儿子是一个必败节点。这个很显然,因为如果这样一个儿子存在的话,你直接给他移过去,如果对面不服再移回来,你就再给他移过去,移到他服为止,当然了,他也只能服。否则的话不是必胜点,那么是一个必败点咯。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define ll long long
  5. #define MAX 3030
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. int n,a[MAX],sg[MAX];
  15. struct Line{int v,next;}e[MAX<<1];
  16. int h[MAX],cnt=1;
  17. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  18. void dfs(int u,int ff)
  19. {
  20. sg[u]=0;
  21. for(int i=h[u];i;i=e[i].next)
  22. if(e[i].v!=ff&&a[e[i].v]<a[u]){dfs(e[i].v,u);if(!sg[e[i].v])sg[u]=1;}
  23. }
  24. int main()
  25. {
  26. n=read();
  27. for(int i=1;i<=n;++i)a[i]=read();
  28. for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
  29. for(int u=1;u<=n;++u){dfs(u,0);if(sg[u])printf("%d ",u);}
  30. puts("");return 0;
  31. }

AtCoder Grand Contest 010的更多相关文章

  1. Atcoder Grand Contest 010 C - Cleaning 树贪心(伪)

    C - Cleaning 题目连接: http://agc010.contest.atcoder.jp/tasks/agc010_c Description There is a tree with ...

  2. Atcoder Grand Contest 010 B - Boxes 差分

    B - Boxes 题目连接: http://agc010.contest.atcoder.jp/tasks/agc010_b Description There are N boxes arrang ...

  3. AtCoder Grand Contest 010 C:Cleaning

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_c 题目翻译 给你一棵树,每个点有个权值,每次操作可以选择两个度数为\(1\)的结点,然后让这 ...

  4. AtCoder Grand Contest 010 F - Tree Game

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...

  5. AtCoder Grand Contest 010 D - Decrementing

    题目描述 有n个整数,其中第i个数为Ai.这些数字的gcd为1.两人轮流操作,每次操作把一个大于1的数减1,并把所有数除以所有数的最大公约数,最后无法操作者输,求是否先手必胜. 如果当前的sum为偶数 ...

  6. AtCoder Grand Contest 010题解

    传送门 \(A\) 判一下奇数的个数就行了 const int N=1e5+5; int a[N],n,res; int main(){ scanf("%d",&n); f ...

  7. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  8. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  9. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

随机推荐

  1. 极客互联网电视不是噱头,用户体验成创维G7200核心竞争力

        IT产业的迅猛发展带动了智能设备的崛起与繁荣,除已经高度普及的智能手机之外.智能电视.智能可穿戴设备等一大批新兴产品更是让消费者充分感受到了智能科技为生活所带来的变化.以智能电视为例,除了乐视 ...

  2. C# online update demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  3. 20155320 Exp7 网络欺诈防范

    20155320 Exp7 网络欺诈防范 [基础问题回答] (1)通常在什么场景下容易受到DNS spoof攻击 乱点链接或者连公共场合的免费WiFi也容易受到攻击,尤其是那种不需要输入密码直接就可以 ...

  4. 20155339平措卓玛 Exp2 后门原理与实践

    20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...

  5. 【第三课】Centos 7.x系统安装和网络配置以及远程密钥登录

    目录 一.安装CentOS 7.3 二.配置网络 1.使用dhclient命令自动获取ip地址 2.使用ip addr或ifconfig命令查看网卡信息 3.使用route命令查看路由信息 4.通过修 ...

  6. 2_C语言中的数据类型 (九)数组

    1          数组 1.1       一维数组定义与使用 int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的 array[0] = ...

  7. MyBatis的一级缓存和二级缓存简介笔记

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  8. Webpack学习-Webpack初识

    一.前言 webpack 到底是个什么东西呢,看了一大堆的文档,没一个能看懂的,因为上来就是给个module.exports 然后列一大堆配置,这个干啥,那个干啥,没一点用.但凡要用一个东西,一个东西 ...

  9. 上云利器,K8S应用编排设计器之快到极致

    前言在前面的文章中,我们已经提到,华为云有一个上云利器:应用编排设计器.作为华为云应用编排服务与用户沟通的桥梁,设计器坚持用户体验至上的理念,以图形化方式,在鼠标点击之间,助力企业快速上云.优质的交互 ...

  10. LeetCode-51.N皇后

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解 ...