nefu 1879 Alice和Bob的分组游戏(二)

#include <bits/stdc++.h>
using namespace std;
int n,m,x,t,sum;
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m)
    {
        sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x;//x>=1
            if(m==2)
            {
                if(i&1)t=0;
                else t=1;
            }
            else t=(x-1)/(m-1);
            sum^=t;
        }
        if(sum)printf("Alice\n");
        else printf("Bob\n");
    }
    return 0;
}

nefu 1875 库特的家谱

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,x,y,s,cnt,a[N],b[N],vis[N],dep[N],head[N],f[N][21];
struct node
{
    int to,next;
}e[N<<1];
void add(int x,int y)
{
    e[cnt].to=y;
    e[cnt].next=head[x];
    head[x]=cnt++;
}
void dfs(int u,int father)
{
    dep[u]=dep[father]+1;
    f[u][0]=father;
    for(int i=1;i<=20;i++)
        f[u][i]=f[f[u][i-1]][i-1];
    for(int i=head[u];i!=-1;i=e[i].next)
    {
        int v=e[i].to;
        if(v!=father)dfs(v,u);
    }
}
int lca(int x,int y)
{
    for(int i=20;i>=0;i--)
        if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
    return f[x][0];
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
    memset(b,0,sizeof(b));
    for(int i=1;i<=n-1;i++)
    {
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    for(int i=1;i<=n;i++)
        for(int j=head[i];j!=-1;j=e[j].next)
            b[e[j].to]++;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(b[i]==a[i])s=i;
    }
    dfs(s,0);
    cin>>q;
    while(q--)
    {
        cin>>x>>y;
        int flag=0;
        if(dep[x]>dep[y])
        {
            for(int i=20;i>=0;i--)
            {
                if(dep[f[x][i]]>=dep[y])x=f[x][i];
                if(x==y){printf("SSSS\n");flag=1;break;}//y是x的祖先
            }
            if(flag==0)printf("%d\n",lca(x,y));
        }
        else
        {
            swap(x,y);
            for(int i=20;i>=0;i--)
            {
                if(dep[f[x][i]]>=dep[y])x=f[x][i];
                if(x==y){printf("ZZZZ\n");flag=1;break;}//x是y的祖先
            }
            if(flag==0)printf("%d\n",lca(x,y));
        }
    }
    return 0;
}

nefu 1869 阿库娅数数

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s;
long long ans,cnt,tmp,sum[N],a[N];
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>s)
    {
        cnt=0;ans=0;
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        for(int i=s.length()-1;i>=0;i--)
        {
            if(s[i]=='0')cnt++;
            else {a[i]=cnt;
            ans+=(cnt+1)*cnt/2;
            cnt=0;}
        }
        ans+=(cnt+1)*cnt/2;
        tmp=0;sum[tmp]=1;
        for(int i=0;i<s.length();i++)
        {
            tmp=(tmp+s[i]-'0')%3;
            sum[tmp]++;
            if(s[i]!='0'&&a[i]>=2)ans+=(sum[tmp]-1)*(a[i]-1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}