BOJ 427. 学姐逗学弟
来源:互联网 发布:西门子802d编程 编辑:程序博客网 时间:2024/05/01 07:24
题意:给出一个树,在树上的几个节点上放若干个石子。两个人分别将石子移动到该节点的子树,知道所有石子无法移动。无法决策的人输。
思路:EverySG游戏,我们可以算出每个石子,即每个子游戏的结束时的步数,用最长的步数去判断谁赢。奇数步,先手赢。偶数步,后手赢。
坑:脑残的把EverySG函数的返回值当步数了。。。。。
代码如下:
#include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std;const int MAX = 100100;int N,M;vector<int> G[MAX];int sg[MAX];int step[MAX];int EverySG(int cur){ if(sg[cur] >= 0) return sg[cur]; if(G[cur].size() == 0) return sg[cur] = step[cur] = 0; int ma = 0, mi = 0x3f3f3f3f; for(int i = 0,sz = G[cur].size() ; i < sz; ++i){ int next = G[cur][i]; if(EverySG(next) == 0){ sg[cur] = 1; ma = max(ma,step[next]); } else mi = min(mi,step[next]); } if(sg[cur] == 1){ step[cur] = ma + 1; return 1; } step[cur] = mi +1; return sg[cur] = 0;}int main(void){ int T; scanf("%d", &T); while(T--){ memset(sg,-1,sizeof(sg)); scanf("%d %d",&N, &M); for(int i = 1 ; i <= N; ++i) G[i].clear(); for(int i = 2; i <= N; ++i){ int fa; scanf("%d", &fa); G[fa].push_back(i); } int ans = 0; for(int i = 0 ; i < M; ++i){ int p; scanf("%d", &p); EverySG(p); ans = max(ans,step[p]); } if(ans & 1) puts("MengMengDa!"); else puts("So sad..."); } return 0;}
0 0
- BOJ 427. 学姐逗学弟
- BOJ 415. 学姐的学弟
- BOJ 288
- BOJ 394
- BOJ 396
- BOJ 385
- BOJ 519
- BOJ 93
- BOJ 204
- BOJ 672
- BOJ 1454
- BOJ 387
- BOJ 652
- BOJ 1452
- BOJ 1461
- BOJ 1450
- 7.16 D kAri427 学姐逗学弟——every-SG
- 2014新生暑假个人排位赛02 D. 学姐逗学弟
- 2014新生暑假个人排位赛05 B. 立方体
- Emmet for Dreamweaver:HTML/CSS代码快速编写神器
- HDU1431 素数回文 【暴力】
- linux vim 常用操作笔记
- 微指令设计
- BOJ 427. 学姐逗学弟
- 使用freeimage缩放新图片,拷贝带透明层图片到基础图片
- 函数调用
- Codeforces Round #179 (Div. 1)-A. Greg and Array
- UVa11408 - Count DePrimes(线性筛法)
- android 线程研究一(AsyncTask源码深度剖析)
- IT人除了写代码,也要写文字
- wiki 1255 搭积木
- mysql编码选择注意事项