zoukankan      html  css  js  c++  java
  • xsy1531[北京集训2016] 魔法游戏

    orz sjk

    题目大意

    有一棵树,两个人每个节点上有一个权值,两个人轮流选择一个根节点将其权值(k)除以([2,k+1])若除到(0)就删去此根节点,它的儿子变成新根节点,删掉最后一个点赢。求先手还是后手必胜。

    题解

    首先考虑一些只有一个根节点的树,如果以二进制角度看,每次除以([2,k+1])的数相当于拿掉一些二进制位的1,至少拿掉顶上的,可以拿完,这就相当于nim取石头游戏。每个权值相当于有(log_2k+1)个石头。

    那么设(SG(u,i))表示节点(u)(i)个石头的(SG)值,显然叶子节点(u)(SG(u,i)=i),非叶子节点(u)(SG(u,0)=SG(son_1(u),k_1(u)) XOR SG(son_2(u),k_2(u)) XOR...) 根据(SG(u,k)=mex{ SG(u,k)的后继状态 }) 那么 (SG(u,k)=mex { SG(u,0),SG(u,1)...SG(u,k-1)}) 本来(SG(u,0)=0)那么(SG(u,k)=k)现在(SG(u,0))等于一个不为零的数(x)那么(SG(u,1)=0 SG(u,2)=1 ... SG(u,x)=x-1)直到(SG(u,x+1)=x+1).

    
    #include<bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ll;
    const int N=100010;
     
    struct E{
        int t,xt;
    }e[N<<1];
     
    int h[N],cnt;
     
    void adge(int f,int t){
        e[++cnt]=(E){t,h[f]};h[f]=cnt;
    }
     
    ll mi[100] ,val[N];
    int sg[N];
    void dfs(int u,int fa){
        sg[u]=0;
        int x=upper_bound(mi,mi+64,val[u])-mi;
        bool yz=1;
        for(int i=h[u];~i;i=e[i].xt) if(e[i].t!=fa){    
            yz=0;
            dfs(e[i].t,u);
            sg[u]^=sg[e[i].t];
        }
        if(!yz) sg[u]=x-(x<=sg[u]);
        else sg[u]=x;
    }
     
    int main(){
        memset(h,cnt=-1,sizeof(h));
        mi[0]=1;
        for(int i=1;i<=63;i++) mi[i]=mi[i-1]*2;
        int n;  
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++) scanf("%llu",&val[i]);
            for(int i=1;i<n;i++){
                int a,b;
                scanf("%d%d",&a,&b);
                adge(a,b);
                adge(b,a);
            }
            dfs(0,0);
            puts(sg[0]?"Alice":"Marisa");
            for(int i=0;i<n;i++) h[i]=-1;
            cnt=-1;
        }
        return 0;
    }
    
    
  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/lsq647vsejgfb/p/9694382.html
Copyright © 2011-2022 走看看