4679: Hdu5331 Simple Problem

题意:

考场上,看到这道题就让我想起BZOJ4712洪水。然后思路就被带着飞起了,完全没去考虑一条链的情况,于是GG.

解法:先考虑一条链的做法,可以用线段树维护一下,需要保留的信息:$F[0/1][0/1]$表示左端点不选/选,右端点不选/选 的最多人数。在树上的做法,可以在重链上用线段树维护,对于轻边,就暴力更新其父亲(每个点存下了其轻边的答案),然后接着往上更新重链。

于是先离线,$O(n\log n)$。

在线做法,将上述做法扩展到LCT上。复杂度还是$O(n\log n)$

代码很丑 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

#include< cstdio >#define gec getchar
#define FILE(F) freopen(F".in","r",stdin),freopen(F".out","w",stdout)
#define DEBUG fprintf(stderr,"Passing [%s] in Line (%d)\n",__FUNCTION__,__LINE__);typedef long long ll;
template
inline void read(T&x)
{x=0;bool f=0;char c=gec();for(;c<'0'||c>'9';c=gec())f=(c=='-');for(;c>='0'&&c<='9';c=gec())x=x*10+c-'0';x=f?-x:x;
}
const int MAXN(300010),INF(0x73f3f3f);
int n,ty,f,Father[MAXN],root;//编号全部+1
int max(int a,int b){return a>b?a:b;}
struct Data{int f[2][2];}zero;
struct LCT
{int fa[MAXN],nx[MAXN][2],F[MAXN],G[MAXN];//轻儿子的答案Data val[MAXN];//[1/0][1/0] 顶端选/不选 尾端选/不选int which(int x){if(nx[fa[x]][0]==x)return 0;if(nx[fa[x]][1]==x)return 1;return -1;}void update(int x){if(nx[x][0]&&nx[x][1])for(int i=0;i<=1;i++) for(int j=0;j<=1;j++){val[x].f[i][j]=max(max(val[nx[x][0]].f[i][1],val[nx[x][0]].f[i][0])+max(val[nx[x][1]].f[1][j],val[nx[x][1]].f[0][j])+F[x],val[nx[x][0]].f[i][0]+val[nx[x][1]].f[0][j]+G[x]);}elseif(nx[x][0])for(int i=0;i<=1;i++){val[x].f[i][0]=max(val[nx[x][0]].f[i][0],val[nx[x][0]].f[i][1])+F[x];val[x].f[i][1]=val[nx[x][0]].f[i][0]+G[x];}elseif(nx[x][1])for(int i=0;i<=1;i++){val[x].f[0][i]=max(val[nx[x][1]].f[0][i],val[nx[x][1]].f[1][i])+F[x];val[x].f[1][i]=val[nx[x][1]].f[0][i]+G[x];}else{val[x].f[1][1]=G[x]; val[x].f[0][0]=F[x];val[x].f[0][1]=val[x].f[1][0]=0;}}void rotate(int x){int ff=fa[x],fafa=fa[ff],fd=which(ff),xd=which(x);fa[nx[x][xd^1]]=ff;nx[ff][xd]=nx[x][xd^1];nx[x][xd^1]=ff;fa[ff]=x;fa[x]=fafa;if(fd!=-1)nx[fafa][fd]=x;update(ff);}void splay(int x){if(!x)return;while(which(x)!=-1){if(which(fa[x])==-1)rotate(x);else{if(which(fa[x])^which(x))rotate(fa[x]),rotate(x);else rotate(x),rotate(x);}}update(x);}void Look(){for(int i=1;i<=n+1;i++){fprintf(stderr,"i:%d Fa:%d n0:%d n1:%d F:%d G:%d\n",i,fa[i],nx[i][0],nx[i][1],F[i],G[i]);fprintf(stderr,"v00:%d v01:%d v10:%d v11:%d\n",val[i].f[0][0],val[i].f[0][1],val[i].f[1][0],val[i].f[1][1]);}}void access(int x,int t){int Fr,Gr,Fl=0,Gl=0,Tf,Tg;while(x){splay(x);update(nx[x][1]);
//          fprintf(stderr,"x:%d\n",x);Fr=max(val[nx[x][1]].f[0][0],val[nx[x][1]].f[0][1]);Gr=max(val[nx[x][1]].f[1][0],val[nx[x][1]].f[1][1]);
//          fprintf(stderr,"Fr:%d Gr:%d\n",Fr,Gr);
//          fprintf(stderr,"Fl:%d Gl:%d\n",Fl,Gl);Tf=max(val[x].f[0][0],val[x].f[0][1]);Tg=max(val[x].f[1][0],val[x].f[1][1]);
//          fprintf(stderr,"Tf:%d Tg:%d\n",Tf,Tg);F[x]+=max(Fr,Gr);G[x]+=Fr;F[x]-=max(Fl,Gl),G[x]-=Fl;Fl=Tf; Gl=Tg;nx[x][1]=t;update(x);t=x;x=fa[x];}splay(1);
//      Look();}void link(int a,int b)//a is b's father{fa[b]=a; access(a,b);}void New(int x){F[x]=0;G[x]=1;update(x);}int ask(int x){splay(x);return max(val[x].f[0][0],max(val[x].f[1][1],max(val[x].f[1][0],val[x].f[0][1])));}
}tree;
int Ans;
void Back()
{for(int i=1;i<=n+1;i++){tree.fa[i]=tree.nx[i][0]=tree.nx[i][1]=tree.F[i]=tree.G[i]=0;tree.val[i]=zero;}
}
int main()
{
#ifndef ONLINE_JUDGEFILE("party");
#endif      while(scanf("%d",&n)!=EOF){n--;Back();root=1;tree.New(1);for(int i=2;i<=n+1;i++){read(f);tree.New(i);tree.link(++f,i);//      fprintf(stderr,"a:%d b:%d\n",f,i);Ans=tree.ask(1);printf("%d\n",Ans);}}return 0;
}

