03 2017 档案
摘要:考虑线段树。对于一段区间,记录它的最大斜率和只考虑区间内约束的答案。 合并时一段区间的答案就是左子区间的答案加上右子区间考虑左子区间约束之和的答案。 求一个区间约束为h的答案时,判断左子区间与h的关系。如果不大于h,答案就是右子区间约束为h的答案,否则递归左子区间。 时间复杂度O(nlog2n) 代
阅读全文
摘要:将左括号记为1,右括号记为-1,则一个合法的括号序列满足所有的前缀和非负。 用splay维护。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespac
阅读全文
摘要:不知道为什么,用模拟退火就WA了。。。 显然如果知道了总共购买几次,就可以贪心地求出答案。那么套个爬山就行了。 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cstring> 5 #include
阅读全文
摘要:这题正解是半平面交,但可以用模拟退火水过。。。 用模拟退火求x的值,然后二分求y的值就可以了。 当所有端点到这个点的直线按逆时针顺序时这个点可以看到任何位置。 代码: 1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #in
阅读全文
摘要:题目大意: 已知N个正整数:A1、A2、……、An 。今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小。 思路: 考虑模拟退火。每次先对每个数随机分在哪个组,然后每次退火随机一个数x,将其换到组y,取y时按温度分类: 若温度高,则此时不稳定,y取温度最小的组。 若温度低,则此时已经
阅读全文
摘要:模拟退火裸题(输出"nan nan"可以AC) 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdlib> 6 using namespace std; 7
阅读全文
摘要:令a[i]表示第i行总共加了a[i],a[j]表示第j列总共加了a[j],得到k个方程: a[i1]+a[j1]=c1 a[i2]+a[j2]=c2 ... a[ik]+a[jk]=ck 将i,j看成点,一遍dfs求出a并判断是否合法即可。 代码: 1 #include<iostream> 2 #i
阅读全文
摘要:代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 #define N 800010 8 #d
阅读全文
摘要:得到n+1个方程: (a1 1-x1)2+(a1 2-x2)2+..+(a1 n-xn)2=r2 (a2 1-x1)2+(a2 2-x2)2+..+(a2 n-xn)2=r2 ... (an+1 1-x1)2+(an+1 2-x2)2+..+(an+1 n-xn)2=r2 将后n个方程减去第一个方程
阅读全文
摘要:显然使A到B的最长边最小的路径一定在最小生成树上,否则一定可以使生成树更小。 求出原图的最小生成树,然后用倍增求路径上最大值就可以了。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue>
阅读全文
摘要:将序列分块。 令f[i][j]表示第i块到第j块的答案,可以O(n*sqrt(n))统计出来。 令sum[i][j]表示前i块值为j的数出现了几次。每次询问暴力统计零散的数对答案的贡献就可以了。 具体见代码 代码: 1 #include<iostream> 2 #include<cstdio> 3
阅读全文
摘要:直接分块就行了。注意要求出2和6的逆元。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 #define M 19940417 7 i
阅读全文
摘要:令f[i][j]表示前i个字符,匹配到不吉利数字的第j位的方案数。 枚举第i+1位,通过KMP求出前i+1个字符可以匹配到不吉利数字的第几位,递推。 但由于n<=109,要用矩阵乘法加速。 f[i][j]=a[j][0]*f[i-1][0]+a[j][1]*f[i-1][1]+...+a[j][m-
阅读全文
摘要:包含了link、cut、update、query操作。 更新时类似线段树就可以了。 代码: #include<cstdio> #include<iostream> #include<cstring> using namespace std; #define N 100010 #define M 51
阅读全文
摘要:考虑点分树。 求出每个重心所管辖的范围内的每个点到它的距离,建成点分树。 查询时二分答案,然后问题就转化为求到x的距离<=d的点的个数。 在点分树上暴力往上跑就行了,注意去重。 时间复杂度:O(nlog3n) 代码: 1 #include<cstdio> 2 #include<cstring> 3
阅读全文
摘要:画个图自己走一走,容易看出这是一个二分图。 那么答案就是二分图的最大点独立集。 二分图的最大点独立集=|V|-最大匹配数 最大匹配数用匈牙利算法求。 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using nam
阅读全文
摘要:其实就是卡特兰数的定义。。。 将放置一个1视为(1,1),放置一个0视为(1,-1) 则答案就是从(0,0)出发到(n+m,n-m)且不经过y=-1的方案数。 从(0,0)出发到(n+m,n-m)的总方案数是C(n+m,n)。 若一条路径经过y=-1,那么将其从(0,0)到y=-1的一段路径以y=-
阅读全文
摘要:与bzoj2187类似,不过是要先将小数转化成四舍五入前的分数 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 using namespace std; 6 #define ll
阅读全文
摘要:用类欧不断缩小规模,就能在O(T*log2n)时间内求出答案。 题解:http://blog.csdn.net/coldef/article/details/62035919 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream
阅读全文
摘要:先用floyd求出不经过大于i或大于j的点的i,j间最短路径,然后考虑这样建图: 对于每个点i,将其拆分成i、i',连边: s -> i' 容量为INF,费用为0 s -> 1 容量为k,费用为0 i' -> j 容量为1,费用为dist[i][j] i -> t 容量为1,费用为0 此时这张图的最
阅读全文
摘要:bzoj2227 看电影: 先打个暴力,然后找规律。得到答案:ans=(k+1)n-1*(k-n+1)/kn 正解:http://blog.lightning34.cn/?p=166 注意到答案很大,又由于n,k<=200,将k+1,k-n+1,k分解质因数,然后高精乘就可以了 暴力代码: 1 #i
阅读全文
摘要:先考虑没有深度限制的情况。 先将每个节点的权值设为1,对于颜色相同且在dfs序中最近的2个点,用倍增求出lca并将它的权值减一。然后子树中不同的颜色种数就是子树的权值和了。 有深度限制时,考虑以深度为时间建立主席树。 将每个点按深度排序,枚举一遍。对每种颜色开一个set,枚举到一个点时将它在dfs序
阅读全文
摘要:题目大意: T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n)。给出n和k,求S(n)。 例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55。 由于结果很大,输出S(n) Mod 1000000007的结果即
阅读全文
摘要:对于修改,将其splay到根再修改。 对于查询x,y路径上的权值和,先将x换到根,再access(y)、splay(y),sum[y]就是答案。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using names
阅读全文
摘要:只有cut和link操作的LCT 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 10010 6 int i,j,k,x,y,n,m,f[N],ch[
阅读全文
摘要:bzoj 4765 -- 分块+dfs序+树状数组: 考虑分块。将1~n分成sqrt(n)块,对每个点记录它在每个块中的祖先个数,修改一个点时枚举每一块修改。 查询[l,r]时如果一个块在[l,r]中,直接将其加入答案。显然只剩下O(sqrt(n))个点。求出树的dfs序,用树状数组维护就可以O(l
阅读全文
摘要:考虑建一棵树,对于一个点i,如果i+ki<=n,将i+ki作为它的父亲。那么答案就是这个点的深度。 由于有修改操作,用LCT维护这棵树,每个修改操作改变父节点就可以了。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4
阅读全文
摘要:用并查集记录每个联通块的根节点,每个联通块建一棵线段树,合并时合并线段树就可以了。 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 100010 6
阅读全文
摘要:简单的斜率优化。 首先得到DP方程: f[i]=max(f[j]+a*(sum[i]-sum[j])2+b*(sum[i]-sum[j])+c),j<i 其中sum表示前缀和 设j比k优 f[j]+a*(sum[i]-sum[j])2+b*(sum[i]-sum[j])+c>f[k]+a*(sum[
阅读全文

浙公网安备 33010602011771号