Starters 106 (Rated till 5 Stars) div2
\(Guess the winner!\)
场上没想到怎么做,看到题解就会了。因为只能删掉奇数,所以如果原来的数字是个偶数,后手可以跟着先手删掉相同的数字。
因为没写出这道题,下次只能去写 \(div3\) 了。
void solve(){
int n=read(),ans=1;
if(n==1||n%2==0)ans=0;
puts(ans ? "Alice":"Bob");
//puts(ans>0?"Yes":"No");
}
\(Count Possibilities\)
受不了了,两道题都这么简单吗。场上以为拓扑序需要把一条边遍历到底,然后就不会做了。好久没有碰到这样基础的概念了,贴一个定义。
那么一个点有 \(u\) 个一条链上的祖先,有 \(v\) 个一条链上的儿子,在区间 \([u+1,n-v]\)内的所有数字都是可以的。
vector<int>G[N];
int fro[N],nex[N];
void dfs(int u,int fa){
nex[u]=1;
for(auto x:G[u]){
if(x!=fa){
fro[x]=fro[u]+1;
dfs(x,u);
nex[u]+=nex[x];
}
}
}
void solve(){
int n=read();
for(int i=1;i<=n;i++){
G[i].clear();
fro[i]=0;
nex[i]=0;
}
vector<int>r(n+1);
for(int i=1;i<n;i++){
int x=read(),y=read();
G[x].push_back(y);
r[y]++;
}
int root=0;
for(int i=1;i<=n;i++){
if(r[i]==0)root=i;
}
dfs(root,-1);
vector<int>d(n+2);
for(int i=1;i<=n;i++){
d[fro[i]+1]++;
d[n-nex[i]+2]--;
}
for(int i=1;i<=n;i++){
d[i]+=d[i-1];
cout<<d[i]<<" ";
}
cout<<'\n';
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}

浙公网安备 33010602011771号