有一点类似区间K值的求法。

这里有两颗树,一个是自己建的线段树,一个是题目中给定的树。以线段树和树进行区分。

首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权值的树的节点是往左走的,另一维是往右走的,用一个vector保存一下以当前i节点为结束的询问,因为所有的询问都是从根节点出发的,只需保存终点即可。

然后从根节点出发遍历整棵树,当走到当前节点时,枚举以当前节点的询问q[i],然后求出比q[i].x大的向左和向右走的节点个数,以及比它小的个数,如果有相等的直接为0,最后根据可能性加起来即可。

每走完一个节点,回退时,把当前节点更新为未走。

把树节点的权值跟询问的搞混了,WA一次。。搞了组数据才看出来

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stdlib.h>
  6. #include<vector>
  7. #include<cmath>
  8. #include<queue>
  9. #include<set>
  10. #include<map>
  11. using namespace std;
  12. #define N 100010
  13. #define LL long long
  14. #define INF 0xfffffff
  15. const double eps = 1e-;
  16. const double pi = acos(-1.0);
  17. const double inf = ~0u>>;
  18. #pragma comment(linker, "/STACK:1024000000,1024000000")
  19. int s[N<<][],a[N<<],b[N];
  20. map<int,int>f;
  21. vector<int>ed[N];//儿子
  22. vector<int>dd[N];//以i节点结束的询问
  23. int g ;
  24. struct node{
  25. int v,x;
  26. int ax,ay,f;
  27. }p[N];
  28. void up(int w)
  29. {
  30. s[w][] = s[w<<][]+s[w<<|][];//向左走
  31. s[w][] = s[w<<][]+s[w<<|][];//向右走
  32. }
  33. void build(int l,int r,int w)
  34. {
  35. if(l==r)
  36. {
  37. s[w][] = s[w][] = ;
  38. return ;
  39. }
  40. int m = (l+r)>>;
  41. build(l,m,w<<);
  42. build(m+,r,w<<|);
  43. up(w);
  44. }
  45. void update(int p,int d,int dir,int l,int r,int w)
  46. {
  47. if(l==r)
  48. {
  49. s[w][dir] += d;
  50. return ;
  51. }
  52. int m = (l+r)>>;
  53. if(p<=m) update(p,d,dir,l,m,w<<);
  54. else update(p,d,dir,m+,r,w<<|);
  55. up(w);
  56. }
  57. int query(int a,int b,int dir,int l,int r,int w)
  58. {
  59. if(a<=l&&b>=r)
  60. {
  61. return s[w][dir];
  62. }
  63. int m = (l+r)>>;
  64. int res=;
  65. if(a<=m) res+=query(a,b,dir,l,m,w<<);
  66. if(b>m) res+=query(a,b,dir,m+,r,w<<|);
  67. return res;
  68. }
  69. void dfs(int u,int pre)
  70. {
  71. int i;
  72. for(i = ; i < dd[u].size(); i++)
  73. {
  74. int k = dd[u][i];
  75. int id = f[p[k].x];
  76. // cout<<k<<endl;
  77. int cnt1 = query(id,id,,,g,);
  78. int cnt2 = query(id,id,,,g,);
  79. //cout<<cnt1<<" "<<cnt2<<" "<<u<<" "<<id<<endl;
  80. if(cnt1||cnt2)
  81. {
  82. p[k].f = ;
  83. continue;
  84. }
  85. else
  86. {
  87. p[k].f = ;
  88. int l0 = query(,id,,,g,);
  89. int l1 = query(,id,,,g,);
  90. int r0 = query(id,g,,,g,);
  91. int r1 = query(id,g,,,g,);
  92. // cout<<l0<<" "<<l1<<" "<<r0<<" "<<r1<<endl;
  93. p[k].ay = r0+r1+*(l1+l0);
  94. p[k].ax = l1;
  95. }
  96. }
  97. for(i = ;i < ed[u].size() ; i++)
  98. {
  99. int v = ed[u][i];
  100. int id = f[b[u]];
  101. // cout<<id<<" "<<u<<endl;
  102. if(i==)
  103. {
  104. update(id,,,,g,);
  105. }
  106. else update(id,,,,g,);
  107. dfs(v,u);
  108. if(i==)
  109. update(id,-,,,g,);
  110. else update(id,-,,,g,);
  111. }
  112. }
  113. int main()
  114. {
  115. int t,i,n,m,q;
  116. cin>>t;
  117. while(t--)
  118. {
  119. scanf("%d",&n);
  120. f.clear();
  121. g = ;
  122. for(i = ; i <=n; i++)
  123. {
  124. scanf("%d",&a[i]);
  125. b[i] = a[i];
  126. ed[i].clear();
  127. dd[i].clear();
  128. }
  129. scanf("%d",&m);
  130. for(i = ; i <= m; i++)
  131. {
  132. int u,l,r;
  133. scanf("%d%d%d",&u,&l,&r);
  134. ed[u].push_back(l);
  135. ed[u].push_back(r);
  136. }
  137. scanf("%d",&q);
  138. for(i = ;i <= q ;i++)
  139. {
  140. scanf("%d%d",&p[i].v,&p[i].x);
  141. dd[p[i].v].push_back(i);
  142. a[n+i] = p[i].x;
  143. }
  144. sort(a+,a+n+q+);
  145. f[a[]] = ++g;
  146. for(i = ; i <= n+q ; i++)
  147. {
  148. if(a[i]!=a[i-])
  149. f[a[i]] = ++g;
  150. }
  151. build(,g,);
  152. dfs(,-);
  153. for(i = ; i <= q; i++)
  154. {
  155. if(p[i].f==)
  156. printf("%d\n",);
  157. else
  158. printf("%d %d\n",p[i].ax,p[i].ay);
  159. }
  160. }
  161. return ;
  162. }

