题目的意思比较坑爹,大意就是1,0,-1表示的是到这个点的话第一个人会赢
我们就知道其实第一个人希望越大越好
第二个人希望越小越好
那么就变成博弈搜索。
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<sstream>
#include<iostream>
using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define bug puts("Fuck");
#define LL long long
#define pb push_back
#define mp make_pair
#define nMax 2010
#define eps 1e-8
#define inf 0x7fffffff
int to[nMax],first[nMax],nxt[nMax],w[nMax],e,vis[nMax];
void addadge(int u,int v){
to[e]=v;nxt[e]=first[u];first[u]=e;e++;
}
int dfs(int u,int cur){
if(w[u]!=-2) return w[u];
if(cur==0) {
int f=-1;
for(int i=first[u];i!=-1;i=nxt[i]){
int k=dfs(to[i],cur^1);
f = max(f,k);
}
return f;
}else {
int f=1;
for(int i=first[u];i!=-1;i=nxt[i]){
int k=dfs(to[i],cur^1);
f = min(f,k);
}
return f;
}
}
int main(){
#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
int n;char s[nMax];
scanf("%d",&n);
memset(first,-1,sizeof(first));
//memset(vis,0,sizeof(vis));
FOR(i,1,n) w[i]=-2;
e=0;
for(int i=2,fa;i<=n;i++){
scanf("%s%d",s,&fa);
addadge(fa,i);
if(s[0]=='L') {
scanf("%d",&fa);
w[i]=fa;
}
}
int ans=dfs(1,0);
if(ans==1) printf("+1\n");
else printf("%d\n",ans);
return 0;
}