摘要: 建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍 那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可 于是相当于要维护一个东西,支持:1.加边;2.删边;3.询问联通块的第k小 容易想到按秩合并并查集,考虑询问操作:用分块,维护每一个权值块的权值数 阅读全文
posted @ 2019-09-03 16:27 PYWBKTDA 阅读(465) 评论(0) 推荐(0) 编辑
摘要: 对于每一个节点,我们只需要知道他上len次插入(len是这个队列的元素个数)时所插入的元素就可以了 那么只需要将所有插入建为一棵树,然后找len次祖先就可以了,这个用倍增维护即可 还有一种比较神奇的做法,详见loj讨论(是我太菜了吧) 1 #include<bits/stdc++.h> 2 usin 阅读全文
posted @ 2019-08-29 16:45 PYWBKTDA 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 考虑二分求LIS的过程,就是维护一个序列,其中第i个数表示长度为i的最小结尾,而插入操作就是查找第一个大于x的位置并替换掉 用线段树维护,二分的过程也可以用线段树来完成,对线段树可持久化即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #de 阅读全文
posted @ 2019-08-29 15:09 PYWBKTDA 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 用f[i]表示以i这个值为结尾的最长上升子序列,考虑插入所产生的影响:1.因为插入顺序从小到大,因此不会改变现有的f值2.这个点f值就是所有位置在他之前的f取max再+1,而因为序列要支持插入操作,需要使用平衡树来维护 1 #include<bits/stdc++.h> 2 using namesp 阅读全文
posted @ 2019-08-27 09:00 PYWBKTDA 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 首先要知道一个式子:$\mu(lcm(i,j))=\mu(i)\cdot \mu(j)\cdot \mu(gcd(i,j))$(分是否为0讨论)令$d=gcd(i,j)$,$n'=\lfloor n/d \rfloor$,$m'=\lfloor m/d \rfloor$$\sum \mu(lcm(i 阅读全文
posted @ 2019-08-25 06:56 PYWBKTDA 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 首先计算出以1为左端点的所有区间的mex,考虑删除左端点仍然维护这个序列:设当前删除点下一次出现在y,y~n的mex不变,从左端点到y的点中大于删除值的点要变成删除值,因为这个是不断递增的,所以是一段区间,可以用线段树来维护。 1 #include<bits/stdc++.h> 2 using na 阅读全文
posted @ 2019-08-20 12:24 PYWBKTDA 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 定义状态f[i][j][k][x]表示有多少个i位数t有j位大于x,k位等于x,然而复杂度无法接受,发现可以改变状态为f[i][j][x]表示前i为有j个数字大于等于x的方案数,就可以快速转移了 1 #include<bits/stdc++.h> 2 using namespace std; 3 # 阅读全文
posted @ 2019-08-19 08:58 PYWBKTDA 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 分块,可以发现众数一定是整块的众数或在不整块中出现的数,预处理出f[i][j]表示第i块到第j块的众数,然后对于询问暴力枚举所有散块的数,相当于要支持查询一个数在一个区间内出现的次数,可以用可持久化权值线段树,也可以直接对每一个数开一个vector记录位置二分(离散),时间复杂度是$o(nKlog_ 阅读全文
posted @ 2019-08-18 09:08 PYWBKTDA 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 基本思路是,要让所有黑点都相对应(所以首先判断黑点的个数)。如果没有交换限制,可以按以下方法建图:源点向所有初始黑点连(1,0)的边,最终黑点向汇点连(1,0)的边,相邻的两点连边(inf,1),最小费用最大流即可。考虑限制,我们把交换分为两种:(将1)交换进来/交换出去,因此需要两条边(三个点)来 阅读全文
posted @ 2019-08-17 10:20 PYWBKTDA 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 可以发现k条白边的最小生成树可以用:1.求出黑边的最小生成树;2.贪心选择[白边-对应环上最大的黑边]最小的加入;3.重复2操作k次考虑如何模拟这个过程,由于每一次贪心的代价是单调递增的,所以可以二分确定最后一次代价mid,即每一次贪心都有白边-替换边<=mid如果将所有白边边权减去mid(记为白边 阅读全文
posted @ 2019-08-17 08:37 PYWBKTDA 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 考虑没有爆发,那么相当于是带权最小不可交路径覆盖,由于只能从编号小的到编号大的,因此一定是DAG,而DAG的最小路径覆盖可以拆点并跑最大流,那么带权的只需要跑费用流即可(S向i连(1,0)的边,i’向T连(1,0)的边,i向j’连(1,t)的边,其中i->j有时间为t的边)。考虑爆发操作,相当于让任 阅读全文
posted @ 2019-08-16 11:03 PYWBKTDA 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 发现5个点的联通情况仅52种,因此状压:令f[i][j]表示前i个点满足:1.前i-k个点是树;2.最后k个点连通性为j的方案数;3.最后k个点到前i-k个点有边,转移用矩阵乘法:暴力求出A[i][j]表示(连通性)从状态i转移到j的方案数,快速幂一下即可。 1 #include<bits/stdc 阅读全文
posted @ 2019-08-16 10:46 PYWBKTDA 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 根据$2^b$分组,组内处理出g[i][j]表示当容量为$j\cdot 2^{i}$且只能选b=i时最大价值,再组间dp用f[i][j]表示当容量为$j\cdot 2^{i}+(w\&(2^{i}-1))$且只能选$b<=i$时的最大价值(j的范围只有$\sum_{i=1}^{n}ai$,即使所有b 阅读全文
posted @ 2019-08-16 08:45 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 记源点为S,汇点为T,第i天裂成两个点,分别是i1和i2,表示剩余的毛巾(都是脏毛巾,因为一定可以做到每天不剩余干净的毛巾)和使用的毛巾(用来保证最大流符合条件),然后考虑以下边:1.S向每一个i1连一条(ni,0)的边,表示用过的毛巾;2.i2向每一个T连一条(ni,0)的边,表示消耗毛巾;3.每 阅读全文
posted @ 2019-08-15 13:30 PYWBKTDA 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 首先,源点向每一个车主连(1,0)的边,然后把每一个工人拆成n个点,第i个点表示修倒数第i辆车,那么这辆车对答案的代价就是time*i(time表示这辆车的时间,i表示倒数第i辆),就是说每一个车主向nm个工人的点连(1,time*i)的边。最后,每一个工人的点向汇点连(1,0)的边即可。 1 #i 阅读全文
posted @ 2019-08-15 12:25 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 不断删除重边,然后将两个点的边集启发式合并(要考虑到两棵树),合并时发现重边就加入队列,最后判断是否全部删完即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 set<int>s[N]; 5 map<int 阅读全文
posted @ 2019-08-15 10:36 PYWBKTDA 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 分块,对于sqrt(n)以内的点用二进制优化多重背包+前缀和来做,处理出f[i][j]表示前i种权值为j的方案数对于sqrt(n)以外的点有两个性质:1.与数量无关且数量不超过sqrt(n);2.权值相邻;3.那么一定可以用两种操作来构造出来权值序列:1.加入一个sqrt(n)+1;2.将现有数+1 阅读全文
posted @ 2019-08-15 08:55 PYWBKTDA 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j]表示第i个点在第j个时间从1到达的最晚出发时间,有转移方程$f[i][j]=max(f[to][x])(j\ge y)$,然而显然不能暴力转移。但通过这个可以发现f[i][j]的答案与j的大小没有直接关系,而是与能走哪些边有关。于是,将询问和每一个点边的y排序后,发现一条边如果之前搜 阅读全文
posted @ 2019-08-12 08:40 PYWBKTDA 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 点分治,当一个节点作为重心时,统计出:1.每一个点的深度;2.每一个点所能选择的路径对应点区间,可以发现这样的点数只需要nlogn。然后类似于bzoj2006超级钢琴的堆+线段树来做即可。 1 #include<bits/stdc++.h> 2 using namespace std; 3 #def 阅读全文
posted @ 2019-08-12 08:26 PYWBKTDA 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 发现是链上的问题,所以树链剖分发现要查询第k大,因为第k大不支持合并,所以要二分答案二分答案后相当于询问一些区间内大于某数的数个数,直接线段树套平衡树即可时间复杂度$o(nlog^{4}_n)$(跟$o(n^{2})$有什么区别)可以卡过 1 #include<bits/stdc++.h> 2 us 阅读全文
posted @ 2019-08-12 07:56 PYWBKTDA 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 可以发现一定只会填以某个字符为中心的最长回文串,然后用hash+二分/manacher求出以i为中心的最大的长度(即所有可能会填的回文串,共n个),将这些回文串根据左端点排序后贪心选择在当前位置之前最远的结束位置即可 1 #include<bits/stdc++.h> 2 using namespa 阅读全文
posted @ 2019-08-10 08:39 PYWBKTDA 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 考虑点分治,将询问离线后计算重心到每一个点的线性基,然后再询问重心到每一个点的线性基,时间复杂度为$o(3600q)$,可以过(然而太菜的我写了倍增维护线性基,震惊于倍增和线性基常数之小) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #def 阅读全文
posted @ 2019-08-10 06:28 PYWBKTDA 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 任选一条路径,考虑如果从一个点向另外一个方向走,该方向上一定有一个环(否则来去无意义),所以相当于一条路径+许多的环异或最大值,可以用线性基来求 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define 阅读全文
posted @ 2019-08-10 06:28 PYWBKTDA 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 先求出最小生成树,然后维护f1/f2[i][j]表示i到$2^{j}-1$祖先中最大和严格次大边,枚举生成树外的每一条边并查询这条边两点间的最大边和严格次大边,若最大边<插入边,就用插入边替换最大边计算答案,否则用插入边替换次大边计算答案 1 #include<bits/stdc++.h> 2 us 阅读全文
posted @ 2019-08-09 20:19 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 考虑LIS的一种求法:维护每一个长度的最小结尾,此时这个序列只与每一个数字有没有出现有关,用2^10状压,状压+数位dp即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 int t,k,a[21] 阅读全文
posted @ 2019-08-09 13:42 PYWBKTDA 阅读(132) 评论(0) 推荐(0) 编辑