听说这是动态开点主席树的板子题,但是发现我还不会,于是就来写一写

其实跟主席树一个样子的

这里就是存个板子吧

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define re register
  6. #define max(a,b) ((a)>(b)?(a):(b))
  7. #define maxn 100005
  8. struct E
  9. {
  10. int v,nxt;
  11. }e[maxn<<1];
  12. inline int read()
  13. {
  14. char c=getchar();
  15. int x=0;
  16. while(c<'0'||c>'9') c=getchar();
  17. while(c>='0'&&c<='9')
  18. x=(x<<3)+(x<<1)+c-48,c=getchar();
  19. return x;
  20. }
  21. int head[maxn],deep[maxn],top[maxn],son[maxn],sz[maxn],fa[maxn],to[maxn],b[maxn],c[maxn],a[maxn],_[maxn];
  22. int rt[maxn];
  23. int l[maxn*20],r[maxn*20],sum[maxn*20],d[maxn*20];
  24. int cnt,num,tot,n,Q;
  25. void dfs1(int x)
  26. {
  27. sz[x]=1;
  28. int maxx=-1;
  29. for(re int i=head[x];i;i=e[i].nxt)
  30. if(!deep[e[i].v])
  31. {
  32. deep[e[i].v]=deep[x]+1;
  33. fa[e[i].v]=x;
  34. dfs1(e[i].v);
  35. sz[x]+=sz[e[i].v];
  36. if(sz[e[i].v]>maxx) maxx=sz[e[i].v],son[x]=e[i].v;
  37. }
  38. }
  39. void dfs2(int x,int topf)
  40. {
  41. to[x]=++tot;
  42. b[tot]=a[x];
  43. c[tot]=_[x];
  44. top[x]=topf;
  45. if(!son[x]) return;
  46. dfs2(son[x],topf);
  47. for(re int i=head[x];i;i=e[i].nxt)
  48. if(deep[e[i].v]>deep[x]&&son[x]!=e[i].v) dfs2(e[i].v,e[i].v);
  49. }
  50. inline void add_edge(int x,int y)
  51. {
  52. e[++num].v=y;
  53. e[num].nxt=head[x];
  54. head[x]=num;
  55. }
  56. int change(int now,int x,int y,int pos,int val)
  57. {
  58. int root=now;
  59. if(!now) root=++cnt;
  60. if(x==y)
  61. {
  62. d[root]=val,sum[root]=val;
  63. return root;
  64. }
  65. int mid=x+y>>1;
  66. if(pos<=mid) l[root]=change(l[root],x,mid,pos,val);
  67. else r[root]=change(r[root],mid+1,y,pos,val);
  68. d[root]=max(d[l[root]],d[r[root]]);
  69. sum[root]=sum[l[root]]+sum[r[root]];
  70. return root;
  71. }
  72. int query(int now,int x,int y,int ll,int rr)
  73. {
  74. if(!now) return 0;
  75. if(ll<=x&&rr>=y) return sum[now];
  76. int mid=x+y>>1;
  77. if(rr<=mid) return query(l[now],x,mid,ll,rr);
  78. if(ll>mid) return query(r[now],mid+1,y,ll,rr);
  79. return query(l[now],x,mid,ll,rr)+query(r[now],mid+1,y,ll,rr);
  80. }
  81. int ask(int now,int x,int y,int ll,int rr)
  82. {
  83. if(!now) return 0;
  84. if(ll<=x&&rr>=y) return d[now];
  85. int mid=x+y>>1;
  86. if(rr<=mid) return ask(l[now],x,mid,ll,rr);
  87. if(ll>mid) return ask(r[now],mid+1,y,ll,rr);
  88. return max(ask(l[now],x,mid,ll,rr),ask(r[now],mid+1,y,ll,rr));
  89. }
  90. inline int ask_sum(int x,int y,int col)
  91. {
  92. int s=0;
  93. while(top[x]!=top[y])
  94. {
  95. if(deep[top[x]]<deep[top[y]]) std::swap(x,y);
  96. s+=query(rt[col],1,n,to[top[x]],to[x]);
  97. x=fa[top[x]];
  98. }
  99. if(deep[x]>deep[y]) std::swap(x,y);
  100. s+=query(rt[col],1,n,to[x],to[y]);
  101. return s;
  102. }
  103. inline int ask_max(int x,int y,int col)
  104. {
  105. int s=0;
  106. while(top[x]!=top[y])
  107. {
  108. if(deep[top[x]]<deep[top[y]]) std::swap(x,y);
  109. s=max(s,ask(rt[col],1,n,to[top[x]],to[x]));
  110. x=fa[top[x]];
  111. }
  112. if(deep[x]>deep[y]) std::swap(x,y);
  113. s=max(s,ask(rt[col],1,n,to[x],to[y]));
  114. return s;
  115. }
  116. int main()
  117. {
  118. n=read(),Q=read();
  119. for(re int i=1;i<=n;i++)
  120. {
  121. a[i]=read(),_[i]=read();
  122. if(!rt[_[i]]) rt[_[i]]=++cnt;
  123. }
  124. int x,y;
  125. for(re int i=1;i<n;i++)
  126. x=read(),y=read(),add_edge(x,y),add_edge(y,x);
  127. deep[1]=1,dfs1(1),dfs2(1,1);
  128. for(re int i=1;i<=n;i++)
  129. change(rt[c[i]],1,n,i,b[i]);
  130. char opt[2];
  131. int val;
  132. while(Q--)
  133. {
  134. scanf("%s",opt);
  135. if(opt[0]=='Q'&&opt[1]=='S')
  136. {
  137. x=read(),y=read();
  138. printf("%d\n",ask_sum(x,y,_[x]));
  139. }
  140. if(opt[0]=='Q'&&opt[1]=='M')
  141. {
  142. x=read(),y=read();
  143. printf("%d\n",ask_max(x,y,_[x]));
  144. }
  145. if(opt[0]=='C'&&opt[1]=='W')
  146. {
  147. x=read(),val=read();
  148. b[to[x]]=val;
  149. change(rt[_[x]],1,n,to[x],val);
  150. }
  151. if(opt[0]=='C'&&opt[1]=='C')
  152. {
  153. x=read(),val=read();
  154. change(rt[val],1,n,to[x],b[to[x]]);
  155. change(rt[_[x]],1,n,to[x],0);
  156. _[x]=val;
  157. }
  158. }
  159. return 0;
  160. }