转载于:https://www.cnblogs.com/Oncle-Ha/p/7029526.html

BZOJ 4679/Hdu5331 Simple Problem LCT or 树链剖分相关推荐

  1. BZOJ 3779 重组病毒 LCT,树链剖分,线段树

    题意: 给一棵树,每个点一开始颜色互不相同,支持三个操作                 1. 将一个点到根的路径染成一种新的颜色                 2. 将一个新的点设为根,并将原来的 ...

  2. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

  3. bzoj 3626: [LNOI2014]LCA(离线差分+树链剖分)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2885  Solved: 1133 [Submit][Sta ...

  4. UOJ #268 BZOJ 4732 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  5. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  6. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  7. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2157 是 hydro 的 BZOJ ...

  8. BZOJ 4811 树链剖分+线段树

    思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...

  9. BZOJ 3626 LCA(离线+树链剖分+差分)

    显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案.观察到,深度其实就是上面有几个已 ...

最新文章

  1. MapReduce编程初体验
  2. 一个强迫症的Git 选择
  3. 计算机网络-信道的极限容量
  4. oracle function详解,Oracle 函数 Function 解析
  5. new/delete和malloc/free的区别
  6. [原]全桥移相(PSFB)原边电流突跌分析
  7. 畅通工程 HDU - 1863
  8. 将检索出来的列按逗号拼接起来
  9. 详解MySQL中DROP,TRUNCATE 和DELETE的区别
  10. springMVC---servletAPI
  11. open cv python_Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!
  12. 商住楼和住宅楼的区别
  13. 小米MIUI线刷包cust.img、system.img精简教程(二)
  14. 手机突然黑屏是什么原因
  15. SM4250平台typec耳机检测
  16. Tensorflow-- 第一天使用过程中的报错records
  17. 【水汐のpython】 用python抓取外网的本子站并获取本子封面和信息
  18. 网络对抗 Exp4 恶意代码分析 20154311 王卓然
  19. 北漂程序员一天的生活
  20. 单摆模型,控制器及其MATLAB图形仿真

热门文章

  1. 关于ASP.NET页面打印技术的总结
  2. [原] Excel(VBA)中数据的非科学记数法显示
  3. Windows10看视频出现蓝屏重启
  4. JAVA调用R语言之Rserve
  5. c#_将文件导入到工程目录下
  6. php证券k线图,php画K线图的一个工具
  7. mysql v8 漏洞_mysql'密码安全 - osc_v8gts6gd的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...
  9. java return用法_Java枚举的高级用法之多键值的映射使用
  10. docker安装rocketmq_RabbitMQ 介绍amp;安装