[BZOJ1040][ZJOI2008]骑士
昨天做错了,没遇到环就开搜。今天改之。
话说在洛谷上被1秒卡掉一个解,算了不改了。
#include<iostream> #include<cstdio> #include<vector> using namespace std; typedef long long LL; typedef struct{ int val,next,type; // type:0-未定, 1-树上(不含根), 2-环中 LL x0,x1; vector<int> prev; } NODE; vector<NODE> node; int n; inline void getInt(int &x) { int ch; x=0; while((ch=getchar())&&ch>='0'&&ch<='9') x=x*10+ch-'0'; } void init(){ NODE node1={0,}; getInt(n); // cin>>n; for(int i=0;i<=n;i++) node.push_back(node1); for(int i=1;i<=n;i++){ getInt(node[i].val); getInt(node[i].next); // cin>>node[i].val>>node[i].next; node[i].type=0; node[node[i].next].prev.push_back(i); } for(int i=1;i<=n;i++) if(node[i].type==0){ int j; for(j=i;node[j].type==0;j=node[j].next) node[j].type=9; // 临时 9 for(;node[j].type==9;j=node[j].next) node[j].type=2; // 环上 2 for(j=i;node[j].type==9;j=node[j].next) node[j].type=1; // 树上 1 } } void dfs(int x){ node[x].x1=node[x].val; node[x].x0=0; for(int i=0;i<node[x].prev.size();i++){ int j=node[x].prev[i]; if (node[j].type==1) { dfs(j); node[x].x1+=node[j].x0; node[x].x0+=max(node[j].x0,node[j].x1); } } } LL anser(){ LL ans=0; for(int i=1;i<=n;i++) if(node[i].type==2) { vector<int> t; LL u0=0,u1=0,v0,w; for(int j=i;node[j].type==2;j=node[j].next){ node[j].type=3; t.push_back(j); v0=max(u0,u1)+node[j].x0; u1=u0+node[j].x1; u0=v0; } w=u0; u0=u1=0; for(int j=t.size()-1;j>=0;j--){ v0=max(u0,u1)+node[t[j]].x0; u1=u0+node[t[j]].x1; u0=v0; } ans+=max(w,u0); } return ans; } int main(){ ios_base::sync_with_stdio(false); init(); for(int i=1;i<=n;i++) if(node[i].type==2) dfs(i); cout<<anser()<<endl; return 0; }