HDU 5963 朋友(找规律博弈)

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 }
时间: 2024-08-02 15:13:39

HDU 5963 朋友(找规律博弈)的相关文章

题解报告:hdu 1564 Play a game(找规律博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1564 Problem Description New Year is Coming! ailyanlu is very happy today! and he is playing a chessboard game with 8600.The size of the chessboard is n*n. A stone is placed in a corner square. They play

2017EC Final L SOS——找规律&amp;&amp;博弈

题意 有n个格子排成一行,两人轮流填,可填入"S"或"0",先得到"SOS"的人胜:如果全部填完也没有出现"SOS",则为平局.请判断是先手胜.后手胜还有平局. 分析 第一次知道,博弈题也能打表找规律. 简单地说就是,给DFS一个返回值,返回三个不同的值分别代表先手胜.后手胜和平局. 枚举当前填的格子,如果出现后手出现必败态,先手胜,直接返回:如果后手出现平局,则存在平局:否则,后手败. (好像超内存了...问题不大 不难得出

Calendar Game(找规律+博弈)

A - Calendar Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 1024 Appoint description:  System Crawler  (2015-08-02) Description Adam and Eve enter this year's ACM International Collegiate Pr

HDU 2147 找规律博弈

题目大意: 从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜 到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关 开始写了一个把所有情况都计算的打表 for(int i=n ; i>=1 ; i--){            for(int j=1 ; j<=m ; j++){                bool flag1 = p[i][j-1];                bool flag2 = p[i+1][j];  

HDU 1564 找规律博弈

题目大意是: 从n*n的方格角落的一个起点出发,每次移到上下左右一个未曾到达过的位置,谁不能走了谁就输了 想了好久都想不出,看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发,将所有方格两两连接,如果为偶数,那么这个起点会有一个对应方格与其两两连接,那么起点说明已经占据了一格 那么每次先手只要走到当前格对应相连的格子上就保证可以有路,那么后手就输了 反之n为基数,那么没有点与起点相连,说明先手必然走入一个新的1*2的小长条中,那么后手始终有1*2的小长条的方格与其对应,所以

hdu 1525 找规律博弈 (根据每一步的必然性以及可选择性决策)

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 给出两个数,a和b,将大的数中,减去若干b的倍数,最终有一个数为0的话就胜了. 分析:  两个数a和b, 不妨设(a > b),总会出现的一个局面是b,a%b,这是必然的,如果a>=b&&a<2*b,那么只有一种情况,直接到b,a%b.否则有多种情况. a / b == 1   即a Ε [b , 2b)  , 下一步 只能到达   (b , a  - b) a

最简单的博弈论——HDU - 5963 朋友 (博弈)

OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作. 当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然后找出这个点到根节点的简单路径,将路径上所有边的权值翻转(即0变成1,1 变成0 ). 当一方无法操作时(即所有边的边权均为0),另一方就获得了胜利. 如果在双方均采用最优策略的情况下

HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))

朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然

hdu 5963 朋友(2016ccpc 合肥站 C题)

朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 215    Accepted Submission(s): 137 Problem Description B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下