题意

给定一棵树,给出一些子树的权值关系,问是否矛盾(初始所有结点的下限为1)

思路

设lmin和lmax表示题目给定的限制范围,默认为[1..oo];amin和amax表示实际符合要求的范围。从根节点开始DP,通过子树的amin更新父节点的amin(父节点的amax一定是oo,因为它自身权值任意),判断此时amin和amax与lmin和lmax是否有交集(实际范围),没有则false。

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;

const int N = 10005;
const int oo = 0x7fffffff;
long long lmin[N], lmax[N], amin[N], amax[N];
vector <int> adj[N];

bool dfs(int u){
bool ok = true;
for (int i = 0; i < (int)adj[u].size(); i ++){
int v = adj[u][i];
ok = dfs(v);
if (ok == false)
return false;
amin[u] += amin[v];
amax[u] += amax[v];
}
amin[u] = max(amin[u], lmin[u]);
amax[u] = min(amax[u], lmax[u]);
if (amin[u] <= amax[u]) return true;
else return false;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
for (int i = 1; i <= n; i ++){
adj[i].clear();
lmin[i] = 1;
lmax[i] = oo;
amin[i] = 1;
amax[i] = oo;
}
for (int i = 2; i <= n; i ++){
int tmp;
scanf("%d", &tmp);
adj[tmp].push_back(i);
}
int q;
scanf("%d", &q);
bool res = true;
for (int i = 0; i < q; i ++){
int a, b;
char c;
scanf("%d%*c%c%*c%d", &a, &c, &b);
if (c == '='){
if (b <= lmax[a] && b >= lmin[a]) lmin[a] = lmax[a] = b;
else res = false;
}
else if (c == '<'){
lmax[a] = min((long long)(b - 1), lmax[a]);
}
else if (c == '>'){
lmin[a] = max((long long)(b + 1), lmin[a]);
}
}
if (!res){
puts("Lie");
}
else{
for (int i = 1; i <= n; i ++){
if (lmin[i] > lmax[i]){
res = false;
break;
}
}
if (!res){
puts("Lie");
}
else{
res = dfs(1);
if (res){
puts("True");
}
else{
puts("Lie");
}
}
}
}
return 0;
}
[/cpp]

HDU 4274 Spy's Work (树形DP)的更多相关文章

  1. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  2. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  3. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  4. hdu 4003 Find Metal Mineral 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...

  5. HDU 5758 Explorer Bo(树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...

  6. 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

  8. HDU 4799 LIKE vs CANDLE 树形dp

    题意:有n个人,他们的关系,形成一棵有根树(0是树根,代表管理员),每个人有一个价值 现在有一条微博,每个人要么点赞,要么送一个蜡烛 初始一些人利用bug反转了某些人的操作(赞变蜡烛 或者 蜡烛变成赞 ...

  9. hdu 3586 Information Disturbing(树形dp + 二分)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:   hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...

随机推荐

  1. EventFiringWebDriver网页事件监听(二)

    public class SeleniumDemo { /** * @param args */ public static void main(String[] args) { WebDriver ...

  2. idea 取消控制台的行数限制

    有时候我们要输出大量的信息放到控制台显示,但是多了之后就出现最上面的信息被覆盖删除, 因此就需要设置控制台的显示行数,但在idea7之后的版本中,取消了对控制台行数设置选项, 只能通过更改配置文件进行 ...

  3. 微信小程序组件radio

    表单组件radio:官方文档 Demo Code: Page({ data: { items: [ {name: 'USA', value: '美国'}, {name: 'CHN', value: ' ...

  4. ruby中的顶层方法

    在ruby中写顶层函数的时候,总会有一个问题,self是谁,这些方法是谁的,是什么方法. 如下: p self p self.class def talk p self end talk 输出main ...

  5. 学会JS的this这一篇就够了

    转自:http://www.imooc.com/article/1758 以前看某本书上讲: 掌握了JS中this的用法才算真正的跨过了JS的门槛 我深以为是!但是JS的this却并不是那么简单的内容 ...

  6. 虚拟机Linux系统忘记密码的情况下,修改root或其他用户密码

    使用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于centos7环境进行操作,由于centos的版本是有差异的,继续之前请确定好版本. 步骤 一.重启系统,在开机过程中 ...

  7. Jmeter使用流程及简单分析监控(转载)

    转载自:https://www.cnblogs.com/linglingyuese/archive/2013/03/04/linglingyuese-one.html#undefined 一.安装Jm ...

  8. 判断变量是否为 NaN

    首先要明确 NaN 的一个特性, NaN不能用相等操作符(== 和 ===) 来判断, NaN === NaN 会返回 false: 下面是测试代码: console.log(isNaN('1')) ...

  9. Ubuntu16.04中查看硬盘的型号和读取速度

    最近在测试FTP服务器,上传和下载的速度与很多因数有关,其中,硬盘的读取速度就是其中不同的区别点,我同时用了三台不用的服务器架设FTP服务,一台是出来ftp服务外还含平台其他管理软件,一台是全新的系统 ...

  10. live555笔记_hi3516A

    1.简介 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SI ...