搞出dfs序,转化为查询矩形点数,树套树搞定。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #define N 100005
  4. #define IF else if
  5. struct edge{
  6. edge*s;
  7. int v;
  8. }
  9. z[N*2],*next=z,*h[N];
  10. int n,m,q;
  11. void add(int u,int v){
  12. h[u]=&(*next++=(edge){
  13. h[u],v
  14. }
  15. );
  16. h[v]=&(*next++=(edge){
  17. h[v],u
  18. }
  19. );
  20. }
  21. typedef int ds[N];
  22. ds d,p,r,l,son,y;
  23. void dfs1(int u){
  24. r[u]=1;
  25. d[u]=d[p[u]]+1;
  26. int s=0;
  27. for(edge*i=h[u];i;i=i->s)
  28. if(i->v!=p[u]){
  29. p[i->v]=u;
  30. dfs1(i->v);
  31. r[u]+=r[i->v];
  32. if(s<r[i->v])
  33. s=r[son[u]=i->v];
  34. }
  35. }
  36. void dfs2(int u){
  37. static int j;
  38. l[u]=++j;
  39. if(r[u]!=1){
  40. y[son[u]]=y[u];
  41. dfs2(son[u]);
  42. }
  43. for(edge*i=h[u];i;i=i->s)
  44. if(i->v!=p[u]&&i->v!=son[u])
  45. dfs2(y[i->v]=i->v);
  46. }
  47. int lca(int s,int t){
  48. while(y[s]^y[t])
  49. d[y[s]]<d[y[t]]?(s^=t,t^=s,s^=t):0,s=p[y[s]];
  50. return d[s]<d[t]?s:t;
  51. }
  52. struct node{
  53. int v,s,a,q;
  54. node*l,*r;
  55. void up(){
  56. s=l->s+r->s+a;
  57. }
  58. }
  59. *f[N],e[N*40];
  60. node*back=e+1;
  61. node*create(int v){
  62. return&(*back++=(node){
  63. v,1,1,rand(),e,e
  64. }
  65. );
  66. }
  67. void lturn(node*&s){
  68. node*a=s->r;
  69. s->r=a->l;
  70. s->up(),a->l=s;
  71. a->up(),s=a;
  72. }
  73. void rturn(node*&s){
  74. node*a=s->l;
  75. s->l=a->r;
  76. s->up(),a->r=s;
  77. a->up(),s=a;
  78. }
  79. void ins(int v,node*&s){
  80. if(!s->s)
  81. s=create(v);
  82. IF(v==s->v)++s->a,s->up();
  83. IF(v<s->v){
  84. ins(v,s->l);
  85. if(s->l->q>s->q)
  86. rturn(s);
  87. else s->up();
  88. }
  89. else{
  90. ins(v,s->r);
  91. if(s->r->q>s->q)
  92. lturn(s);
  93. else s->up();
  94. }
  95. }
  96. void del(int v,node*&s){
  97. if(v<s->v)
  98. del(v,s->l),s->up();
  99. IF(s->v<v)del(v,s->r),s->up();
  100. IF(s->a>1)--s->a,s->up();
  101. IF(s->l==e)s=s->r;
  102. IF(s->r==e)s=s->l;
  103. IF(s->l->q>s->r->q)rturn(s),del(v,s->r),s->up();
  104. else lturn(s),del(v,s->l),s->up();
  105. }
  106. int query(int v,node*s){
  107. int k=0;
  108. for(;;s=s->r){
  109. while(s->s&&v<s->v)
  110. s=s->l;
  111. if(!s->s)
  112. break;
  113. k+=s->l->s+s->a;
  114. }
  115. return k;
  116. }
  117. int query(int i,int j){
  118. for(int k=0;;i^=i&-i){
  119. if(!i)
  120. return k;
  121. k+=query(j,f[i]);
  122. }
  123. }
  124. void ins1(int i,int j){
  125. for(;i<=n;i+=i&-i)
  126. ins(j,f[i]);
  127. }
  128. void ins2(int s,int t){
  129. if(l[s]<l[t])
  130. s^=t,t^=s,s^=t;
  131. ins1(l[t],l[s]);
  132. }
  133. void del1(int i,int j){
  134. for(;i<=n;i+=i&-i)
  135. del(j,f[i]);
  136. }
  137. void del2(int s,int t){
  138. if(l[s]<l[t])
  139. s^=t,t^=s,s^=t;
  140. del1(l[t],l[s]);
  141. }
  142. int query(int i,int j,int s,int t){
  143. return query(j,t)-query(j,s-1)-query(i-1,t)+query(i-1,s-1);
  144. }
  145. int find(int s,int t){
  146. static int j;
  147. for(;y[s]^y[t];s=p[j])
  148. j=y[s];
  149. return s^t?son[t]:j;
  150. }
  151. int qtree(int s,int t){
  152. if(d[s]<d[t])
  153. s^=t,t^=s,s^=t;
  154. static int i,j,k;
  155. i=l[s],j=l[s]+r[s]-1;
  156. if(lca(s,t)!=t)
  157. return l[s]<l[t]?query(i,j,l[t],l[t]+r[t]-1):query(l[t],l[t]+r[t]-1,i,j);
  158. k=find(s,t);
  159. return(l[k]+r[k]>n?0:query(i,j,l[k]+r[k],n))+query(1,l[k]-1,i,j);
  160. }
  161. int main(){
  162. struct{
  163. operator int(){
  164. int x;
  165. scanf("%d",&x);
  166. return x;
  167. }
  168. }
  169. it;
  170. n=it;
  171. for(int i=0;i<=n;++i)
  172. f[i]=e;
  173. for(int i=1;i!=n;++i)
  174. add(it,it);
  175. dfs1(1),dfs2(y[1]=1);
  176. for(m=it;m;--m)
  177. ins2(it,it);
  178. for(q=it;q;--q){
  179. int k=it,s=it,t=it;
  180. if(k==3)
  181. printf("%d\n",qtree(s,t));
  182. if(k==1)
  183. ins2(s,t);
  184. if(k==2)
  185. del2(s,t);
  186. }
  187. }

