传送门


ynoi中比较良心不卡常的题。


思路

没有换根操作时显然可以变成dfs序莫队随便搞。

换根操作时一个子树可以变成两段区间的并集,也随便搞搞就好了。

这题完全不卡常,随便过。


代码

  1. #include<bits/stdc++.h>
  2. clock_t t=clock();
  3. namespace my_std{
  4. using namespace std;
  5. #define pii pair<int,int>
  6. #define fir first
  7. #define sec second
  8. #define MP make_pair
  9. #define rep(i,x,y) for (int i=(x);i<=(y);i++)
  10. #define drep(i,x,y) for (int i=(x);i>=(y);i--)
  11. #define go(x) for (int i=head[x];i;i=edge[i].nxt)
  12. #define templ template<typename T>
  13. #define sz 505050
  14. typedef long long ll;
  15. typedef double db;
  16. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  17. templ inline T rnd(T l,T r) {return uniform_int_distribution<T>(l,r)(rng);}
  18. templ inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
  19. templ inline bool chkmin(T &x,T y){return x>y?x=y,1:0;}
  20. templ inline void read(T& t)
  21. {
  22. t=0;char f=0,ch=getchar();double d=0.1;
  23. while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
  24. while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
  25. if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();}
  26. t=(f?-t:t);
  27. }
  28. template<typename T,typename... Args>inline void read(T& t,Args&... args){read(t); read(args...);}
  29. char sr[1<<21],z[20];int C=-1,Z=0;
  30. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  31. inline void print(register int x)
  32. {
  33. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  34. while(z[++Z]=x%10+48,x/=10);
  35. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  36. }
  37. void file()
  38. {
  39. #ifndef ONLINE_JUDGE
  40. freopen("a.in","r",stdin);
  41. #endif
  42. }
  43. inline void chktime()
  44. {
  45. #ifndef ONLINE_JUDGE
  46. cout<<(clock()-t)/1000.0<<'\n';
  47. #endif
  48. }
  49. #ifdef mod
  50. ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;return ret;}
  51. ll inv(ll x){return ksm(x,mod-2);}
  52. #else
  53. ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x;return ret;}
  54. #endif
  55. // inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
  56. }
  57. using namespace my_std;
  58. int n,m;
  59. int w[sz],ww[sz],a[sz];
  60. struct E{int t,nxt;}edge[sz<<1];
  61. int head[sz],ecnt;
  62. void make_edge(int f,int t)
  63. {
  64. edge[++ecnt]=(E){t,head[f]};
  65. head[f]=ecnt;
  66. edge[++ecnt]=(E){f,head[t]};
  67. head[t]=ecnt;
  68. }
  69. int dep[sz],dfn[sz],low[sz],fa[sz][25],T;
  70. #define v edge[i].t
  71. void dfs(int x,int f)
  72. {
  73. dfn[x]=++T;a[T]=w[x];fa[x][0]=f;dep[x]=dep[f]+1;
  74. rep(i,1,20) fa[x][i]=fa[fa[x][i-1]][i-1];
  75. go(x) if (v!=f) dfs(v,x);
  76. low[x]=T;
  77. }
  78. #undef v
  79. int jump(int x,int to)
  80. {
  81. drep(i,20,0)
  82. if (fa[x][i]&&dep[fa[x][i]]>dep[to])
  83. x=fa[x][i];
  84. return x;
  85. }
  86. struct hhh
  87. {
  88. int l1,r1,l2,r2,id;
  89. hhh(int ll1=0,int rr1=0,int ll2=0,int rr2=0,int idd=0){l1=ll1,r1=rr1,l2=ll2,r2=rr2,id=idd;}
  90. }qq[sz<<2];
  91. int pos[sz],blo;
  92. void init(){blo=sqrt(n);rep(i,0,n) pos[i]=i/blo;}
  93. struct hh{int a,b,id,p;}q[sz<<4];
  94. inline bool cmp(const hh &x,const hh &y){return pos[x.a]==pos[y.a]?((pos[x.a]&1)?x.b<y.b:x.b>y.b):pos[x.a]<pos[y.a];}
  95. ll Ans[sz];
  96. int cnta[sz],cntb[sz];
  97. ll ans;
  98. void solve(int m)
  99. {
  100. int l1,r1,l2,r2,id,M=0;
  101. rep(i,1,m)
  102. {
  103. l1=qq[i].l1,r1=qq[i].r1,l2=qq[i].l2,r2=qq[i].r2,id=qq[i].id;
  104. if (l1>r1||l2>r2||!r1||!r2) continue;
  105. if (l1-1&&l2-1) q[++M]=(hh){l1-1,l2-1,id,1};
  106. if (l1-1) q[++M]=(hh){l1-1,r2,id,-1};
  107. if (l2-1) q[++M]=(hh){r1,l2-1,id,-1};
  108. q[++M]=(hh){r1,r2,id,1};
  109. }
  110. init();
  111. sort(q+1,q+M+1,cmp);
  112. int A=0,B=0;
  113. rep(i,1,M)
  114. {
  115. while (A<q[i].a) ++A,++cnta[a[A]],ans+=cntb[a[A]];
  116. while (A>q[i].a) ans-=cntb[a[A]],--cnta[a[A]],--A;
  117. while (B<q[i].b) ++B,++cntb[a[B]],ans+=cnta[a[B]];
  118. while (B>q[i].b) ans-=cnta[a[B]],--cntb[a[B]],--B;
  119. Ans[q[i].id]+=ans*q[i].p;
  120. }
  121. }
  122. int main()
  123. {
  124. file();
  125. int x,y,z,rt=1;
  126. read(n,m);
  127. rep(i,1,n) read(w[i]),ww[i]=w[i];
  128. sort(ww+1,ww+n+1);unique(ww+1,ww+n+1);
  129. rep(i,1,n) w[i]=lower_bound(ww+1,ww+n+1,w[i])-ww;
  130. rep(i,1,n-1) read(x,y),make_edge(x,y);
  131. dfs(1,0);
  132. int M=0,c=0;
  133. rep(i,1,m)
  134. {
  135. read(z);
  136. if (z==1) { read(rt); continue; }
  137. read(x,y);++c;
  138. #define in(x) dfn[x]<=dfn[rt]&&dfn[rt]<=low[x]
  139. if (in(y)) swap(x,y);
  140. if (rt==x)
  141. {
  142. if (rt==y) qq[++M]=hhh(1,n,1,n,c);
  143. else if (in(y)) z=jump(rt,y),qq[++M]=hhh(1,n,1,dfn[z]-1,c),qq[++M]=hhh(1,n,low[z]+1,n,c);
  144. else qq[++M]=hhh(1,n,dfn[y],low[y],c);
  145. }
  146. else if (in(x))
  147. {
  148. z=jump(rt,x);int zz;
  149. if (rt==y) qq[++M]=hhh(1,n,1,dfn[z]-1,c),qq[++M]=hhh(1,n,low[z]+1,n,c);
  150. else if (in(y))
  151. zz=jump(rt,y),
  152. qq[++M]=hhh(1,dfn[z]-1,1,dfn[zz]-1,c),qq[++M]=hhh(1,dfn[z]-1,low[zz]+1,n,c),
  153. qq[++M]=hhh(low[z]+1,n,1,dfn[zz]-1,c),qq[++M]=hhh(low[z]+1,n,low[zz]+1,n,c);
  154. else qq[++M]=hhh(dfn[y],low[y],1,dfn[z]-1,c),qq[++M]=hhh(dfn[y],low[y],low[z]+1,n,c);
  155. }
  156. else qq[++M]=hhh(dfn[x],low[x],dfn[y],low[y],c);
  157. #undef in
  158. }
  159. solve(M);
  160. rep(i,1,c) printf("%lld\n",Ans[i]);
  161. return 0;
  162. }

