现在的做题状态好差啊,题目没思路,就算有思路了写对的概率也好小啊,总是这里那里出现问题。前天上课,老师在上面讲我在下面敲代码,写了好久,那个比赛就写了最水的一题,连自己的模板都忘记用了!无语了!!!!
题意:给定一个职员的关系,也就是一个树,和以某一个节点为根的子树的条件,判断这些条件是否都成立!
昨天看这道题的时候似乎题意都没有真正理解,然后就是肯定也没写,还一直以为是差分约束。。。
解题思路: 树形dp,建树,对于每个节点,有一个最大值和最小值,如果最小值大于最大值那么肯定是不会满足的,要注意,最小值最小为1,为此贡献了n次wa啊!
/
// File Name: 4274.cpp
// Author: wang
// mail:
// Created Time: 2013-9-12 20:47:59
/
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<iostream>
#include<queue>
#include <map>
using namespace std;
typedef long long ll;
#define INF (INT_MAX/10)
#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define repd(i, a, b) for (int i=(a); i>=(b); --i)
#define clr(ar,val) memset(ar, val, sizeof(ar))
#define N 10005
#define inf INT_MAX
struct node
{
int y,pre;
};
node a[N*2];
int n,len,m;
int up[N],down[N];
int pre[N];
void addpage(int x,int y)
{
a[len].pre=pre[x];
a[len].y=y;
pre[x]=len++;
}
bool dfs(int s)
{
int sum=0;
for(int i=pre[s]; i!=-1; i=a[i].pre)
{
int y=a[i].y;
if(dfs(y)==false) return false;
sum+=down[y];
}
down[s]=max(sum+1,down[s]);//最小的
if(down[s]>up[s]) return false;
return true;
}
int main()
{
int x,y; char s[2];
while(scanf("%d",&n)!=EOF)
{
len=0;
memset(pre,-1,sizeof(pre));
repf(i,2,n){
scanf("%d",&x);
addpage(x,i);
}
scanf("%d",&m);
repf(i,1,n) up[i]=inf,down[i]=1;
while(m--)
{
scanf("%d%s%d",&x,s,&y);
if(s[0]=='=')
up[x]=down[x]=y;
else if(s[0]=='<')
up[x]=min(up[x],y-1);
else
down[x]=max(down[x],y+1);
}
if(dfs(1))
printf("True\n");
else
printf("Lie\n");
}
return 0;
}