【距离GDKOI:44天&GDOI:107天】【BZOJ1040】[ZJOI2008] 骑士

其实已经准备退役了,但GDOI之前还是会继续学下去的!!当成兴趣在学,已经对竞赛失去信心了的样子,我还是回去跪跪文化课吧QAQ

第一道环套树DP...其实思想挺简单的,就把环拆开,分类处理。若拆成开的两个点是u,v,dp[i,0..1]分别表示第i位骑士不选和选

(1) 不选u,v点随意    (2)u随意,v点不选...

分类dp处理即可

  1 const maxn=1000419;
  2 type
  3  edgetype=record
  4   toward,next:longint;
  5  end;
  6
  7 var
  8  edge:array[0..maxn*2] of edgetype;
  9  first:array[0..maxn] of longint;
 10  val:array[0..maxn] of int64;
 11  dp:array[0..maxn,0..1] of int64;
 12  pd,vb,vc:array[0..maxn] of boolean;
 13  root,vv,e,tot:longint;
 14  n:longint;
 15 function max(x,y:int64):int64; begin if x>y then exit(x) else exit(y); end;
 16
 17 procedure addedge(i,j:longint);
 18 begin
 19  edge[tot].toward:=j;
 20  edge[tot].next:=first[i];
 21  first[i]:=tot;
 22  inc(tot);
 23 end;
 24
 25 procedure add(i,j:longint);
 26 begin
 27  addedge(i,j); addedge(j,i);
 28 end;
 29
 30 procedure dfs(v,fa:longint);
 31 var i,tmp:longint;
 32 begin
 33  pd[v]:=true;
 34  i:=first[v];
 35  while i<>-1 do
 36   begin
 37    tmp:=edge[i].toward;
 38    if not pd[tmp] then dfs(tmp,v)
 39     else if tmp<>fa then
 40      begin
 41       vv:=v;
 42       root:=tmp;
 43       e:=i;
 44      end;
 45    i:=edge[i].next;
 46   end;
 47 end;
 48
 49 procedure dpb(v:longint); //ban u
 50 var i,tmp:longint;
 51 begin
 52  dp[v,0]:=0; dp[v,1]:=val[v]; vb[v]:=true;
 53  i:=first[v];
 54  while i<>-1 do
 55   begin
 56    tmp:=edge[i].toward;
 57    if (i<>e) and (i xor 1<>e) and not vb[tmp] then
 58     begin
 59      dpb(tmp);
 60      dp[v,0]:=dp[v,0]+max(dp[tmp,0],dp[tmp,1]);
 61      dp[v,1]:=dp[v,1]+dp[tmp,0];
 62     end;
 63    i:=edge[i].next;
 64   end;
 65 end;
 66
 67 procedure dpc(v:longint); //ban v;
 68 var i,tmp:longint;
 69 begin
 70  dp[v,0]:=0; dp[v,1]:=val[v]; vc[v]:=true;
 71  i:=first[v];
 72  while i<>-1 do
 73   begin
 74    tmp:=edge[i].toward;
 75    if (i<>e) and (i xor 1 <>e) and not vc[tmp] then
 76     begin
 77      dpc(tmp);
 78      dp[v,1]:=dp[v,1]+dp[tmp,0];
 79      if tmp=vv then dp[v,0]:=dp[v,0]+dp[tmp,0]
 80       else dp[v,0]:=dp[v,0]+max(dp[tmp,0],dp[tmp,1]);
 81     end;
 82    i:=edge[i].next;
 83   end;
 84 end;
 85
 86 procedure solve;
 87 var i:longint;
 88  rec,ans:int64;
 89 begin
 90  ans:=0;
 91  for i:= 1 to n do
 92   if not pd[i] then
 93    begin
 94     rec:=0; root:=-1; dfs(i,-1);
 95     dpb(root); rec:=dp[root,0];
 96     dpc(root); rec:=max(rec,max(dp[root,0],dp[root,1]));
 97     inc(ans,rec);
 98    end;
 99  writeln(ans);
100 end;
101
102 procedure init;
103 var i,x:longint;
104 begin
105  fillchar(first,sizeof(first),255);
106  readln(n);
107  tot:=0;
108  for i:= 1 to n do
109   begin
110    readln(val[i],x);
111    add(i,x);
112   end;
113 end;
114
115 Begin
116  init;
117  solve;
118 End.
时间: 2024-10-12 18:37:13

【距离GDKOI:44天&GDOI:107天】【BZOJ1040】[ZJOI2008] 骑士的相关文章

Bzoj1040 [ZJOI2008]骑士

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4496  Solved: 1721 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团

【环套树+树形dp】Bzoj1040 [ZJOI2008] 骑士

Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾.每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不

luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)

N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几个环上不能选相邻的点,最大的价值和 我们把这个环从N到1处断开,然后钦定一下1选还是不选,统计一下答案就可以了. 1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define ll long long 4 using na

[BZOJ1040][ZJOI2008]骑士(环套树dp)

1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5816  Solved: 2263[Submit][Status][Discuss] Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境 中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人

bzoj1040(ZJOI2008)骑士——基环树

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1040 基环树的模板. 套路就是把环断开,先把一端作为根节点,强制不选:再把另一端作为根节点,强制不选. 人家的这个判断环的方法真好!还顺便没有连上环的那条边,省下了在函数里判断. 别忘了有多棵基环树! #include<iostream> #include<cstdio> #include<cstring> #define ll long long using n

【BZOJ1040】[ZJOI2008]骑士 树形DP

[BZOJ1040][ZJOI2008]骑士 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾.每个骑士都有且仅有一个

【bzoj1040】骑士[ZJOI2008](树形dp)

题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 这道题,很明显根据仇恨关系构造出的图形是一堆环套树.如果是普通的树,就可以马上裸树形dp了,于是我们先解决这个环的问题.所以要先把环找出来. 找出环后,假如断掉一条环边,环套树就变成了普通的树,而我们可以直接对这棵树进行dp,但是要控制被断掉的边的两端不被选择. 对断边形成的树进行dp的时候,我们的dp方程是这样表示的:f[i][0/1]表示结点i不选/选. 假设断掉的两条边两端

【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp

题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾.每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶

[BZOJ1040][CODEVS1423][ZJOI2008]骑士

题目描述 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾.每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),