
二分法
WerKeyTom_FTD
这个作者很懒,什么都没留下…
展开
-
JZOJ2939统计
题目大意及模型转换给定N个数(N<=10^5),现在有M(M<=10^5)个询问,每个询问形如区间L..R是否存在X。主席树显然离散化后用主席树。 这就是我看完题目后的第一想法。 但是,我们有更短的做法。离线大法请跟我把重要的话读三遍。 离线大法好 离线大法好 离线大法好 我们根据数值为第一关键字位置为第二关键字排序。 那么每个询问我们只需要二分出位置>=L中最小的数值为X的位置。原创 2015-09-04 15:46:36 · 578 阅读 · 1 评论 -
最长不下降子序列
题目大意a1=t0 an=(A*an-1^2+B*an+C)%D(n>1) 求该序列最长不下降子序列长度暴力n不是很大显然可以暴力。 n很大呢? 那就不断减循环节长度直至减到一个阈值内,再暴力。 正确性显然,只要阈值不要设太小。#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=原创 2016-12-23 22:32:52 · 505 阅读 · 0 评论 -
Tree
题目大意有一颗点权树,选择k条点不相交的树路径,价值为覆盖点的点权和除以k+1。 现在你可以给每个点的点权由x变成(x+c)%lim。0<=c<=m。 保证m<lim,x<limm<lim,x<lim。 求最大价值。分数规划先考虑不改变点权或是说点权已知的做法。 怎么做都发现如果要求用几条树路径的最大价值,都无法很快的做。 因此正解肯定不用求用多少每条树路径的最大价值。 考虑分数规划。二原创 2016-12-24 16:47:19 · 519 阅读 · 0 评论 -
[51nod 1184]第N个质数
题目大意找第n个质数,n<=1e9乱搞Drin_E大爷教我的洲阁筛。 但是好像不是正统。 我们可以二分,所以只是判断质数个数的问题。 设c[i]表示第i个质数。 f[i]表示i以内质数个数。 设g(n,m)表示n以内不被c[1~m]整除的数个数。 设q=√n,那么n以内质数个数为f[q]+g(n,f[q])-1(1不是质数要减去) 显然g(n,m)=g(n,m-1)-g(n/c[m],原创 2017-01-12 20:52:02 · 2546 阅读 · 0 评论 -
第K大
题目描述一棵具有n个节点的树,每条边(u,v)有一个边权w(u,v)。定义d(i,j)表示离点i第j近的点的距离,且d(i,1)=0。对于每个点i,给你一个Ki,要对每个点求出d(i,Ki)。点分治二分转为判定性问题。 提前预处理点分治树方便询问即可。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)u原创 2017-01-12 20:59:57 · 647 阅读 · 0 评论 -
[bzoj3721]Final Bazarek
题目描述有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价。做法首先肯定要取一个奇数,所以一定取最大的奇数。 一个奇数都没有可以直接-1了。 接下来奇数只能两个两个取,而偶数可以一个一个取。 而且肯定从大到小,所以先排个序。然后num[x]表示取x对奇数前缀和,sum[x]表示取x个偶数前缀和。 假设要取k个,而且我们取了x对奇数,贡献是num[x]+sum[k-2x] 所原创 2017-01-25 15:12:25 · 632 阅读 · 0 评论 -
[bzoj4755][JSOI2016]扭动的回文串
题目大意给定两个长度为n的字符串A和B。 扭动的回文串定义为a[i..j]与b[j..k]相接成的字符串为回文串或者a、b的一个回文子串。随便搞搞对a、b分别做一次manacher。 然后我们只需要考虑相接的扭动回文串。 枚举a中一个回文中心,即最后扭动回文串的回文中心,有一个结论最优一定是延伸到最长(即延伸到[l,r]使得[l,r]是最长以当前回文中心为回文中心的回文串)。 接着只需要看a原创 2016-05-23 21:26:45 · 2051 阅读 · 0 评论 -
[bzoj3072]Two Cakes
题目描述有两个长度为n的排列(1<=n<=1,000,000),然后你要再次写出一模一样的两个排列,于是你的左手和右手同时拿笔开始写。但是为了锻炼自己的协调能力,你不想左手和右手同时在写一模一样的数,每写一个数你就需要花1ms的时间,那么你要写完这两个序列至少要花多久时间呢?注:每个序列同时只准用一只手写。DP要注意到这是两个排列。。 最朴素的dp是设dp[i,j] 如果a[i]!=b[j],肯原创 2017-03-15 21:47:12 · 648 阅读 · 0 评论 -
[bzoj3492]Binary Dodgeball
结论我把乘2^k变成除以的话和原游戏当然是等价的。 这样的话我们把每个数二进制都写出来,每次就是去掉末尾几个0。 按照除lowbit部分分组,不同组之间互相独立。 每组的游戏可以这样描述: 有一群石子堆,每次从一个石子堆拿走至少一颗石子,若存在两堆相同的石子堆,则一起移走。 没有后面那个的话很容易知道就是nim游戏。 但其实我们可以把移走的两堆绑在一起,那么一个人操作其中一堆,另一个人就原创 2017-03-16 16:50:27 · 549 阅读 · 0 评论 -
IQ测试
题目描述PTY进行IQ测试,测试的项目是判断一个序列是否是另外一个序列删除若干个数字之后得 到的,PTY 深知自己的IQ 低于sqrt(-1),所以他请来了智商超高的你来替他解决问题。乱做水题#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;原创 2017-04-12 22:05:01 · 1109 阅读 · 0 评论 -
[bzoj3711]Druzyny
题目描述体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若干组,每一组都包含编号连续的一段小朋友,每个小朋友属于且仅属于一个组。 第i个小朋友希望它所在的组的人数不多于d[i],不少于c[i],否则他就会不满意。 在所有小朋友都满意的前提下,求可以分成的组的数目的最大值,以及有多少种分组方案能达到最大值。神题我们考虑DP。 f[i]表示将前i个人分组的最大值,-1表示不可能,g[原创 2017-05-26 16:55:35 · 945 阅读 · 0 评论 -
[LibreOJ β Round]ZQC的拼图
题目描述ZQC 和他的妹子在玩拼图。她们有 n (1≤n≤100) n \ (1 \leq n \leq 100) n (1≤n≤100) 块神奇的拼图,还有一块拼图板。拼图板是一个 m×m (1≤m≤100) m \times m \ (1 \leq m \leq 100) m×m (1≤m≤100) 的正方形网格,每格边长为 1,如图所示。每块拼图都是直角三角形,正面为白色,反面为黑色,拼图放在原创 2017-06-17 15:29:29 · 1287 阅读 · 0 评论 -
[CodeM初赛A轮]C
题解T在max和min之间无解。 考虑二分答案,然后判定很简单。 要注意一些坑点,比如解出来的体积小于0,以及没有进行任何二分判定等。 我的方法没过样例,但是过了这题……#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typ原创 2017-06-18 22:17:02 · 647 阅读 · 2 评论 -
[JZOJ5136][SDOI省队集训2017]重排
题目大意做法按拓扑序倒序做。 设出边个数为k。 没有自环可以考虑k^2从大到小枚举权值v然后two pointer来计算P(v)表示>=v的概率,最后前缀相减即可。 注意不要写成k^2带log。 这里很麻烦。 有自环可以考虑二分+判定。 具体见代码。#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b)原创 2017-06-09 22:12:37 · 589 阅读 · 0 评论 -
[bzoj4928][SDOI省队集训2017]dierti
题目描述对于一棵有根树,定义一个点u 的k− 子树为u 的子树中距离u 不超过k 的部分。注意,假如u 的子树中不存在距离u 为k 的点,则u 的k−子树是不存在的。 定义两棵子树是相同的,当且仅当不考虑点的标号时,他们的形态是相同的(儿子的顺序也需要考虑)。给定一棵n 个点,点的标号在[1,n],以1 为根的有根树。问最大的k,使得存在两个点u ̸= v,满足u 的k− 子树与v 的k− 子树相原创 2017-05-31 20:34:01 · 974 阅读 · 0 评论 -
[agc019c]Fountain Walk
前言这是一道比较简单的题。 但是我没想好答案增大的情况,所以我一开始觉得细节讨论有点麻烦。。题目大意不想说,看网站做法先通过一系列翻转交换等满足x1<=x2,y1<=y2。 我们注意经过温泉有减少答案(走1/4圆) 和增加答案(走1/2圆)两种。 我们不希望增加答案,希望尽量减少答案。 由于减少答案很少,矩形边长很大,因此我们不能为了走温泉绕弯路,只能向右向上走。 然后对这个矩形内的点按原创 2017-10-10 21:33:58 · 765 阅读 · 0 评论 -
[agc006d]Median Pyramid Hard
前言一道见过的题。题目大意一个长度为奇数的排列,令b[i]=median(a[i],a[i+1],a[i+2])。 median表示中位数。 不断执行上述变化序列最终变成1个数,它是什么?做法二分后变成01序列,考虑最终什么时候会是0。 我们发现相邻两个是同一个数字,这两列都是柱子,即从下到上都一样。 case 1:正中间是0柱子。 case 2:两边最近的柱子都是0柱子。 case 3原创 2017-11-01 14:51:45 · 676 阅读 · 0 评论 -
[arc069f]Flags
题目大意n个变量xix_i,每个变量等于aia_i或bib_i。 选择一种赋值方案,使得min(|xi−xj|)min(|x_i-x_j|)最大。二分答案二分答案后转化为2-sat问题,线段树优化连边即可。 (注意不能够自己连自己的另一半)#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using原创 2017-11-14 11:54:18 · 840 阅读 · 0 评论 -
[51nod 1309]Value of all Permutations
题目大意长度为N的整数数组A,有Q个查询,每个查询包含一个数M,对A的所有不同排列,执行find函数(需用到查询中的M),你来计算find函数的返回值的和。由于结果很大,输出Mod 1000000007的结果。find(int permutation_A[], int M){ x = Length(permutation_A) sum = 0 for(i = 0; i <原创 2016-12-09 22:44:44 · 498 阅读 · 0 评论 -
[bzoj3878]奇怪的计算器
题目大意一个计算器,数值范围在[l,r]。 有n条指令,每条指令: 1、把当前数x变成x+a 2、把当前数x变成x-a 3、把当前数x变成x*a 4、若一开始输入的数为t,把当前数x变成x+a*t 每次执行一条指令后,当前数需要对l取max,然后对r取min。 现在q次询问,问往计算器输入x得到什么?平衡树维护函数我们尝试建立一个自变量为输入的初始值因变量为执行完若干指令后的值得一个函原创 2016-12-06 16:42:56 · 1049 阅读 · 0 评论 -
[51nod 1294]修改数组
题目描述给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?做法对于i和j(i<ji<j),因为要严格递增所以a[j]-a[i]>=j-i。 我们把a[i]变成a[i]-i,在新数组上做最长不下降序列表示最多可以不修改几个数。 由于还要求是正整数,我们可以在数组最前面引进一个0,并要求这个0一定不能修改即可。#include原创 2016-12-12 22:00:06 · 548 阅读 · 0 评论 -
找数
题目大意及模型转换找出第N个最小素因子是P的正整数。 N,P<=10^9,如果结果超过10^9则输出0否则输出这个数。超过10^9我们先来处理结果超过10^9。 显然,对于一个质数p,第一个符合条件的是自己,第二个就是p*p。 我们发现p<=10^9,也就是说,n=1的情况所有质数都不会超过10^9。 超过的情况会从第二个开始。 那么首先可以知道,对于大于109−−−√\sqrt{10^9原创 2015-08-30 20:13:01 · 999 阅读 · 1 评论 -
蜡笔
题目大意有n(n<=100000)个三元组。现在你需要选k个三元组,使者k个三元组两两差异(差异定义为三元组每一项差值的最大值)最小。 三元组每一项都不超过255。二分实际上就是挑选k个三元组使得任意两个三元组中任意项对应元素差值的最大值最小。 最大值最小自然就是二分啦。 不过二分对应的是判定性问题,怎么办呢? 我们可以统计最多能挑选多少个,那么如果这个数量大于等于k,挑选k个自然没有问题。原创 2015-08-29 13:37:19 · 703 阅读 · 0 评论 -
火星菌
题目大意及模型转换:现在有这样一种填数约束,在区间l..r中填a..b的数,每个数只能填一次。那么需要满足:设mid=(l+r)/2,mid2=(a+b)/2。那么1、在区间l..mid中填a..mid2,在区间mid+1..r中填mid2+1..b。2、在区间l..mid中填mid2+1..b,在区间mid+1..r中填a..mid2。现在,要求你在区间1..2^K中填1..2^K,且若在相邻两原创 2015-08-11 16:31:13 · 903 阅读 · 0 评论 -
一种另类的思维——序列分割
原网址nurivf blog序列分割新方法我们知道序列分割是一道很经典的斜率优化问题,可以在NK时间内解决。 现在我们用一种新颖的做法,使复杂度降至N log inf。这样N与K都可以开到更大的范围。 题意及斜率优化做法参见我写的斜率大法题库。为了方便,我们将本题转化为:给定一个含n个数的序列,将这个序列划分为k段,使得每一段的平方和的总和最小 记s[i]表示前i个数的前缀和 那么我们可转载 2015-09-16 18:58:04 · 1024 阅读 · 0 评论 -
利用C++优势快速打完最长不下降子序列
n log n求最长不下降子序列我们设d[i]表示长度为i的最长不下降子序列最尾元素的最小值,显然d[i]<=d[i+1],d数组符合单调性。因此对于a[i]只需在d数组中二分即可。lower_bound与upper_boundlower_bound(a+l,a+r+1,key)表示在a数组的l~r范围进行二份查找(注意你需要保证这个数组的单调性,可以加cmp来表达他的单调性,默认单调性是非递减),原创 2015-11-02 19:13:57 · 2250 阅读 · 0 评论 -
[bzoj3456]城市规划
题目大意给你n个点(存在顺序性),初始无边,你可以任意加边。求满足以下条件的连通图数量:无重边无自环。答案模479∗221+1479 * 2 ^{21} + 1DP我们设f[i]表示i个点对应的答案。 正难则反,我们可以用总数量减去不合法数量。 总数量为2C2i2^{C_i^2} 如何不重复不遗漏统计不合法数量? 我们可以枚举i点所在连通块的数量,然后其他乱连, 也就是f[i原创 2015-12-23 20:31:28 · 1563 阅读 · 0 评论 -
[bzoj4326][NOIP2015]运输计划
题目大意树上有许多条路径,现在你可以将一条边的权值设为0,令所有路径的最大值最小。最长路径瓶颈我们注意到,设为0的边如果不在最长路径上,就不会减小答案。 因此我们可以找出最长路径,把原树转化为一条链+许多树的模型。 预处理出每个点i的from[i]表示由链上哪个点延伸的。 接下来我们可以枚举将链上哪条边变为0,则经过这条边的最长路径一定是最长链,我们只需维护出不经过这条边的最长路径。这个显然可原创 2015-11-13 21:29:56 · 1306 阅读 · 0 评论 -
[bzoj2440][zsoi2011]完全平方数
题目大意找到从小到大第k个不含有平方因子的数。二分答案+容斥原理首先我们可以很容易想到二分答案,然后转化为一个判定性问题。 那么现在要解决的是如何求1~n内有多少不含平方因子的数。 可以想到容斥原理。 即ans=∑(−1)i∗n以内含有至少i个平方因子的数ans=\sum(-1)^i*n以内含有至少i个平方因子的数莫比乌斯函数观察上面的式子,转化一下 ans=∑√ni=1n/(i∗i)∗(−原创 2016-04-13 21:26:59 · 768 阅读 · 0 评论 -
[bzoj4552][TJOI&HEOI2016]排序
题目大意有一个n的排列,进行m次操作,每次操作是将一个区间升序或降序排序。 请你输出m次操作后第p个位置的值。二分答案题解好机智! 我们二分答案x,然后就是判断a[p]>=x? 把原序列转化为01序列,0表示小于x,1表示大于等于x。 那么区间升序排序其实就是把0全放前面,1都放后面。 用线段树兹瓷区间赋值就好了。 然后只需要维护区间0的个数。#include<cstdio>#incl原创 2016-05-10 20:19:02 · 3080 阅读 · 2 评论 -
[bzoj十连测第二场 A]深邃
题目大意一棵树每个节点有颜色。 请将树分成若干连通块,使每个连通块均包含黑点。最小化最大的连通块的大小。二分看到双最直接二分。 二分了一个k,接下来怎么判定? 设f[i]表示以i为根的情况: 1、f[i]为正数,表示以i为根的子树内除了i所在连通块均合法,i所在连通块包含黑点时i所处连通块大小的最小值。 2、f[i]为负数,表示以i为根的子树内除了i所在连通块均合法,i所在连通块不包含黑点原创 2016-07-04 19:47:08 · 996 阅读 · 0 评论 -
[CC LEBOXES]buy
题目大意n个袋子,第i个袋子有pi几率装有vi金钱,否则装有一颗宝石。 有m个食物,第i个食物需要ci的金钱和di颗宝石,求最优情况下,期望买下食物个数。折半宝石个数不超过n。 设f[i,j]表示买下i个食物使用了至多j颗宝石最少花费的钱,可以dp出来。 然后对于袋子,我们折半搜索,先搜索前半部分,并根据宝石数分段,每段按照金钱排序,并统计概率前缀和。 然后搜索后半部分,假如搜出的状态是(v原创 2016-08-15 22:48:53 · 492 阅读 · 0 评论 -
[CF 513F2]躲藏
题目大意有一个人性别未定,其余都是男或女。 一个男的需要匹配一个女的,所有人都在一个n*m的网格上且有一个速度值,即移动一格所花的时间。有些格子是障碍无法经过。 求完美匹配的最少时间。网络流因为要完美匹配,所以无性人的性别可以确定。 计算两格间的最短路,然后连边。 二分答案,所有时间花费不超过二分的答案的边连上,然后跑网络流查看是否完美匹配。 然而我WA到调不出来,不放程序了。原创 2016-08-16 15:31:39 · 647 阅读 · 0 评论 -
[51nod1472/CF549F]取余最大值
题目大意有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0。 问这样的子段有多少个。笛卡尔树首先有一个想法,就是建立笛卡尔树。 那么对于一个节点,其作为最大值的区间是它的子树。 接下来我们考虑如何计算包含i的有多少个合法区间。 对于包含i的[l,r],sum[r]-sum[l-1]-a[i]是k的倍数。 我们全部模k,就会变成su原创 2016-09-25 08:27:11 · 1243 阅读 · 0 评论 -
挖金矿
题目大意一个n*m的网格,每列从上往下选取至少一个,求平均值的最大值。 n*m<=100000二分遇到这种平均值都可以二分判定。 二分答案ans,然后所有元素减去ans,每行贪心的选取最大前缀和,然后加起来看是否非负即可。 对于n*m<=100000,如果像我那么SB就开个n根号的数组吧……#include<cstdio>#include<algorithm>#include<cmath>原创 2016-10-06 07:39:47 · 757 阅读 · 0 评论 -
多段线性函数
题目描述三分大水?我们容易证明,fmin是一个非严格单峰函数。 对于一个xi,随着y的增大,它的贡献先是一个减量,再是一个为0的常量,最后是一个增量。随着y的增大,fmin的增量应该是增量和减减量和。因为每一个都是由增量变成减量,因此fmin的增量越来越大,所以fmin单峰。因为平板的存在,fmin只能算是非严格单峰函数。 因此我们考虑三分出极值,再二分出取值范围。 三分在有平板的情况下好像是原创 2016-11-10 16:12:12 · 843 阅读 · 0 评论 -
独木桥
题目大意在数轴上,初始有n个点,每个点有一个初始运动方向。 每个点的速度都是1/s 当两个点相遇时它们会改变自己的运动方向 q个询问每次询问求t秒后初始编号为k的点坐标是什么。经典好题结论1:相对位置永远不变。易证。 有了这个结论,我们相当于要求t秒后排名为rank[k]的点坐标。 结论2:可以不考虑变向。 因为现在与编号无关,两个点相遇转向可以理解为互相穿过。 结论3:初始方向相同的原创 2016-10-31 15:27:51 · 464 阅读 · 0 评论 -
兔子
题目描述在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝。更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连。换句话讲,这些兔子窝之前的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。 兔子们决定把其中K个兔子窝扩建成临时避难所。当危险来临时,每只兔子均会同时前往距离它最近的避难所躲避,路程中花费的时间在数值上等原创 2016-11-15 15:33:21 · 458 阅读 · 0 评论 -
[SRM553-1000]YamanoteLine
题目大意有一个n个点的环,相邻两个点距离是正整数。 现在有若干个约束,是以下两种其中之一: 1、S与T的顺时针距离不小于L。 2、S与T的顺时针距离不大于L。 问环总长的解的方案数。差分约束不妨设D[i]表示0与i的顺时针距离,特殊的,D[n]表示整个环的总长,设为X。 显然,D[i+1]−D[i]>=1D[i+1]-D[i]>=1,等同于D[i]−D[i+1]≤−1D[i]-D[i+1]原创 2018-02-27 16:32:17 · 659 阅读 · 0 评论