上一页 1 ··· 12 13 14 15 16 17 18 19 20 ··· 31 下一页
摘要: 给n<=100000的树,每个点有权值和代价,有m<=1e9的容量,问:一个点权值*子树内代价总和不超过容量的最大点数的最大值。 其实就是要合并。平衡树、线段树、可并堆挑一个。 可并堆由于没法二分,故“正难取反”,维护最大的,在不够装时弹掉。 1 #include<string.h> 2 #incl 阅读全文
posted @ 2018-01-11 09:53 Blue233333 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 可并堆模板??又敲了一次,一遍过,很好。 1 #include<string.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<math.h> 5 //#include<assert.h> 6 #include<algorithm> 7 / 阅读全文
posted @ 2018-01-11 08:55 Blue233333 阅读(155) 评论(0) 推荐(0) 编辑
摘要: n<=1e6个数,把他们修改成递增序列需把每个数增加或减少的总量最小是多少? 方法一:可以证明最后修改的每个数一定是原序列中的数!于是$n^2$DP(逃) 方法二:把$A_i$改成$A_i-i$,变论文题:论文 大概证明是这样的:考虑合并两个区间的答案,假如一个区间答案是{u,u,u,……,u},另 阅读全文
posted @ 2018-01-11 08:24 Blue233333 阅读(142) 评论(0) 推荐(0) 编辑
摘要: #include #include #include //#include #include //#include using namespace std; int n,m; #define maxn 200011 int root[maxn]; bool die[maxn]; int find(int x) {return root[x]==x?x:(root[x]=find(root[x]... 阅读全文
posted @ 2018-01-10 18:42 Blue233333 阅读(159) 评论(0) 推荐(0) 编辑
摘要: n<=10000000的图,满足:如果(i,j)>1就连一条边权1的无相变,问所有d(u,v) (u<=v)--u到v的最短路之和。 首先1和>n/2的质数都是孤立的点。然后两个数x,y如果(x,y)>1最短路就1,如果(x,y)=1且x,y都不是1或>n/2的质数一定能走,具体这么走:$P_x$- 阅读全文
posted @ 2018-01-10 10:56 Blue233333 阅读(294) 评论(0) 推荐(0) 编辑
摘要: n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1、两两比一场,比完连个图,边i->j表示i赢了j。2、连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1、2,直到每个强连通分量大小为1.i<j时i有a/b的概率赢j,问每个人比赛的场数的总和的期望,答案%998244 阅读全文
posted @ 2018-01-09 21:43 Blue233333 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 平衡树并不是之前没写过,觉得有必要把平衡树变成考场上能敲的东西,也就是说,考一道诸如“维修数列”这样的送分题,要能拿满分。 维修数列。给定一个数列支持以下操作: 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。第2行包含N个数字,描述初始 阅读全文
posted @ 2018-01-09 19:41 Blue233333 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 现有串x=11110000,y=11001100,z=10101010,通过这三个串只用与或非三种操作到达给定的串,优先级非>或>与,可以加括号,问表达式最短的里面字典序最小的是谁,有<=10000个询问。 一个串,经过某种变换,到达另一个串,这种转移关系用图论极其合适。那么问题就转化成了一个最短路 阅读全文
posted @ 2018-01-09 14:32 Blue233333 阅读(347) 评论(0) 推荐(0) 编辑
摘要: n<=1000,m<=30000的图,问割掉边权和尽量小的0、1或2条边使S和T不连通,输出割了哪些边,无解-1. 道理是很好懂的,先随便找S到T的一条路径,找不到输出0,找到的话这条路上至少有一条边要删,那枚举一下割谁,对剩下的图再做tarjan即可。复杂度(n*m)。 然而!!写起来是很难写的。 阅读全文
posted @ 2018-01-08 21:56 Blue233333 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 一开始有一空串,n次操作,每次在串末尾加入一个字符问最小循环节。要求在线与可持久化。 如果只是在线的话那是很简单的,答案是!!$i-fail[i]$,其中$fail[i]$是KMP中的失配函数。 但如果可持久化的话: 一、复杂度难保,因为过程不连贯,没法用普通KMP那种复杂度的证明。 二、给出的字符 阅读全文
posted @ 2018-01-08 10:42 Blue233333 阅读(742) 评论(1) 推荐(0) 编辑
摘要: t<=5次询问每次问一个<=1e6的串的$\sum_{i=1}^{n} (num_i+1)$,其中num[i]表示既是前缀i的前缀又是前缀i的后缀且这两部分不重叠的子串的数量。 方法一:在KMP树上倍增!吃枣药丸+tle+制杖 方法二:开另一个数组记下每个点在KMP树中的深度,另外开一个指针记下“前 阅读全文
posted @ 2018-01-08 09:29 Blue233333 阅读(313) 评论(0) 推荐(0) 编辑
摘要: n<=500,n*n的矩阵,m<=60000个询问每次问子矩阵第K小。 方法一:第K小什么的是可以二分的,那就整体二分套二维树状数组吧! 这里有一个细节优化,本来整体二分是logMax的嘛,可以先把数字排个序,就变成logn了。这是没优化的后果(话说3个log确实极卡) 方法二:分块,n*n个数字从 阅读全文
posted @ 2018-01-08 08:39 Blue233333 阅读(171) 评论(0) 推荐(0) 编辑
摘要: n<=50000个vector进行m<=50000次操作:1、一区间的vector插入一个数;2、查询一区间中的vector中的所有数的第k大。 方法一:普通线段树套权值线段树!…… 方法二:单个询问是可以二分的,那就整体二分吧。这次是用线段树维护,把所有数字反过来求第k小再反过来就是第k大,注意5 阅读全文
posted @ 2018-01-08 07:36 Blue233333 阅读(165) 评论(0) 推荐(0) 编辑
摘要: n<=10000个数有m<=10000个操作,1、询问一个区间的第k小的数;2、单点修改。 带修主席树。 整体二分。 整体二分的必要条件: 1 #include<string.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 //#include<asser 阅读全文
posted @ 2018-01-07 21:24 Blue233333 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 给n<=10^700,问1到n中每个数在各数位排序后得到的数的和。答案膜1e9+7。 一看就是数位DP啦。。然而并没有什么思路。。 可以尝试统计n(i,j)表示数j在第i位的出现次数,知道了这个数组后就可以算答案了。可以枚举j,做一次DP,f(a,b,0/1)--考虑第a~n个数,有b个j,是否大于 阅读全文
posted @ 2018-01-06 11:04 Blue233333 阅读(436) 评论(0) 推荐(0) 编辑
上一页 1 ··· 12 13 14 15 16 17 18 19 20 ··· 31 下一页