AtCoder Grand Contest 010

A - Addition

翻译

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

题解

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

#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int main()
{
int n=read(),s=0;while(n--)s+=read()&1;
puts((s&1)?"NO":"YES");return 0;
}

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\)一下是否合法即可。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX];
ll v[MAX],S,s,tot;
int main()
{
n=read();s=1ll*n*(n+1)/2;
for(int i=1;i<=n;++i)S+=(a[i]=read());a[n+1]=a[1];
if(n==1){puts("YES");return 0;}
if(S%s){puts("NO");return 0;}
S/=s;
for(int i=1;i<=n;++i)
{
v[i]=a[i]-a[i+1]+S;
if(v[i]%n||v[i]<0){puts("NO");return 0;}
tot+=v[i]/n;
}
if(tot!=S)puts("NO");else puts("YES");
return 0;
}

C - Cleaning

翻译

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

题解

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

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

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
void WA(){puts("NO");exit(0);}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1,dg[MAX];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;++dg[u];}
int n,a[MAX],rt;
void dfs(int u,int ff)
{
int mx=0;ll sum=0;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs(v,u);mx=max(mx,a[v]);sum+=a[v];
}
if(dg[u]==1)return;
ll mn=min(sum/2,sum-mx);
if(a[u]>sum)WA();
else
{
if(sum-mn>a[u])WA();
else a[u]-=sum-a[u];
}
}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
if(n==2){puts(a[1]==a[2]?"YES":"NO");return 0;}
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=1;i<=n;++i)
if(dg[i]>1){dfs(rt=i,0);break;}
if(a[rt])WA();else puts("YES");
sreturn 0;
}

D - Decrementing

翻译

见洛谷

题解

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

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,s,a[MAX];
bool calc(int p)
{
int s=0,mn=1e9;
for(int i=1;i<=n;++i)s+=a[i]&1,mn=min(mn,a[i]);
if((n-s)&1)return p;
if(s>1||mn==1)return p^1;
for(int i=1;i<=n;++i)a[i]>>=1;
int d=a[1];
for(int i=1;i<=n;++i)d=__gcd(d,a[i]);
for(int i=1;i<=n;++i)a[i]/=d;
calc(p^1);
}
int main()
{
n=read();for(int i=1;i<=n;++i)a[i]=read();
puts(calc(1)?"First":"Second");
return 0;
}

E - Rearranging

翻译

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

题解

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define MAX 2020
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX*MAX];
int h[MAX],cnt=1,dg[MAX];
vector<int> E[MAX];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;dg[v]+=1;}
inline void ADD(int u,int v){E[u].push_back(v);}
int n;
ll a[MAX];
priority_queue<int> Q;
bool vis[MAX];
void dfs(int u)
{
vis[u]=true;
for(int v:E[u])if(!vis[v])dfs(v),Add(u,v);
}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
sort(&a[1],&a[n+1]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
if(__gcd(a[i],a[j])>1)ADD(i,j),ADD(j,i);
for(int i=1;i<=n;++i)if(!vis[i])dfs(i);
for(int i=1;i<=n;++i)if(!dg[i])Q.push(i);
while(!Q.empty())
{
int u=Q.top();Q.pop();printf("%lld ",a[u]);
for(int i=h[u];i;i=e[i].next)
if(!--dg[e[i].v])Q.push(e[i].v);
}
return 0;
}

F - Tree Game

翻译

见洛谷

题解

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

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

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 3030
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX],sg[MAX];
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
void dfs(int u,int ff)
{
sg[u]=0;
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff&&a[e[i].v]<a[u]){dfs(e[i].v,u);if(!sg[e[i].v])sg[u]=1;}
}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
for(int u=1;u<=n;++u){dfs(u,0);if(sg[u])printf("%d ",u);}
puts("");return 0;
}

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. Linux服务-openssh

    目录 1. 使用 SSH 访问远程命令行 1.1 OpenSSH 简介 1.2 SSH 版本 1.3 SSH 认证方式 1.4 openSSH 的工作模式 1.5 Secure Shell 示例 1. ...

  2. 【SQL】MaxComputer常用SQL与注意小结

    MaxComputer常用SQL 1.建表 CREATE TABLE dwd_tfc_ctl_signal_phasedir ( cust_inter_id STRING COMMENT '客户路口I ...

  3. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

  4. 20155304田宜楠《网络对抗技术》Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序 ...

  5. Linux rhel7 无线网络配置

    前言: 手提新装rhel7, ifconfig 发现只有lo 怎么办? 1. 检查网卡驱动装了没有: nmcli -a|grep wlp\ 如果没安装: a. lspci|grep Wireless ...

  6. spring使用 RestTemplate 来进行http访问

    https://www.jianshu.com/p/2b03a812d588 https://my.oschina.net/sdlvzg/blog/1800395 异常:org.springframe ...

  7. [CF963E]Circles of Waiting[高斯消元网格图优化+期望]

    题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...

  8. 手撸orm

    ORM简介 ORM即Object Relational Mapping,全称对象关系映射.当我们需要对数据库进行操作时,势必需要通过连接数据.调用sql语句.执行sql语句等操作,ORM将数据库中的表 ...

  9. 记录一次Docker For Windows10镜像加速器配置

    1.访问https://www.daocloud.io 注册账号 2.访问资源->加速器,或者直接访问网址https://www.daocloud.io/mirror,页面中间有加速配置,例如我 ...

  10. cbuild-一个创建和管理C++项目的工具

    cbuild-一个创建和管理C++项目的工具 介绍: 这是个人开发的一个管理C++项目的工具,用shell脚本编写. 可能会不定期更新,也欢迎大家一起完善. 当前开发版本0.5.各版本功能如下: ve ...