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

传送门: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…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4940 题解 对于换根操作,处理方法就很套路了. 首先先假定以 \(1\) 为根做一遍 dfs,那么在 \(rt\) 为根的时候,对于一个点 \(x\),如果 \(rt\) 不在 \(x\) 的以 \(1\) 为根时的子树中,那么 \(x\) 在 \(rt\) 为根时的子树和以 \(1\) 时的子树一样. 如果 \(rt\) 在 \(x\) 的以 \(1\) 为根时的子树中,那么我们求出 \(…
题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bitset中除了保存每个数是否出现外,还要保存出现的次数. 这时我们发现每个数字的出现次数之和\(=n\) 于是想到离散化以后每个数字占bitset中的一格. 还记得\(SA\)里的基数排序吗?这样就能使第\(n\)次加入区间的同一个数字有固定的位置安放. 于是就能莫队了. 但是一看数据范围,好像开不下\…
洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. 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],…
话说这道题数据是不是都是链啊,我不手动扩栈就全 \(RE\)... 不过 \(A\) 了这题还是很爽的,通过昨晚到今天早上的奋斗,终于肝出了这题 其实楼上说的也差不多了,就是把区间拆掉然后莫队瞎搞 弱化版:bzoj [SNOI2017]一个简单的询问 那我先讲弱化版吧 可以发现 \[\sum_{x=0}^{inf}get(l_1,r_1,x)\times get(l_2,r_2,x)=\sum_{x=0}^{inf}get(0,r_1,x)\times get(0,r_2,x)-\sum_{x=…
题目描述 给一个树,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 点的…
题目链接:洛谷 又来做Ynoi里面的水题了... 首先换根的话是一个套路,首先以1为根dfs,然后画一画就知道以rt为根,x的子树是什么了.可以拆分为2个dfs连续段. 然后如果要计算\([l_1,r_1]\)与\([l_2,r_2]\)的答案,那么就是那么做一个二维差分就可以改成\([1,r_1]\)与\([1,r_2]\)的答案了.用\((r_1,r_2)\)做莫队就可以过了. 注意有一点,要去除那些不必要的询问,即\(r_1=0\)或者\(r_2=0\),这样就可以去掉大量的询问,不然会T…
题目描述 您正在打galgame,然后突然家长进来了,于是您假装在写数据结构题: 给一个树,n 个点,有点权,初始根是 1. m 个操作,每次操作: 1.将树根换为 x. 2.给出两个点 x,y,从 x 的子树中选每一个点,y 的子树中选每一个点,如果两个点点权相等,ans++,求 ans. 题解 lxl的大毒瘤题名不虚传 顺便先膜一下gxz大佬再说(毕竟像我这种菜鸡根本想不出这么巧的方法)->这里 首先,如果没有换根的话,那么可以直接把子树当成dfs序上的一段区间来做,那么只要把询问给拆成好几…
题目链接 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();…