为什么题解都是离线的…… (抄都没法抄

搞一棵主席树

1 操作 新树上的当前节点设成1

2 操作 查max(i-xx-1,0)那棵树上这条路径上有多少个点是1

让你找经过了多少个点 查的时候用deep 搞出来就好了

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 444444
  7. #define mem(x,y) memset(x,y,sizeof(x))
  8. int n,q,op,xx,yy,zz,first[N],v[N],next[N],tot,root,rt[N],ans;
  9. int size[N],fa[N],son[N],deep[N],top[N],change[N],back[N],cnt;
  10. struct Tree{int l,r,num;}tree[N*30];
  11. void Add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
  12. void add(int x,int y){Add(x,y),Add(y,x);}
  13. void dfs(int x){
  14. size[x]=1;
  15. for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
  16. deep[v[i]]=deep[x]+1,fa[v[i]]=x,dfs(v[i]);
  17. size[x]+=size[v[i]];
  18. if(size[son[x]]<size[v[i]])son[x]=v[i];
  19. }
  20. }
  21. void dfs2(int x,int tp){
  22. change[x]=++cnt,back[cnt]=x;top[x]=tp;
  23. if(son[x])dfs2(son[x],tp);
  24. for(int i=first[x];~i;i=next[i])
  25. if(v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]);
  26. }
  27. void push_up(int pos){tree[pos].num=tree[tree[pos].l].num+tree[tree[pos].r].num;}
  28. int build(int l,int r){
  29. int pos=++cnt;
  30. if(l==r){return pos;}
  31. int mid=(l+r)>>1;
  32. tree[pos].l=build(l,mid),tree[pos].r=build(mid+1,r);
  33. return pos;
  34. }
  35. int insert(int o,int l,int r,int num){
  36. int pos=++cnt;tree[pos]=tree[o];
  37. if(l==r){tree[pos].num=1;return pos;}
  38. int mid=(l+r)>>1;
  39. if(mid>=num)tree[pos].l=insert(tree[o].l,l,mid,num);
  40. else tree[pos].r=insert(tree[o].r,mid+1,r,num);
  41. push_up(pos);return pos;
  42. }
  43. int query(int o,int l,int r,int L,int R){
  44. if(l>=L&&r<=R)return tree[o].num;
  45. int mid=(l+r)>>1;
  46. if(mid<L)return query(tree[o].r,mid+1,r,L,R);
  47. else if(mid>=R)return query(tree[o].l,l,mid,L,R);
  48. else return query(tree[o].l,l,mid,L,R)+query(tree[o].r,mid+1,r,L,R);
  49. }
  50. int find(int x,int y,int wei){
  51. int fx=top[x],fy=top[y],temp=0;
  52. while(fx!=fy){
  53. if(deep[fx]<deep[fy])swap(x,y),swap(fx,fy);
  54. temp+=query(rt[wei],1,n,change[fx],change[x]),ans+=deep[x]-deep[fx]+1;
  55. x=fa[fx],fx=top[x];
  56. }
  57. if(deep[x]<deep[y])swap(x,y);
  58. ans+=deep[x]-deep[y]+1;
  59. return temp+query(rt[wei],1,n,change[y],change[x]);
  60. }
  61. int main(){
  62. mem(first,-1);scanf("%d",&n);
  63. for(int i=1;i<=n;i++){
  64. scanf("%d",&fa[i]);
  65. if(!fa[i])root=i;else add(i,fa[i]);
  66. }
  67. dfs(root),dfs2(root,root),cnt=0,rt[0]=build(1,n);
  68. scanf("%d",&q);
  69. for(int i=1;i<=q;i++){
  70. scanf("%d",&op);
  71. if(op==1){
  72. rt[i]=rt[i-1],ans=0;
  73. scanf("%d%d%d",&xx,&yy,&zz);
  74. zz=max(i-zz-1,0);
  75. printf("%d %d\n",ans,find(xx,yy,zz));
  76. }
  77. else scanf("%d",&xx),rt[i]=insert(rt[i-1],1,n,change[xx]);
  78. }
  79. }

BZOJ 4448 主席树+树链剖分(在线)的更多相关文章

  1. bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...

  2. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  3. bzoj 3252: 攻略 -- 长链剖分+贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神 ...

  4. bzoj 3252 攻略 长链剖分思想+贪心

    攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 889  Solved: 423[Submit][Status][Discuss] Descrip ...

  5. BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树

    4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...

  6. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  7. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  8. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  9. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

随机推荐

  1. hibernate配置数据库连接池三种用法

    三种连接都是以连接MySQl为例. <!-- JDBC驱动程序 --> <property name="connection.driver_class">o ...

  2. extjs 时间范围选择的实现

    extjs中 有时须要选择一个日期范围 ,须要自己主动推断,选择的開始日期不能大于结束日期,或结束日期不能小于開始日期,实现的代码例如以下 效果图: watermark/2/text/aHR0cDov ...

  3. hdoj 2222 Keywords Search 【AC自己主动机 入门题】 【求目标串中出现了几个模式串】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  4. 37、ifconfig命令

    很多windows很熟悉ipconfig命令行工具.它被用来获取网络接口配置信息并对此进行改动.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). 通常须 ...

  5. Windows环境下通过Git来管理自己的Android代码

    前面已经介绍了在Windows下使用git工具来下载Android的源代码,Windows环境下通过Git得到Android源代码,这里记录我使用git工具来管理我自己的代码,git是一种分布式的项目 ...

  6. javaweb学习总结(六)——Servlet开发(三) 常见问题疑问

    [1]response.getWriter().write()与out.print()的区别http://blog.csdn.net/javaloveiphone/article/details/81 ...

  7. Recovering unassigned shards on elasticsearch 2.x——副本shard可以设置replica为0在设置回来

    Recovering unassigned shards on elasticsearch 2.x 摘自:https://z0z0.me/recovering-unassigned-shards-on ...

  8. 2.windows下安装git

    转自:https://blog.csdn.net/lvkelly/article/details/54666868

  9. fieldset 标签 -- 对表单进行分组

    转自:https://xhmaomy-163-com.iteye.com/blog/1066977 fieldset——一个不常用的HTML标签 fieldset 标签 -- 对表单进行分组 在for ...

  10. HTTP学习记录

    title: HTTP学习记录 toc: true date: 2018-09-21 20:40:48 HTTP协议,HyperText Transfer Protocol,超文本传输协议,是因特网上 ...