01 2016 档案
摘要:把环倍长,设w(i,j)表示对于i,决策j的价值,如果j在[i,i+n],那么w(i,j)=dis(i,j),否则w(i,j)=−dis(i,j)。 则w满足四边形不等式,最优决策满足完全单调性,分治求解即可。 时间复杂度O(nlogn)。 #include<
阅读全文
摘要:对于一个所选任务集合,如果对于任意时刻i,i前面所选任务数都不超过i的话,那么这些任务可以全选。 维护一棵线段树T,第i个位置一开始为i,每使用一个任务,[t,T]都要减1。 插入一个任务: 首先查询[t,T]的区间内第一个0的位置,记为k。 如果没有0,
阅读全文
摘要:设f[i]表示长度为i的不下降子序列的个数。 考虑容斥,对于长度为i的子序列,如果操作不合法,那么之前一定是一个长度为i+1的子序列,所以答案=∑ni=1(f[i]×(n−i)!−f[i+1]×(n−i−1)!×(i+1))。 时
阅读全文
摘要:对于一个合法的十进制数,它的所有后缀也是合法的。于是按位BFS,保留前导零,每次往前添加一个0或者1,直到找到第n个不含前导零的合法数为止即可。时间复杂度O(nl)。#include#define N 400struct Num{ int len,v[N]; Num(){for(...
阅读全文
摘要:考虑给定每个数字的个数,构造出这个序列:肯定是1 2 1 2 3 2 3 2 3 4 3 4 ... 最大值,或者1 2 1 2 3 2 3 2 3 4 3 4 ... 最大值 最大值-1。本质不同的情况只有这两种,且互相不交。设最大值为m,那么1到m都要有1个,剩下的数每多一个$i...
阅读全文
摘要:如果两个矩形相交且不是包含关系,那么完全可以让它们不相交。将坐标离散化后,设f[i][j][k]表示区间[i,j]纵坐标不小于k的部分的最优解。对于f[i][j][k],要么枚举分割线,分成两部分分别DP,要么放入一个尽量大的矩形,转化为子区间的问题。时间复杂度O(n4)。#i...
阅读全文
摘要:将所有点极角排序,建立线段树,线段树每个节点维护该区间内所有点组成的上下凸壳。对于一个查询,二分查找出相应区间的左右端点,在线段树上得到O(logn)个节点,在相应凸壳上三分查找出与斜边叉积最大的那个点,看看是否为正即可。时间复杂度O(nlog2n)。#include#include...
阅读全文
摘要:将所有权值离散化,建立权值线段树,维护区间内数字个数以及对数的和,用于比较乘积大小。对于每个连通块维护一棵权值线段树,合并时用线段树合并。对于操作3和4,暴力删除所有不合法节点,然后一并修改后插入线段树即可。时间复杂度O(mlogm)。#include#include#includeusin...
阅读全文
摘要:杨氏图表,维护若干个单调不下降队列。每次新加入一个数时,先考虑第一个队列:如果可以放在最后,则放在最后。否则找到最小的可以替换的替换掉,再将替换的数放入第二个队列,以此类推。最后ansi=∑ij=1tj。时间复杂度O(n2logn)。#include#define ...
阅读全文
摘要:因为a与n互质,所以对于0到n−1里每个i,aimod的值互不相同。设匹配成功的起点为i,那么可以得到3m段ai\bmod n的值不能取的禁区,每段都是连续区间。再枚举n-m+1到n-1的起点,这些单点也是禁区。找出所有禁区后,答案就是这些禁区的并...
阅读全文
摘要:首先将n的约数从小到大排序,设dfs(x,y,z)表示当前可以选第x个到第m个约数,还要选y个,之前选的乘积为z是否可能。爆搜的时候,如果从x开始最小的y个相乘也超过了n,那么就不合法,加上这个剪枝即可。#include#include#define N 2000...
阅读全文
摘要:对于每个询问,首先可以通过扫描线+线段树求出四个方向的第一个点,询问范围等价于框住这些点的最小矩形。对于一个点i,预处理出:A[i][j]:i往左下角按凸壳走到j时,凸壳上相邻两点的叉积和。B[i][j]:i往右下角按凸壳走到j时,凸壳上相邻两点的叉积和。$C[i][j]...
阅读全文
摘要:首先对所有单词建立AC自动机,S是T的子串等价于T的某个前缀通过fail链可以走到S的终止节点,即S的终止节点是T某个前缀在fail树上的祖先。设f[i]表示考虑了前i个单词,且第i个单词必选时子序列价值的最大值,则$f[i]=\max(单词i每个前缀的贡...
阅读全文
摘要:将选取的A看成左括号,B看成右括号,那么答案是一个合法的括号序列。那么只要重复取出k对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可。将(看成1,)看成-1,设s[]为前缀和。如果当前取出的是(),那么对前缀和的影响为[A,B-1]区间加1。如...
阅读全文
摘要:二分一个最大的位置x,计算t=\sum_{i=1}^k\lfloor\frac{x}{a_i}\rfloor。如果t\leq n,那么说明就算全部检票员都走到了这里,也不够n个指令,所以可以先将所有检票员尽量向x位置走,并将用掉的指令数扣除。然后将x适当往前调整,使得每个检票...
阅读全文
摘要:首先求出后缀数组,得到本质不同的子串的个数。然后二分答案,每次先通过后缀数组求出第mid小的子串,然后贪心进行检验。检验的时候,从后往前贪心,每次加入一个后缀,如果不能加了,那就划为一段。时间复杂度O(n\log n)。#include#include#include#define N 10...
阅读全文
摘要:设pre[i]表示第i个数上一次出现的位置,d[i]=abs(a[i]-a[i+1])。用线段树维护区间内a的最小值、最大值,pre的最大值以及d的\gcd。对于询问l\ r\ k,首先特判掉l=r或者k=0的情况。然后求出区间最小值和最大值、以及pre的...
阅读全文
摘要:枚举B串的每个后缀,统计出该后缀所有满足条件的前缀。考虑暴力搜索,设状态(x,y,z)表示当前需要考虑A从x开始的后缀,B从y开始的后缀,之前部分编辑距离为z。那么首先用后缀数组+ST表求出两个后缀的lcp,x和y都可以向右跳那么多,且不产生任何代价。如果此时匹配...
阅读全文
摘要:Link-Cut Tree维护。每个点x维护以下信息:v:这个点的点权s:实链上的信息和st:子树信息和(不包括链上)sa:子树+链上的信息和as:所有虚儿子的sa的和则有s[x]=v[x]+s[son[x][0]]+s[son[x][1]]st[x]=as[x]+st[son[x][0]]+st[...
阅读全文
摘要:注意到这个过程实质就是prim算法求最大生成树的过程。首先通过离散化+线段树将A+B个点缩为上下各O(n)个点。设已加入集合为S,未加入集合为T。建立两棵线段树,维护所有在T集合中的点,以及从每个点连出去的边。用一个大根堆维护所有横跨ST的边。每次取出堆顶的边,取出与这条边相...
阅读全文
摘要:设f[i][j]表示hp为i,在j点的概率,d[i]表示i的度数,w[i]表示经过i点要扣掉的血量。对于j到k这条边,f[i-w[k]][k]+=\frac{f[i][j]}{d[j]}。若w[k]>0,则直接将贡献加给f[i-w[k]][k],否...
阅读全文
摘要:过去的2015这一年,感觉非常漫长,发生了好多好多的事情。1月,翻译某道POI的时候被lavendir发现不是BZOJ权限用户,结果他居然把权限免费送给了我!打开了新世界的大门。2月,寒假写完作业无聊着没事干,随便切了几道水题,被家长发现,“离高考只有几个月了,要安心学习”,于是家长就开始监控我的提...
阅读全文