题目描述 给一个树,n 个点,有点权,初始根是 1. m 个操作,每次操作: 1. 将树根换为 x. 2. 给出两个点 x,y,从 x 的子树中选每一个点,y 的子树中选每一个点,如果两个点点权相等,ans++,求 ans. 输入 第一行两个数表示 n,m. 第二行 n 个数,表示每个点的点权 a[i]. 之后 n - 1 行 , 每行两个数 x , y , 表示一条边 之后 m 行,每行为 1 x 或者 2 x y. 1 x,表示将根变成 x点. 2 x y,表示查询 x 点的子树与 y 点的…
用dfs序把询问表示成询问dfs序的两个区间中的信息 拆成至多9个询问(询问dfs序的两个前缀),对这些询问用莫队处理,时间复杂度$O(n\sqrt{m})$ #include<bits/stdc++.h> typedef long long i64; ; ,ob[N],*op=ob; int G(){ )fread(ptr=buf,,,stdin); return *ptr++; } int _(){ ; ){ )++ptr; )x=x*+*ptr++-; }else{ int c=G();…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4940 题解 对于换根操作,处理方法就很套路了. 首先先假定以 \(1\) 为根做一遍 dfs,那么在 \(rt\) 为根的时候,对于一个点 \(x\),如果 \(rt\) 不在 \(x\) 的以 \(1\) 为根时的子树中,那么 \(x\) 在 \(rt\) 为根时的子树和以 \(1\) 时的子树一样. 如果 \(rt\) 在 \(x\) 的以 \(1\) 为根时的子树中,那么我们求出 \(…
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,比如三个区间是 $ [1,2,2,3,3,3,3] $ , $ [1,2,2,3,3,3,3] $ 与 $ [1,1,2,3,3] $ ,就一起扔掉了 $ 1 $ 个 $ 1 \(,\) 1 $ 个 $ 2 \(,\) 2 $ 个 $ 3 $ . $ solution: $ 考场上…
Portal --> bzoj4940 Solution (原题这题面到底是..怎么回事啊深深的套路qwq) 感觉自己对根号的算法还是很..没有感觉啊== 实际上这题和bzoj5016没有任何区别的感觉...那个换根操作不过是一个幌子而已,处理出\(dfn\)序之后根据当前根\(rt\)的\(dfn\)序和\(x\)的子树范围的关系可以直接将查询变成\(dfn\)序上的至多两段区间 然后就变成了和bzoj5016一模一样的东西..只是区间可能有两个这样的话直接两两组合一下什么的就好了 ​ 具体的…
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath> #include<bitset> #include<cstdio> #include<cstring> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar();…
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立.注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,比如三个区间是 [1,2,2,3,3,3,3] , [1,2,2,3,3,3,3] 与 [1,1,2,3,3],就一起扔掉了 1 个 1,1 个 2,2 个 3. 分析 新套路get 我们发现答案为3个区间的长度…
洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是\([1,n]\)挖去一个区间. 记\(pre_i=f_{[1,i],[1,n]}\),这个可以一遍预处理求出来. 简单容斥一下: \[f_{[l,r],[1,L)\cup(R,n]}=f_{[l,r],[1,n]}-f_{[l,r],[L,R]}=pre_r-pre_{l-1}-f_{[l,r],…
传送门:here 很棒的莫队题啊..... 题意: 有一棵$ n$个点的树,树上每个点有点权,有$ m$次询问: 操作1:给定两个点$ x,y$,求二元组$ (a,b)$的数量,要求$ a$在$ x$的子树内,$ b$在$ y$的子树内,且$ a$和$ b$的权值相同 操作2:给定点$ x$,将根节点换成$ x$ $ solution:$ 我们先考虑没有换根操作 我们先求出这棵树所有点的dfs序,然后可以把树上问题转化成区间询问 $ \sum\limits_{i=L1}^{R1}\sum\lim…
传送门 ynoi中比较良心不卡常的题. 思路 没有换根操作时显然可以变成dfs序莫队随便搞. 换根操作时一个子树可以变成两段区间的并集,也随便搞搞就好了. 这题完全不卡常,随便过. 代码 #include<bits/stdc++.h> clock_t t=clock(); namespace my_std{ using namespace std; #define pii pair<int,int> #define fir first #define sec second #def…