hdu 4274 Spy's Work
2016-04-09 10:53
323 查看
只要维护一个最大值一个最小值就可以了。
注意最小值可以从子节点往上推,最大值不行。
注意最小值可以从子节点往上推,最大值不行。
#pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<algorithm> using namespace std; void fre(){freopen("t.txt","r",stdin);} #define ls o<<1 #define rs o<<1|1 #define MS(x,y) memset(x,y,sizeof(x)) #define debug(x) printf("%d",x); typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; const int MAXN = 10010; LL Min[MAXN],Max[MAXN]; int n; vector<int>e[MAXN]; void init() { for(int i = 0; i <= n; ++i) e[i].clear(), Min[i] = 1, Max[i] = 1000000000000ll; } bool dfs(int u) { int v; LL umin = 1; for(int i = 0; i < e[u].size(); ++i) { v = e[u][i]; if(!dfs(v)) return 0; umin += Min[v]; } if(umin > Min[u]) Min[u] = umin; if(Min[u] > Max[u]) return 0; return 1; } int main() { fre(); int u,v,m; char ope[5]; while(~scanf("%d",&n)) { init(); for(int i = 2; i <= n; ++i) { scanf("%d",&u); e[u].push_back(i); } scanf("%d",&m); while(m--) { scanf("%d%s%d",&u,ope,&v); if(ope[0] == '>') if(++v > Min[u]) Min[u] = v; else if(ope[0] == '<') if(--v < Max[u]) Max[u] = v; else { if(v > Min[u]) Min[u] = v; if(v < Max[u]) Max[u] = v; } } if(dfs(1)) printf("True\n"); else printf("Lie\n"); } }
相关文章推荐
- 父、子进程同步的5个例程的两种实现方式
- 细节要多注意
- shell 调试手段总结
- iOS开发之网络编程:Socket网络编程
- python中if __name__ == '__main__': 的解析
- scanf,输入 Go west, young man!
- poj 2524 Ubiquitous Religions
- C#获取路径方法
- A + B Problem
- LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题
- Main 程序的入口要做哪些事情
- 酷播高清视频点播系统
- HDU 1014:Uniform Generator
- LABVIEW调用捷通TTS ActiveX控件实现中文文本转语音
- Counting Bobs!
- Android中AutoCompleteTextView的用法
- BurpLoader 初次体验
- linux防火墙添加例外
- 子数组之和
- Block 使用注意点