HDU5996:dingyeye loves stone

题目链接:dingyeye loves stone

题意:给出一棵树,树上的每个节点都有石子若干,

两人博弈,每次操作都可以把任意节点的任意石子数转移到它的父亲节点,

若无法操作则输,给出树上的节点及石子数,问先手是否能赢

分析:“阶梯博弈”,若深度为偶数的节点,对方移多少石子,我们就移多少。故偶数节点可忽略不计

接下来只要异或深度为奇数的节点石子数即可

感想:深度不会求,dfs不会写,我真菜

第一种方法.

记录每个节点的子节点,dfs遍历所有节点,若深度为奇则异或

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<vector>
 6 using namespace std;
 7
 8 typedef long long ll;
 9 int t,n,x,value[100010],dep[100010];
10
11 ll ans;
12
13 vector<int>g[100010];
14 void dfs(int i,int d)
15 {
16     if(d) ans^=value[i];
17     for(int j=0;j<g[i].size();++j) dfs(g[i][j],d^1);
18 }
19
20 int main()
21 {
22     for(scanf("%d",&t);t--;)
23     {
24         scanf("%d",&n);
25         for(int i=0;i<n;++i) g[i].clear();
26         for(int i=1;i<n;++i)
27         {
28             scanf("%d",&x);
29             g[x].push_back(i);
30         }
31         //memset(censhu,0,sizeof(censhu));
32         //fa[0]=0;
33         for(int i=0;i<n;++i) scanf("%d",value+i);ans=0;
34         dfs(0,0);
35         if(ans) puts("win");else puts("lose");
36     }
37     return 0;
38 }
39
40 /*
41 int main()
42 {
43     for(scanf("%d",&t);t--;)
44     {
45         scanf("%d",&n);
46         memset(dep,0,sizeof(dep));
47         for(int i=1;i<n;++i)
48         {
49             scanf("%d",&x);
50             dep[i]=dep[x]+1;
51         }
52         //memset(censhu,0,sizeof(censhu));
53         //fa[0]=0;
54         ans=0;
55         for(int i=0;i<n;++i) {scanf("%d",value+i);if(dep[i]&1) ans^=value[i];}
56         if(ans) puts("win");else puts("lose");
57     }
58     return 0;
59 }
60 */

第二种方法.

读入每个节点的父亲时,记录深度,题目保证父亲出现在子节点前

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<vector>
 6 using namespace std;
 7
 8 typedef long long ll;
 9 int t,n,x,value[100010],dep[100010];
10
11 ll ans;
12 /*
13 vector<int>g[100010];
14 void dfs(int i,int d)
15 {
16     if(d) ans^=value[i];
17     for(int j=0;j<g[i].size();++j) dfs(g[i][j],d^1);
18 }
19
20 int main()
21 {
22     for(scanf("%d",&t);t--;)
23     {
24         scanf("%d",&n);
25         for(int i=0;i<n;++i) g[i].clear();
26         for(int i=1;i<n;++i)
27         {
28             scanf("%d",&x);
29             g[x].push_back(i);
30         }
31         //memset(censhu,0,sizeof(censhu));
32         //fa[0]=0;
33         for(int i=0;i<n;++i) scanf("%d",value+i);ans=0;
34         dfs(0,0);
35         if(ans) puts("win");else puts("lose");
36     }
37     return 0;
38 }
39 */
40
41 int main()
42 {
43     for(scanf("%d",&t);t--;)
44     {
45         scanf("%d",&n);
46         memset(dep,0,sizeof(dep));
47         for(int i=1;i<n;++i)
48         {
49             scanf("%d",&x);
50             dep[i]=dep[x]+1;
51         }
52         //memset(censhu,0,sizeof(censhu));
53         //fa[0]=0;
54         ans=0;
55         for(int i=0;i<n;++i) {scanf("%d",value+i);if(dep[i]&1) ans^=value[i];}
56         if(ans) puts("win");else puts("lose");
57     }
58     return 0;
59 }

时间: 2024-12-22 00:32:31

HDU5996:dingyeye loves stone的相关文章

hdu 5996 dingyeye loves stone(博弈)

题目链接:hdu 5996 dingyeye loves stone 题意: 给你一棵树,树的每一个节点有a[i]个石子,每个人可以将这个节点的石子移向它的父亲,如果没有合法操作,那么就算输,现在给你当前的局面,问你能否赢 题解: 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石子,移动一次即进入偶深度的点. 时空复杂度O(n). 1 #include<b

HDU 5996 dingyeye loves stone [阶梯Nim]

dingyeye喜欢和你玩石子游戏. dingyeye有一棵nn个节点的有根树,节点编号为00到n−1n−1,根为00号节点.游戏开始时,第ii个节点上有a[i]a[i]个石子.两位玩家轮流操作,每次操作玩家可以选择一个节点,并将该节点上的一些石子(个数不能为00)移动到它的父亲节点上去.如果轮到某位玩家时,该玩家没有任何合法的操作可以执行,则判负. 你在游戏中执先手,你想知道当前局面你能否必胜. 裸题... #include <iostream> #include <cstdio>

HDU 5996:dingyeye loves stone(阶梯博弈)

http://acm.hdu.edu.cn/showproblem.php?pid=5996 题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输. 思路:比赛的时候想的是对于每一个深度为dep的结点,可以转化为dep堆同样的深度为1的结点,然后就不会了,忘了最后异或起来偶数可以抵消,相当于对方移动,我方也跟着移动对方上一个回合移动的石子,所以最后只要考虑深度为奇数的结点. 1 #include <cstdio> 2 #include <algorithm&

HDU 5996 dingyeye loves stone ---BestCoder Round #90

题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石子,移动一次即进入偶深度的点. 时空复杂度O(n). 用vector存搜一下就行. #include <cstdio> #include <iostream> #include <vector> #include <cstring> using namespac

BestCoder Round #90

有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先) T1 Kblack loves flag 用两个布尔数组分别维护每个行/列是否被插过旗帜,最后枚举每一行.列统计答案即可.空间复杂度O(n+m),时间复杂度O(n+m+k). T2 dingyeye loves stone 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必

HDOJ 4248 A Famous Stone Collector DP

DP: dp[i][j]前i堆放j序列长度有多少行法, dp[i][j]=dp[i-1][j] (不用第i堆), dp[i][j]+=dp[i-1][j-k]*C[j][k] (用第i堆的k个石头) A Famous Stone Collector Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 845    Accepted Su

[ACM] hdu 4248 A Famous Stone Collector (DP+组合)

A Famous Stone Collector Problem Description Mr. B loves to play with colorful stones. There are n colors of stones in his collection. Two stones with the same color are indistinguishable. Mr. B would like to select some stones and arrange them in li

POJ 1740 A New Stone Game

A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5453   Accepted: 2989 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob

Lifting the Stone(hdoj1115)

Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6104    Accepted Submission(s): 2546 Problem Description There are many secret openings in the floor which are covered by a big