题目分析:

考虑欧拉序,这里的欧拉序与ETT欧拉序的定义相同而与倍增LCA不同。然后不妨对于询问$u$与$v$让$dfsin[u] \leq dfsin[v]$,这样对于u和v不在一条路径上,它们可以改成询问$dfsin[u]$到$dfsin[v]$。否则改成$dfsout[u]$到$dfsin[v]$,并加上LCA上的影响,如果在询问过程中没有加入就加入,否则删除。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ;
  5. const int maxm = ;
  6. const int srt = ;
  7.  
  8. int n,m;
  9. int a[maxn],tb[maxn],arr[maxn],fa[maxn],pm[maxm],ans[maxm];
  10. int dfsin[maxn],dfsout[maxn],Num,pre[maxn];
  11. vector <int> g[maxn];
  12. vector <pair<int,int> > Qy[maxn];
  13. struct query{int l,r,bel,rem;}Q[maxm];
  14.  
  15. int found(int x){
  16. int rx = x; while(pre[rx] != rx) rx = pre[rx];
  17. while(pre[x] != rx){int tmp = pre[x]; pre[x] = rx; x = tmp;}
  18. return rx;
  19. }
  20.  
  21. void dfs(int now,int ff){
  22. arr[now] = ;pm[++Num] = now;fa[now] = ff;
  23. dfsin[now] = Num;
  24. for(int i=;i<Qy[now].size();i++){
  25. if(!arr[Qy[now][i].first])continue;
  26. Q[Qy[now][i].second].bel=found(Qy[now][i].first);
  27. }
  28. for(int i=;i<g[now].size();i++){
  29. if(g[now][i]==fa[now])continue;
  30. dfs(g[now][i],now);
  31. }
  32. pre[now] = fa[now];
  33. pm[++Num] = now; dfsout[now] = Num;
  34. }
  35.  
  36. void read(){
  37. scanf("%d%d",&n,&m);
  38. for(int i=;i<=n;i++) scanf("%d",&a[i]),tb[i] = a[i];
  39. sort(tb+,tb+n+); int num=unique(tb+,tb+n+)-tb-;
  40. for(int i=;i<=n;i++) a[i]=lower_bound(tb+,tb+num+,a[i])-tb;
  41. memset(tb,,sizeof(tb));
  42. for(int i=;i<n;i++){
  43. int u,v; scanf("%d%d",&u,&v);
  44. g[u].push_back(v); g[v].push_back(u);
  45. }
  46. for(int i=;i<=m;i++) scanf("%d%d",&Q[i].l,&Q[i].r);
  47. }
  48.  
  49. int cmp(query alpha,query beta){
  50. if(alpha.l/srt == beta.l/srt) return alpha.r < beta.r;
  51. else return alpha.l/srt < beta.l/srt;
  52. }
  53.  
  54. void init(){
  55. for(int i=;i<=m;i++){
  56. Qy[Q[i].l].push_back(make_pair(Q[i].r,i));
  57. Qy[Q[i].r].push_back(make_pair(Q[i].l,i));
  58. }
  59. for(int i=;i<=n;i++) pre[i] = i;
  60. dfs(,);
  61. for(int i=;i<=m;i++){
  62. if(dfsin[Q[i].l] > dfsin[Q[i].r]) swap(Q[i].l,Q[i].r);
  63. if(Q[i].bel == Q[i].l || Q[i].bel == Q[i].r){
  64. Q[i].l = dfsin[Q[i].l]; Q[i].r = dfsin[Q[i].r];
  65. Q[i].bel = i; Q[i].rem = ;
  66. }else{
  67. Q[i].l = dfsout[Q[i].l]; Q[i].r = dfsin[Q[i].r];
  68. Q[i].rem = Q[i].bel; Q[i].bel = i;
  69. }
  70. }
  71. sort(Q+,Q+m+,cmp);
  72. }
  73.  
  74. void work(){
  75. int L = ,R = ,as=; tb[a[]]++;
  76. for(int i=;i<=m;i++){
  77. int nowl = Q[i].l,nowr = Q[i].r;
  78. while(R < nowr){
  79. R++;
  80. if(dfsin[pm[R]]==R||dfsin[pm[R]]<L){
  81. if(!tb[a[pm[R]]])as++;
  82. tb[a[pm[R]]]++;
  83. }else{
  84. if(tb[a[pm[R]]] == ) as--;
  85. tb[a[pm[R]]]--;
  86. }
  87. }
  88. while(L > nowl){
  89. L--;
  90. if(dfsout[pm[L]]==L||dfsout[pm[L]]>R){
  91. if(!tb[a[pm[L]]])as++;
  92. tb[a[pm[L]]]++;
  93. }else{
  94. if(tb[a[pm[L]]] == ) as--;
  95. tb[a[pm[L]]]--;
  96. }
  97. }
  98. while(R > nowr){
  99. if(dfsin[pm[R]]==R||dfsin[pm[R]]<L){
  100. if(tb[a[pm[R]]] == ) as--;
  101. tb[a[pm[R]]]--;
  102. }else{
  103. if(!tb[a[pm[R]]])as++;
  104. tb[a[pm[R]]]++;
  105. }
  106. R--;
  107. }
  108. while(L < nowl){
  109. if(dfsout[pm[L]]==L||dfsout[pm[L]]>R){
  110. if(tb[a[pm[L]]] == ) as--;
  111. tb[a[pm[L]]]--;
  112. }else{
  113. if(!tb[a[pm[L]]])as++;
  114. tb[a[pm[L]]]++;
  115. }
  116. L++;
  117. }
  118. if(Q[i].rem && !tb[a[Q[i].rem]])ans[Q[i].bel]=as+;
  119. else ans[Q[i].bel] = as;
  120. }
  121. for(int i=;i<=m;i++) printf("%d\n",ans[i]);
  122. }
  123.  
  124. int main(){
  125. read();
  126. init();
  127. work();
  128. return ;
  129. }

