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");
}
posted @ 2023-11-02 22:23  EdGrass  阅读(41)  评论(0)    收藏  举报