Partition(线段树的离线处理)的更多相关文章

  1. Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线

    Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...

  2. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  3. CF803G - Periodic RMQ Problem 动态开点线段树 或 离线

    CF 题意 有一个长度为n × k (<=1E9)的数组,有区间修改和区间查询最小值的操作. 思路 由于数组过大,直接做显然不行. 有两种做法,可以用动态开点版本的线段树,或者离线搞(还没搞)( ...

  4. NOIP2012借教室[线段树|离线 差分 二分答案]

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  5. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  6. E - No Pain No Game 线段树 离线处理 区间排序

    E - No Pain No Game  HDU - 4630 这个题目很好,以后可以再写写.这个题目就是线段树的离线写法,推荐一个博客:https://blog.csdn.net/u01003321 ...

  7. 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)

    Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...

  8. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  9. 洛谷T44252 线索_分治线段树_思维题

    分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...

随机推荐

  1. gzhu 2013 Good Sequence 解题报告

    题目链接:(这个是内网的网址)  http://172.22.27.1/problem?pid=1013 Good Sequence Time Limit: 4000/2000 MS (Java/Ot ...

  2. spring 从jsp到jsp

    小例子 1.jar信息 2.web.xml文件配置 <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  3. Rsync+Sersync同步

    Rsync+Sersync同步特点: (1):sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字:(2):rsync在同步的时候,只同步发生变化的这 ...

  4. 编码 —— PCM 编码

    PCM:Pulse Code Modulation,脉冲编码调制: 1. 码率的计算 PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM ...

  5. Rsyslog 日志相关内容

    [root@server vusers_home]# rpm -ql rsyslog|more       ###.so结尾为模块,模块有分im为输入模块,om 为输出模块/etc/logrotate ...

  6. [WC 2006] 水管局长

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2594 [算法] 首先离线 , 将删边操作转化为倒序加边 假设我们已经维护出了一棵最小 ...

  7. 算法实现c语言--01

    打印九九乘法表 #include<stdio.h> #include<stdlib.h> int main() { , j = ; ; i <= ; i++) { ; j ...

  8. 小程序wx:key中的关键字*this

    “保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如果是对象则不可以 data:{ array:[1,2,3,4,5], ob ...

  9. CodeForces 1098D. Eels

    题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次[竞 ...

  10. androidEditTextinputType及android:imeOptions=”actionDone”(转)

    一.android 软件盘事件响应 在android中,有时需要对EditText实现软件盘监听的场景.当android按下软键盘的时候,响应完成.发送.搜索或者其他事件. Google 提供了 Ed ...