题目:传送门


这道题根本不用lca,也没有部分分。。。

考虑求两个点xy的lca的深度。

我们将x到树根所有点的值都加1,然后查询y到根的和,其实就是lca的深度。

所以本题离线一下上树剖乱搞就可以了。


AC代码如下:
718ms 17348Kib

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. namespace StandardIO {
  9.  
  10. template<typename T> inline void read (T &x) {
  11. x=;T f=;char c=getchar();
  12. for (; c<''||c>''; c=getchar()) if (c=='-') f=-;
  13. for (; c>=''&&c<=''; c=getchar()) x=x*+c-'';
  14. x*=f;
  15. }
  16. template<typename T> inline void write (T x) {
  17. if (x<) putchar('-'),x=-x;
  18. if (x>=) write(x/);
  19. putchar(x%+'');
  20. }
  21.  
  22. }
  23.  
  24. using namespace StandardIO;
  25.  
  26. namespace Solve {
  27.  
  28. const int MOD=;
  29. const int N=;
  30.  
  31. struct Tree {
  32. int tree[N*],tag[N*];
  33. void pushdown (int pos,int left,int right) {
  34. if (tag[pos]) {
  35. int mid=(left+right)/;
  36. tree[pos*]+=(mid-left+)*tag[pos],tree[pos*]%=MOD;
  37. tree[pos*+]+=(right-mid)*tag[pos],tree[pos*+]%=MOD;
  38. tag[pos*]+=tag[pos],tag[pos*+]+=tag[pos],tag[pos*]%=MOD,tag[pos*+]%=MOD;
  39. tag[pos]=;
  40. }
  41. }
  42. void pushup (int pos) {
  43. tree[pos]=tree[pos*]+tree[pos*+],tree[pos]%=MOD;
  44. }
  45. void update (int pos,int left,int right,int L,int R,int add) {
  46. if (L<=left&&right<=R) {
  47. tree[pos]+=add*(right-left+),tree[pos]%=MOD;
  48. tag[pos]+=add,tag[pos]%=MOD;
  49. return;
  50. }
  51. pushdown(pos,left,right);
  52. int mid=(left+right)/;
  53. if (L<=mid) update(pos*,left,mid,L,R,add);
  54. if (R>mid) update(pos*+,mid+,right,L,R,add);
  55. pushup(pos);
  56. }
  57. int query (int pos,int left,int right,int L,int R) {
  58. if (L<=left&&right<=R) return tree[pos];
  59. pushdown(pos,left,right);
  60. int mid=(left+right)/;
  61. int ans=;
  62. if (L<=mid) ans+=query(pos*,left,mid,L,R),ans%=MOD;
  63. if (R>mid) ans+=query(pos*+,mid+,right,L,R),ans%=MOD;
  64. return ans;
  65. }
  66. } ljz;
  67. int n,q;
  68. vector<int>M[N];
  69. int dep[N],siz[N],fa[N],son[N];
  70. int ind[N],cnt;
  71. int top[N];
  72.  
  73. void dfs1 (int now,int father) {
  74. dep[now]=dep[father]+,fa[now]=father,siz[now]=;
  75. for (register vector<int>::iterator i=M[now].begin(); i!=M[now].end(); i++) {
  76. if(*i==father) continue;
  77. dfs1(*i,now);
  78. siz[now]+=siz[*i];
  79. if (siz[*i]>siz[son[now]]) son[now]=*i;
  80. }
  81. }
  82. void dfs2(int now,int tp){
  83. top[now]=tp,ind[now]=++cnt;
  84. if (son[now]) dfs2(son[now],tp);
  85. for (register vector<int>::iterator i=M[now].begin(); i!=M[now].end(); i++) {
  86. if (*i==fa[now]||*i==son[now]) continue;
  87. dfs2(*i,*i);
  88. }
  89. }
  90. void upd (int x,int add){
  91. while (x) {
  92. ljz.update(,,n,ind[top[x]],ind[x],add);
  93. x=fa[top[x]];
  94. }
  95. }
  96. int que (int x) {
  97. int ans=;
  98. while (x) {
  99. ans+=ljz.query(,,n,ind[top[x]],ind[x]),ans%=MOD;
  100. x=fa[top[x]];
  101. }
  102. return ans;
  103. }
  104. int A[N];
  105. struct Q{
  106. int val,ind;
  107. Q () {val=ind=;}
  108. Q (int a,int b) :val(a),ind(b) {}
  109. friend bool operator < (Q a,Q b) {
  110. return a.val<b.val;
  111. }
  112. } s1[N],s2[N];
  113. int a1=,a2=;
  114. int Ans[N];
  115.  
  116. inline void solve () {
  117. read(n),read(q);
  118. for (register int i=; i<=n; i++) {
  119. int a;
  120. read(a);
  121. M[a+].push_back(i);
  122. }
  123. dfs1(,);
  124. dfs2(,);
  125. for (register int i=; i<=q; i++) {
  126. int a,b,c;
  127. read(a),read(b),read(c);
  128. a++,b++,c++;
  129. A[i]=c;
  130. s1[i]=Q(a-,i),s2[i]=Q(b,i);
  131. }
  132. sort(s1+,s1+q+);
  133. sort(s2+,s2+q+);
  134. while (s1[a1].val==) a1++;
  135. for (register int i=; i<=n; i++) {
  136. upd(i,);
  137. while (s1[a1].val==i) {
  138. Ans[s1[a1].ind]-=que(A[s1[a1].ind])-MOD,Ans[s1[a1].ind]%=MOD;
  139. a1++;
  140. }
  141. while (s2[a2].val==i) {
  142. Ans[s2[a2].ind]+=que(A[s2[a2].ind]),Ans[s2[a2].ind]%=MOD;
  143. a2++;
  144. }
  145. }
  146. for (register int i=; i<=q; i++) {
  147. write(Ans[i]),putchar('\n');
  148. }
  149. }
  150.  
  151. }
  152.  
  153. using namespace Solve;
  154.  
  155. int main () {
  156. // freopen(".in","r",stdin);
  157. // freopen(".out","w",stdout);
  158. solve();
  159. }