洛谷P4689 [Ynoi2016]这是我自己的发明 [莫队]的更多相关文章

  1. 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)

    洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...

  2. 洛谷P4689 [Ynoi2016]这是我自己的发明(树上莫队+树链剖分)

    题目描述 您正在打galgame,然后突然家长进来了,于是您假装在写数据结构题: 给一个树,n 个点,有点权,初始根是 1. m 个操作,每次操作: 1.将树根换为 x. 2.给出两个点 x,y,从  ...

  3. 【洛谷3674】小清新人渣的本愿(莫队,bitset)

    [洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...

  4. 【洛谷5398】[Ynoi2018]GOSICK(二次离线莫队)

    题目: 洛谷 5398 当我刚学莫队的时候,他们告诉我莫队能解决几乎所有区间问题: 现在,当我发现一个区间问题似乎难以用我所了解的莫队解决的时候,他们就把这题的正解叫做 XXX 莫队.--题记 (以上 ...

  5. 【洛谷】1972:[SDOI2009]HH的项链【莫队+树状数组】

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  6. 洛谷P2709 BZOJ 3781 小B的询问 (莫队)

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  7. 洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)

    传送门 本来打算用主席树 然后发现没办法维护颜色数 于是用了莫队加树状数组 然后竟然A了…… //minamoto #include<iostream> #include<cstdi ...

  8. 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)

    点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...

  9. 洛谷 P1494 [国家集训队]小Z的袜子(莫队)

    题目链接:https://www.luogu.com.cn/problem/P1494 一道很经典的莫队模板题,然而每道莫队题的大体轮廓都差不多. 首先莫队是一种基于分块的算法,它的显著特点就是: 能 ...

