洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. 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],…
题目描述 您正在打galgame,然后突然家长进来了,于是您假装在写数据结构题: 给一个树,n 个点,有点权,初始根是 1. m 个操作,每次操作: 1.将树根换为 x. 2.给出两个点 x,y,从 x 的子树中选每一个点,y 的子树中选每一个点,如果两个点点权相等,ans++,求 ans. 题解 lxl的大毒瘤题名不虚传 顺便先膜一下gxz大佬再说(毕竟像我这种菜鸡根本想不出这么巧的方法)->这里 首先,如果没有换根的话,那么可以直接把子树当成dfs序上的一段区间来做,那么只要把询问给拆成好几…
传送门 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…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 复制 5 5 4 3 1 2 4…
话说这道题数据是不是都是链啊,我不手动扩栈就全 \(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=…
题目链接:洛谷 又来做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…
正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就欧克了QwQ #include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define gc getchar() #define ls(x) (x<<1) #define r…
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h> #define N 100005 #define Max 100000 using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigi…
点此看题面 大致题意: 有\(N\)只从\(1\sim N\)编号的袜子,告诉你每只袜子的颜色,\(M\)组询问,每组询问给你一个区间\([L\sim R]\),让你求出小Z随机抽出\(2\)只袜子时有多大概率抽到两只颜色相同的袜子. 题意转换 假设这些袜子中共有\(K\)种颜色,则对于第\(i\)种颜色的袜子,抽到两次的概率为\[\frac{cnt[i]*(cnt[i]-1)}{(R-L+1)*(R-L)}\] 那么,在整个区间中抽到两只相同颜色的袜子的概率就是\[\sum_{i=1}^K\f…
题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链,还可以处理 子树 ,因为: 节点 u 的子树中所有的点的编号都覆盖在 seg[u] 到 seg[u]+size[u]-1 这个区间内! 第二个认识是:线段树延迟操作的延迟标记不是标记自己,也就是说: lazy[rt] 并不是标记本身的延迟值,而是说 rt 本身有多少个延迟值没有传递给 rt<<1…