题解 LNOI2014 LCA的更多相关文章

  1. 【BZOJ3626】[LNOI2014]LCA 离线+树链剖分+线段树

    [BZOJ3626][LNOI2014]LCA Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度 ...

  2. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  3. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  4. bzoj 3626: [LNOI2014]LCA 离线+树链剖分

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 426  Solved: 124[Submit][Status] ...

  5. BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )

    说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...

  6. 洛谷 P4211 [LNOI2014]LCA 解题报告

    [LNOI2014]LCA 题意 给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\) 一直想启发式合并 ...

  7. P4211 [LNOI2014]LCA

    P4211 [LNOI2014]LCA 链接 分析: 首先一种比较有趣的转化是,将所有点到1的路径上都+1,然后z到1的路径上的和,就是所有答案的deep的和. 对于多次询问,要么考虑有把询问离线,省 ...

  8. P4211 [LNOI2014]LCA LCT

    P4211 [LNOI2014]LCA 链接 loj luogu 思路 多次询问\(\sum\limits_{l \leq i \leq r}dep[LCA(i,z)]\) 可以转化成l到r上的点到根 ...

  9. [BZOJ3626] [LNOI2014]LCA(树链剖分)

    [BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...

随机推荐

  1. ES modules

    注意:这篇文章讲的是正经的es module规范 及浏览器的实现!webpack项目中es module会被parse成commonjs,和这个没大关系! 总结: ES模块加载的主要过程: 构造 —— ...

  2. 03 Winform基础

    补充: MD5加密 static void Main(string[] args) { string s = GetMD5("123"); Console.WriteLine(s) ...

  3. [BOI2011]MET-Meteors

    题目:洛谷P3527. 题目大意:n个国家在某星球上建立了m个空间站(一个空间站只属于一个国家),空间站围成一个环.现在知道要下k天陨石,每天都在一个区间内下,每个点都下同样多的(若r>l,则说 ...

  4. 中国剩余定理(excrt) 模板

    excrt板子题 #include <cmath> #include <cstdio> #include <cstring> #include <algori ...

  5. jquery 终止循环

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  6. ubuntu12.04开启Framebuffer

    一.framebuffer概述 Framebuffer在Linux中是作为设备来实现的,它是对图形硬件的一种抽象,代表着显卡中的帧缓冲区(Framebuffer).通过Framebuffer设备,上层 ...

  7. Python 绘图与可视化 matplotlib(上)

    参考链接:https://www.cnblogs.com/dudududu/p/9149762.html 更详细的:https://www.cnblogs.com/zhizhan/p/5615947. ...

  8. 2019-03-21 Python Request InsecureRequestWarning

    问题: 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误: InsecureRequestWarning: Unverifi ...

  9. openvswith Frequently Asked Questions

    Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...

  10. React 中的 refs的应用

    React Refs React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上. 这个特殊的属性允许你引用 render() 返回的相应的支撑实例( back ...