二分与三分
bestFy
世界上最最最渣的oier.
展开
-
bzoj1044: [HAOI2008]木棍分割
题面在这里 做法: 第一问直接二分答案。 第二问DP,我们定义f[i][j]f[i][j]表示前i根木棍分为j块的方案数。 首先要O(n)O(n)预处理出nxt[i]nxt[i]表示满足a[i]−a[k−1]<=resa[i]-a[k-1]<=res的最小的k。注意这里的a[]a[]是题目中数据的前缀和。然后转移方程是这样: f[i][1]=(a[i]<=res),f[i][j]=∑k=n原创 2017-12-14 22:07:25 · 221 阅读 · 0 评论 -
loj#2319. 「NOIP2017」列队(线段树+二分)
题面在这里 突然来填这个noip坑。顺便记一下一个可怕的错误。做法动态开点线段树+二分即可。 主要思想就是将题意转化为删除+插入操作,删除打1的标记。代码=> 用 while (q--) 的时候一定要留心看下下面有没有用到q =_=#include<bits/stdc++.h>#define rep(i,x,y) for (int i=(x)...原创 2018-04-27 08:47:04 · 351 阅读 · 0 评论 -
51nod1834 蛇爬树(二分查找+细节)
题面在这里题意有一个人在长为 nnn 的数轴上从 000 开始,每次向右走一步, x→x+1x→x+1x\to x+1 。同时给出 kkk 对关键点 ai,biai,bia_i,b_i ,如果走到 aiaia_i 就要跳到 bibib_i 。现在给出他每天走的步数,假如某天他往回走了他的速度会 ×2×2\times 2 。有 qqq 个询问,每次给出初始速度问最少多少天走到 nnn 。...原创 2018-04-04 21:41:37 · 1245 阅读 · 0 评论 -
Codeforces Round #471 (Div. 2)
比赛链接QAQ终于补完了这场的题。。感觉后面几题还都挺好的就写个(非常)简略的总结叭。A. Feed the cat简单贪心+模拟。#include<bits/stdc++.h>#define rep(i,x,y) for (int i=(x); i<=(y); i++)#define ll long longusing namespace std;...原创 2018-03-27 23:23:41 · 490 阅读 · 0 评论 -
poj3261 Milk Patterns
题面在这里题意:在一个串中找出重复出现次数至少为k的最长子串的长度。做法:首先跑出sa。 然后二分答案x,只要找到连续的一段height[i]>=x,如果这段的长度大于等于k-1就可行。 注意是k-1不是k。 因为height计算的是两个相邻排名的后缀的lcp,如果有k个串的最长公共子串都>=x,则只要他们之间的height>=x即可,他们之间只有k-1个height原创 2018-01-18 13:56:32 · 223 阅读 · 0 评论 -
poj3294 Life Forms
题面在这里题意:给你n个串,找出最长的出现在超过n/2个串中的公共子串。做法:首先二分一个长度x,然后问题转化为如何检验是否存在超过n/2个串的公共子串长度为x。 对于公共子串这个问题,马上想到后缀数组,因为height[]数组就可以巧妙地解决这个问题。 首先把所有串用一些不同的没有出现过的字符连接起来。跑这个大串的sa。 把所有后缀按照height分组,把heigh原创 2018-01-18 11:15:26 · 268 阅读 · 0 评论 -
spojPHRASES Relevant Phrases of Annihilation
题面在这里题意:求在每个字符串中都满足不重叠的出现次数>=2的最长子串。做法:拼接+二分答案+height分组。 首先将所有串用一些不同于串中字符的字符连接起来。(这些字符也要不相同)然后跑这个大串的sa。二分一个最长的长度x,按照height分组,height>=x的都是合法的,每连续合法的一段,要判断这一段里是否每个串(原来的)出现>=2次,并且最大的位置和最小的原创 2018-01-23 23:01:35 · 304 阅读 · 0 评论 -
bzoj1821: [JSOI2010]Group 部落划分 Group
题面在这里题意:平面上n个点要划分为k个部落,定义部落间的距离为部落中最近的两点距离。 现在要求部落间最近的距离最远。求这个距离。做法:显然可以二分答案。 二分这个最近的距离,于是任意两点距离比它还小的都要在一个部落里。 然后用并查集数一下连通块个数即可。 时间复杂度O(n2×log)O(n^2\times{log})代码:/**************原创 2018-01-05 16:41:20 · 261 阅读 · 0 评论 -
poj1743 Musical Theme
题面在这里题意:求n个数相邻两数差组成的数列中,两段不重叠的最长相同子串。做法:首先二分一个答案x,然后将SA[]分组,每一个height[i]>=x连续区间的SA[i]都分为一组。 对于每一个连续区间,这个区间任意两个后缀的lcp都>=x,所以我们找到最大和最小的SA[i],看是否能符合条件即可。代码最下面有一个博客链接,讲得挺详细,初学者可以看一看。 另外还有一原创 2018-01-13 16:35:28 · 236 阅读 · 0 评论 -
luogu4036 [JSOI2008]火星人(splay+二分hash)
题面在这里题意给出一个字符串,要求兹瓷动态插入/修改字符,询问x,y开头的后缀的lcp。保证字符串任意时刻长度 ≤105≤105\le10^5 。做法splay维护区间hash值。查询时二分+hash即可。代码=> 不得不吐槽bzoj的评测机速度 -.- 果断地去luogu上提交。=> 注意splay的一些细节。以及二分的边界r注意取min,...原创 2018-04-27 18:12:32 · 277 阅读 · 0 评论