SPOJ10707 COT2 - Count on a tree II 【树上莫队】的更多相关文章

  1. spoj COT2 - Count on a tree II 树上莫队

    题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的,  受益匪浅.. #include <iostream> #include < ...

  2. SP10707 COT2 - Count on a tree II (树上莫队)

    大概学了下树上莫队, 其实就是在欧拉序上跑莫队, 特判lca即可. #include <iostream> #include <algorithm> #include < ...

  3. SP10707 COT2 - Count on a tree II [树上莫队学习笔记]

    树上莫队就是把莫队搬到树上-利用欧拉序乱搞.. 子树自然是普通莫队轻松解决了 链上的话 只能用树上莫队了吧.. 考虑多种情况 [X=LCA(X,Y)] [Y=LCA(X,Y)] else void d ...

  4. SPOJ COT2 Count on a tree II 树上莫队算法

    题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...

  5. [SPOJ]Count on a tree II(树上莫队)

    树上莫队模板题. 使用欧拉序将树上路径转化为普通区间. 之后莫队维护即可.不要忘记特判LCA #include<iostream> #include<cstdio> #incl ...

  6. 【SPOJ10707】 COT2 Count on a tree II

    SPOJ10707 COT2 Count on a tree II Solution 我会强制在线版本! Solution戳这里 代码实现 #include<stdio.h> #inclu ...

  7. SPOJ COT2 - Count on a tree II(LCA+离散化+树上莫队)

    COT2 - Count on a tree II #tree You are given a tree with N nodes. The tree nodes are numbered from  ...

  8. COT2 - Count on a tree II(树上莫队)

    COT2 - Count on a tree II You are given a tree with N nodes. The tree nodes are numbered from 1 to N ...

  9. spoj COT2 - Count on a tree II

    COT2 - Count on a tree II http://www.spoj.com/problems/COT2/ #tree You are given a tree with N nodes ...

随机推荐

  1. H5 71-网易注册界面4

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Johnson算法

    用于求稀疏图上的全局最短路. 考虑将带负权的图变为不带负权的图,再跑\(n\)次Dijkstra. 方法:新建点S,向所有点连边权为\(0\)的边,然后以S为起点跑SPFA.然后将每条边的权值重新赋为 ...

  3. Magic Stones CodeForces - 1110E (思维+差分)

    E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. mysql数据从windows导出,再导入到linux

    从windows导出时,要注意字符集最好和linux的一致,如linux字符集一般为utf8,则导出时可以加上参数--default-character-set=utf8指定字符集,然后导入到linu ...

  5. gnuplot画折线图

    之前尝试用jfreechart画自定义横坐标的折线图或时序图,发现很复杂,后来改用gnuplot了. gnuplot在网上一搜就能找到下载地址. 安装完成后,主要是命令行形式的交互界面,至少比jfre ...

  6. Redis教程(Windows)

    安装 1)下载redis压缩包并  , 推荐地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平 ...

  7. SQL性能优化-order by语句的优化

    原文:http://bbs.landingbj.com/t-0-243203-1.html 在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序.where条件和or ...

  8. MySQL数据库性能优化思路与解决方法(二转)

    原文:http://bbs.landingbj.com/t-0-242512-1.html 1.锁定表 尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是 ...

  9. day 7-21 pymysql模块

    一.安装的两种方法 第一种: #安装 pip3 install pymysql 第二种: 二.链接,执行sql,关闭(游标) import pymysql user = input("use ...

  10. SAP配置BOM的适用范围

    配置BOM中定义属性,单纯的编码要搞死人: 适合小批量周期短多品种