2020牛客寒假算法基础集训营4 F.树上博弈
题意:树上玩游戏,跳方格?????????差不多就是给一个树,上面有节点,然后问有多少种情况牛牛是必赢的
题解:我们可以看下如果两人之间距离为奇数那么,一定输,因为奇数点可以把两人之间的距离缩减为1,而两人之间的距离为1,那么先手的牛牛先走(必须走),而牛妹走到牛牛的位置上,所以....铁定输
如果两人之间距离为偶数,那么牛牛先走,按照上面奇数的推论,此时变相等于牛妹为先手,而且先手必输,所以牛牛必赢
所以就是统计两人之间的偶数距离有多少种情况
然后根据树的性质:到节点到根结节的距离为奇数点的节点,那么这些节点到所有的奇数节点的距离都为偶数,同样所有的偶数节点到其他偶数节点的距离也为偶数
#include <bits/stdc++.h> #define debug(x) cerr<<#x<<'='<<x<<endl #define set0(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; typedef pair<ll,ll> pii; template<typename T> void read(T &x){ x = 0;char ch = getchar();ll f = 1; while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();} while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f; } template<typename T, typename... Args> void read(T &first, Args& ... args) { read(first); read(args...); } int n,q,x,y,depth[1000010]; ll cnt[2]; int main() { read(n); depth[1] = 0; cnt[0] = 1; for(int i=2;i<=n;i++){ int cc; read(cc); depth[i] = depth[cc]^1; cnt[depth[i]]+=1; } cout<<cnt[0]*(cnt[0]-1)+cnt[1]*(cnt[1]-1)<<endl; return 0; }