用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\) 为根时的子树中,那么我们求出 \(…
题目描述 给一个树,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 点的…
Portal --> bzoj4940 Solution (原题这题面到底是..怎么回事啊深深的套路qwq) 感觉自己对根号的算法还是很..没有感觉啊== 实际上这题和bzoj5016没有任何区别的感觉...那个换根操作不过是一个幌子而已,处理出\(dfn\)序之后根据当前根\(rt\)的\(dfn\)序和\(x\)的子树范围的关系可以直接将查询变成\(dfn\)序上的至多两段区间 然后就变成了和bzoj5016一模一样的东西..只是区间可能有两个这样的话直接两两组合一下什么的就好了 ​ 具体的…
洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. 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…
话说这道题数据是不是都是链啊,我不手动扩栈就全 \(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=…
看到这个标题立刻想到:. “绝地科学家,八倍不屏息啊,八百里外把头打啊...” 首先我们发现如果只考虑第二个操作,这棵树就是假的,我们可以直接莫队解决 如果考虑换根的话...可以把一个操作换成小于等于9个操作就可以了 当然怎么换,有一些非常恶心的分类讨论 嘤嘤嘤 YNOI 题是好题 但是要卡常 首先要fread & fwrite 然后需要wxh的莫队写法 然后要算一下分块大小 sqrt(q_size) -> (n / sqrt(q_size)) 40 -> 100 嘤嘤嘤 #inclu…
题目链接:洛谷 又来做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…