BZOJ4285: 使者的更多相关文章

  1. 【BZOJ4285】使者 cdq分治+扫描线+树状数组

    [BZOJ4285]使者 Description 公元 8192 年,人类进入星际大航海时代.在不懈的努力之下,人类占领了宇宙中的 n 个行星,并在这些行星之间修建了 n - 1 条星际航道,使得任意 ...

  2. BZOJ 4285 使者

    我TM再也不写BIT套主席树了.... #include<iostream> #include<cstdio> #include<cstring> #include ...

  3. 伟大的通信使者——JSON(JavaScript版本)

    JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表 ...

  4. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  5. Android 面试题--Service

    1.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity ...

  6. C语言 关于内存动态分配问题

    全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...

  7. HTML5 WebSocket

    在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到"字幕",自己做 ...

  8. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx

    Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...

  9. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

随机推荐

  1. CGLib动态代理原理及实现

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  2. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  3. GL.IssuePluginEvent 发布插件事件

    Description 描述 Send a user-defined event to a native code plugin. 发送一个用户定义的事件到一个本地代码插件. Rendering in ...

  4. Linux 命令学习

    当前登陆目录:

  5. KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...

  6. 微信公众平台开发——微信授权登录(OAuth2.0)

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

  7. log4j 不同模块输出到不同的文件

    1.实现目标 不同业务的日志信息需要打印到不同的文件中,每天或者每个小时生成一个文件.如,注册的信息打印到register.log,每天凌晨生成一个register-年月日.log文件, 登录信息的日 ...

  8. 博客代码美化(SyntaxHighlighter)

    这篇博文主要讲解自己使用SyntaxHighlighter对代码进行美工中遇见的问题以及如何使用SyntaxHighlighter? 首先来看看SyntaxHighlighter对代码美工的效果吧! ...

  9. C# random helper class

      项目中经常需要模拟些假数据,来做测试.这个随机生成数据的helper类就应用而生: using System; using System.Text; using System.Windows.Me ...

  10. hibernate概述

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用 ...