1040: [ZJOI2008]骑士
首先是因为想学仙人掌图才来先拿这题热热身,结果&……竟然调了一个晚上我的傻叉!(其中一大半的时候是在郁闷hzwer和Greens的代码画风不一样,后来才发现一个用拓扑一个用树dp23333,以后代码坚决自己解决)
贴一下hzwer大神的题解吧:http://hzwer.com/1729.html
以及云的代码:http://hi.baidu.com/greencloud/archive/tag/dp?page=4
treedp:
首先我们发现一个骑士只会觉得另一个骑士丑(233),然后我们想到了树,因为树上每个点只有一个入度,所以边建为从被讨厌的人指向讨厌他的。但是会出现环的情况……这时候一定是在树根那里有个环!(画图就可以发现一定是这样,如果不是在树根那么就会有出现入度为2的情况,显然不可能……)。然后就先处理出不再环上的每个点与各自的子树的情况(dp[x,0]表示x取,dp[x,1],表示x不取),由于树上只有一个环,so那些环上的点的儿子们如果不再环上那子树一定是棵树不会出现环,so是可以用treedp递归处理出来。(然后拓扑的方法就相反啦,边是从某个人指向这个人讨厌的人,那么那些入度为0的点就是老好人,然后从这些老好人开始推,找老好人讨厌的人&……算过去)
然后就是处理环上怎么取最大的问题啦。
破环成链,这时候就先不考虑链头与链尾不能同时取的情况,跑一边dp,然后再来考虑链头和链尾的限制,也就是链头取的时候链尾不能取,链头不取的时候链尾可取可不取……
(我X我最近什么鬼状态!!!连傻叉题都不会写了)
type
arr=record
toward,next:longint;
end; const
maxn=; var
edge:array[..maxn]of arr;
first,fa,link,from:array[..maxn]of longint;
value:array[..maxn]of int64;
chose:array[..maxn]of boolean;
dp:array[..maxn,..]of int64;
f:array[..maxn,..]of int64;
n,m,tot:longint; function max(x,y:int64):int64;
begin
if x<y then exit(y);
exit(x);
end; procedure addedge(j,k:longint);
begin
inc(tot);
edge[tot].toward:=k;
edge[tot].next:=first[j];
first[j]:=tot;
end; procedure treedp(x:longint);
var
i,too:longint;
begin
dp[x,]:=value[x];
dp[x,]:=;
chose[x]:=false;
i:=first[x];
while i> do begin
too:=edge[i].toward;
treedp(too);
dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
dp[x,]:=dp[x,]+dp[too,];
i:=edge[i].next;
end;
end; procedure into;
var
i,j:longint;
begin
readln(n);
for i:= to n do begin
chose[i]:=true;
read(value[i],j);
addedge(j,i);
fa[i]:=j;
end;
end; procedure work;
var
i,j,x,now,sum,too:longint;
ans,answer:int64;
begin
answer:=;
for i:= to n do
if chose[i] then begin
sum:=;
x:=i;
while chose[x] do begin
chose[x]:=false;
x:=fa[x];
//from[fa[x]]:=x;
from[fa[x]]:=x;
end;
now:=x;
repeat
j:=first[x];
dp[x,]:=value[x];
while j> do begin
too:=edge[j].toward;
if too<>from[x] then begin
treedp(too);
dp[x,]:=dp[x,]+max(dp[too,],dp[too,]);
dp[x,]:=dp[x,]+dp[too,];
end;
j:=edge[j].next;
end;
inc(sum);
link[sum]:=x;
x:=fa[x];
until x=now;
ans:=;
f[,]:=dp[link[],];
f[,]:=dp[link[],];
f[,]:=dp[link[],];
f[,]:=dp[link[],];
for j:= to sum do begin
x:=link[j];
f[j,]:=max(f[j-,],f[j-,])+dp[x,];
f[j,]:=f[j-,]+dp[x,];
f[j,]:=max(f[j-,],f[j-,])+dp[x,];
f[j,]:=f[j-,]+dp[x,];
end;
ans:=max(f[sum,],f[sum,]);
ans:=max(ans,f[sum,]);
answer:=answer+ans;
end;
writeln(answer);
end; begin
into;
work;
end.
1040: [ZJOI2008]骑士的更多相关文章
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- bzoj 1040 1040: [ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5210 Solved: 1987[Submit][Status ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...
- 1040: [ZJOI2008]骑士 - BZOJ
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
随机推荐
- android 8.0 Account行为变更 账号系统
我们有个方法,是判断系统的账号有没有登录. public static boolean isAccountLogin(Context context) { String df = "com. ...
- 二、StreamAPI
一.Stream是什么? 是数据通道,用于操作数据源(集合.数组等)所生成的元素序列.集合讲的是数据,流讲的是计算. 注意: Stream不会存储元素. Stream不会改变源对象.相反,他们会返回一 ...
- web项目优化
1 循环时没有使用break 案例:查找一个值是否在数组中存在(为举例舍弃自带函数) $aa=123; $arr=array(234,123,5,6,45646,346,23); foreach($ ...
- 初识c++模板元编程
模板元编程(Template metaprogramming,简称TMP)是编译器内执行的程序,编译器读入template,编译输出的结果再与其他源码一起经过普通编译过程生成目标文件.通俗来说,普通运 ...
- hdu1181变形课(floyd)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submis ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第2章.HTTP协议简介
第2章--HTTP协议简介 HTTP协议简介 Abstract: HTTP协议的特性,HTTP请求/响应的过程,HTTP请求/响应的报文格式等知识,最后会演示如何通过Chrome提供的开发者工具,去跟 ...
- MongoDB->NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"
关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么 ...
- 【转】Haml 这货是啥? 附参考
Haml是一种用来描述任何XHTML web document的标记语言,它是干净,简单的.而且也不用内嵌代码.Haml的职能就是替代那些内嵌代码的page page templating syste ...
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- ubuntu16.04图形界面安装中文输入法,中文展示
打开system Settings 设置 打开设置语言 安装Language Support 点击installed languages 选择chinese 打勾,安装 安装IBus框 ...