【[SDOI2014]旅行】的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. 【BZOJ3531】[Sdoi2014]旅行 树链剖分+动态开点线段树

    [BZOJ3531][Sdoi2014]旅行 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天 ...

  3. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  4. [SDOI2014]旅行

    洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...

  5. B20J_3231_[SDOI2014]旅行_树链剖分+线段树

    B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...

  6. [luogu P3313] [SDOI2014]旅行

    [luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...

  7. 洛谷 P3313 [SDOI2014]旅行 解题报告

    P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...

  8. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  9. P3313 [SDOI2014]旅行

    P3313 [SDOI2014]旅行 树链剖分+动态线段树(并不是lct) 显然的,我们对于每一个宗教都要维护一个线段树. (那么空间不是爆炸了吗) 在这里引入:动态开点线段树 就是需要的点开起来,不 ...

  10. 3531: [Sdoi2014]旅行

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1731  Solved: 772 [Submit][Statu ...

随机推荐

  1. while循环案例

    class While05{ public static void main(String[ ]args){ //练习1:使用while循环完成输出1------10中的每个数 /*int i =1; ...

  2. (转)Linux磁盘空间监控告警 && Linux磁盘管理

    Linux磁盘空间监控告警 http://blog.csdn.net/github_39069288/article/details/73478784-----------Linux磁盘管理 原文:h ...

  3. 【ExtJS】关于自定义组件(一)

    一.目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefi ...

  4. TOJ 4289 Unrequited Love

    Description There are n single boys and m single girls. Each of them may love none, one or several o ...

  5. Hibernate 缓存机制详细解析

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  6. 生成ks.cfg文件

    RHEL 7下生成ks.cfg文件 环境 + RHEL 7 + 字符界面, 没有安装图形界面 软件包安装 + `yum install system-config-kickstart -y` + `y ...

  7. SQLite 大小写敏感

    --转自mojianpo  http://mojianpo.iteye.com/blog/1496579 大部分数据库在进行字符串比较的时候,对大小写是不敏感的. 但是,在SQLite中,对大小写是敏 ...

  8. flask-SQLAlchemy的ORM

    1.创建表 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import de ...

  9. <转>MapReduce工作原理图文详解

    转自 http://weixiaolu.iteye.com/blog/1474172前言:  前段时间我们云计算团队一起学习了hadoop相关的知识,大家都积极地做了.学了很多东西,收获颇丰.可是开学 ...

  10. WSAAsyncSelect 消息模型

    select 模型虽然可以管理多个socket,但是它涉及到一个时机的问题,select模型会针对所管理的数组中的每一个socket循环检测它管理是否在对应的数组中,从时间复杂度上来说它是O(n^2) ...