随机推荐

  1. Devexpress Winform 使用MVVM

    MVVM在WPF里很早就有了,在Winform里Devexpress最近几个大版本才有的事,上一段代码. 现在对话框上添加三个控件simpleButton1,simpleButton2,textEdi ...

  2. mac怎么快速回到桌面 隐藏所有窗口

    当你同时按下Option+Command+h键,就能把所有已打开的程序窗口(不包括当前正在运行的应用程序窗口)最小化到Dock栏上.注意不是关闭哦,是最小化哦.如果需要把程序窗口恢复到屏幕上,直接点击 ...

  3. mysql中间件

    一.分类为:负载均衡类和数据切分类 1.负载均衡中间件提供了请求的转发,降低了单节点的负载,如haproxy,mysql-proxy,mysql-router 2.数据切分中间件按照不同的路由算法分发 ...

  4. Java实现猜数字,附带提示功能。

    很简单的一段代码: package com.changeyd.demo; import java.util.Random;import java.util.Scanner;public class M ...

  5. 二十九、Linux 进程与信号——minishell(2)

    编程内容: 1.完成  echo env export 命令 2.完成前后台进程 3.完成重定向 完整代码如下: 29.1 主函数.通用头文件和Makefile 29.1.1 主函数 mshell_m ...

  6. Andrew NG 机器学习编程作业5 Octave

    问题描述:根据水库中蓄水标线(water level) 使用正则化的线性回归模型预 水流量(water flowing out of dam),然后 debug 学习算法 以及 讨论偏差和方差对 该线 ...

  7. luogu P3234 [HNOI2014]抄卡组

    传送门 nmdwsm 自己看吧,不想写了qwq 垃圾代码如下 和题解完全不一样 #define LL long long #define uLL unsigned long long #define ...

  8. 15款Java程序员必备的开发工具(转)

    如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它 对于Java,有两种截然不同的观点: 一种认为Java是最简单功能 ...

  9. Socket TCP客户端和服务器的实现

    import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...

  10. linqjs

    Project Descriptionlinq.js - LINQ for JavaScript Features implement all .NET 4.0 methods and many ex ...