码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5963 朋友(找规律博弈)

时间:2017-09-01 14:31:09      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:php   ret   ons   math   break   hdu   scanf   algo   color   

http://acm.hdu.edu.cn/showproblem.php?pid=5963

题意:

技术分享

 

思路:

我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操作,也就是1次就可以,而别的都需要偶数次操作才能把这条链上的边权全变成0,次数为$2^{n-1}$,n为边的层数。所以我们只要统计与根相连的有多少条权值为1的边即可。

需要改权值的时候搜索一下找到边然后修改。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long ll;
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const int maxn=40000+5;
16 
17 int n, m;
18 vector<pll> G[maxn];
19 
20 bool judge(int root)
21 {
22     int tmp=0;
23     for(int i=0;i<G[root].size();i++)
24     {
25         int v=G[root][i].first;
26         if(G[root][i].second==1)  tmp++;
27     }
28     if(tmp&1)  return true;
29     else return false;
30 }
31 
32 int main()
33 {
34     //freopen("in.txt","r",stdin);
35     int T;
36     scanf("%d",&T);
37     while(T--)
38     {
39         scanf("%d%d",&n,&m);
40         for(int i=1;i<=n;i++)  G[i].clear();
41         for(int i=1;i<n;i++)
42         {
43             int u,v,w;
44             scanf("%d%d%d",&u,&v,&w);
45             G[u].push_back(make_pair(v,w));
46             G[v].push_back(make_pair(u,w));
47         }
48         while(m--)
49         {
50             int op, root;
51             scanf("%d",&op);
52             if(op==0)
53             {
54                 scanf("%d",&root);
55                 if(judge(root))  puts("Girls win!");
56                 else puts("Boys win!");
57             }
58             else
59             {
60                 int u,v,w;
61                 scanf("%d%d%d",&u,&v,&w);
62                 for(int i=0;i<G[u].size();i++)
63                 {
64                     int vv=G[u][i].first;
65                     if(vv==v)  {G[u][i].second=w;break;}
66                 }
67                 for(int i=0;i<G[v].size();i++)
68                 {
69                     int uu=G[v][i].first;
70                     if(uu==u)  {G[v][i].second=w;break;}
71                 }
72             }
73         }
74     }
75     return 0;
76 }

 

HDU 5963 朋友(找规律博弈)

标签:php   ret   ons   math   break   hdu   scanf   algo   color   

原文地址:http://www.cnblogs.com/zyb993963526/p/7462810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!