自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

无尽

The road ahead will be long. Our climb will be steep.

  • 博客(27)
  • 收藏
  • 关注

原创 BZOJ 4242 水壶

最小生成树+倍增发现如果水壶是定值,那地图上肯定存在许多以建筑物为中心的联通块。并且随着水壶的增大,联通块大小也增大,有一些联通块会融合。因此考虑把所有建筑物丢到队列搞BFS。如果两个联通块碰到了,就给这两个建筑物连上一条边。如果两个联通块代表的建筑之间已经存在一条路径可达,就不连。这样连出来是一棵树,而且也是最小生成树。然而这样是错的,有一个反例,因为对于同一个距离,队列更新有先后顺序。先更新的点

2017-01-31 22:39:07 751

原创 BZOJ 4239 巴士走读

最短路和正解的做法不一样,不过都是 O((q+n)logm)O((q+n) logm )的。我的做法:最短路。把巴士看成点,并拆成入点和出点,边权为y-x(走它的意义是坐了这个巴士)。对于每一个原图的点u,把所有从这里出去的巴士按x排序,x小的前一辆i-1的入点向后一辆i的入点连边,边权x[i]-x[i-1](走它的意义是去考虑坐i号巴士并消耗等车时间)。把每一辆进入u的巴士的出点连向所有离开u的巴

2017-01-30 23:15:14 531

原创 BZOJ 4238 电压

tarjan脑补一下会发现合法的边一定在所有的奇环上,却不在任何偶环上。tarjan弄出一棵生成树,考虑每一条非树边,如果加上之后形成奇环则这个环上的边必选,否则必不选。对于不只含一条非树边构成的环,它一定能够被分成若干这些只含一条非树边构成的环,易证用小环来处理的效果能等价于大环。一个树边合法,当且仅当它被包含在所有奇环,不包含于任何偶环。一个非树边合法,当且仅当只有一个奇环(画图或脑补)。#in

2017-01-30 17:02:52 366

原创 BZOJ 4566 [Haoi2016]找相同字符

后缀数组 或 后缀自动机后缀数组的做法 O(nlogn)O(nlogn) : 串接起来。要求的就是后缀数组中不属于同一串的后缀的LCP。暴力做O(n2) O(n^2) 。发现我们一直都在区间取min,插一个线段树,每次找出最小的然后分两边做即可。(从大到小做,用并查集维护也很好)。这个方法复杂度不是很优秀,SA常数比较大,需要一个SA的优化技巧 if(m >= n) break; 即如果已经排完了就

2017-01-29 22:17:08 828

原创 BZOJ 4516 [Sdoi2016]生成魔咒

后缀自动机插入字符更新fail树即可。#include<cstdio>#include<map>#define N 100005#define A 28using namespace std;namespace runzhe2000{ typedef long long ll; int n; ll ans; struct SAM { map

2017-01-29 15:16:37 339

原创 BZOJ 4517 [Sdoi2016]排列计数

组合数+错排答案 = C(n,m) * h(n-m)#include<cstdio>#define MOD 1000000007#define N 1000005using namespace std;namespace runzhe2000{ typedef long long ll; int h[N], fac[N], inv[N]; void main()

2017-01-29 15:00:05 240

原创 BZOJ 4515 [Sdoi2016]游戏

李超线段树就是区间cmin一次函数,只不过被搬到树上来了。李超线段树标记永久化搞一搞就行了。O(nlog^3)具体地。每一个节点表示一个区间,存储一个一次函数,表示在该区间的优势一次函数,即能取到最小值的一次函数。更新的时候一整条往下扫一下即可。大年初一凌晨敲道农题压压惊UPD(2017.4.8):震惊!突然发现自己下面的代码是错的。注意下面代码里标记的地方。正确的代码附在后面了。话说这题数据好像不

2017-01-29 00:18:47 321

原创 CF 251D Two Sets

贪心+高斯消元显然从高到低按位考虑。如果这一位有奇数个1,那么这一位最终对答案的贡献肯定是1。如果有偶数个1,对答案的贡献可能是0或2。要最大化答案,因此我们需要更多的2。列出方程,系数ai,ja_{i,j}表示第j个数的第i位的值。变量xix_i表示第i个数是否归自己。要出现尽量多的2,只需让自己这边这一位的异或和为1即可。即a1x1^a2x2^…^anxn=1。判断如果无解说明不能做到,去掉该方

2017-01-28 16:51:10 597

原创 BZOJ 4444 [Scoi2015]国旗计划

破环为链+离散化+倍增环上问题一般转化为链上问题。本题破环为链之后再在末尾复制一条链,那么一个环上覆盖就等价于一个i~i+m的链上覆盖。对每一个点维护从它的左边最远能跳到的右边的点。发现这是一个树形结构。因此对于每一个询问倍增往上跳找到第一个点j满足j≥i+m。这样O(n*log^2)还注意到每个人的答案之差最多为1。假设不强制取任何人,此时最优解为A,那么显然强制取一个人的解是A或A+1。所以只要

2017-01-28 00:17:23 541

原创 CF 241D Numbers

搜索奇技淫巧题我们无视排列中所有>25的元素。因为由1~25组成的异或和为0的方案有1048576个,已经远大于50000。在这么多种方案下,一个序列拼起来模p几乎可以看作是一个随机函数,异或和为0跟拼起来模p等于0之间几乎没有相关性。那也就是说我们在1~25之内找不到合法解的概率是 (4999950000)1048576≈7.8∗10−10(\frac{49999}{50000}) ^ {104

2017-01-27 15:43:01 420

原创 CF 240F TorCoder

线段树题目名称有意思- -用线段树维护区间各个字母出现次数即可。 然后做回文串就贪心从小往大放。#include<cstdio>#include<cstring>#define N 100005#define A 27using namespace std;namespace runzhe2000{ char str[N]; int v[A]; struct se

2017-01-27 11:27:30 340

原创 CF 238E Meeting Her

最短路+搜索本题考察搜索的奇技淫巧,让我口胡一下先floyd把最短路跑出来。维护an[i]表示在i处且不在任何车上,到b的最少次数,那么最终答案是an[a]。正推无法更新答案,因为可能出现循环更新,我们考虑从终点逆推更新答案。初始设an[b] = 0。然后我们O(n^2)地暴力枚举每一条车的线路+暴力枚举每一个站点,O(n)dfs来找出所有an[i] = 1的站点。然后继续暴力算出所有an[i] =

2017-01-26 22:36:57 375

原创 BZOJ 4445 [Scoi2015]小凸想跑步

半平面交显然把三角形面积关系列出来就是一次不等式组,半平面交一下就行了。本题半平面交一定有解,不用判空集。调了半天发现式子算错了,脑残怎么治?#include<cstdio>#include<cmath>#include<algorithm>#define N 100005 using namespace std;namespace runzhe2000{ const doubl

2017-01-26 16:25:18 805

原创 BZOJ 4443 [Scoi2015]小凸玩矩阵

二分+二分图匹配题目转化为求k个行列不相交的数,最小化最大值。二分,行列看成二分图,进行匹配即可。坑爹,第k大是从大的开始算的第k个。语文好差呀。。。#include<cstdio>#include<cstring>#define N 255using namespace std;namespace runzhe2000{ int n, m, k, a[N][N], last[N]

2017-01-25 21:19:59 369

原创 CF 238D Tape Programming

链表+模拟VFK题解:应该能注意到这个编程语言有特殊性质即指针的移动是连续的,这意味着假设我们在开头处放置足够多的“>”,那么单独取一个区间出来执行时的程序一定是完整地执行整个代码的程序的一部分。于是我们可以做一个前缀和。f[i][d] 表示第i 个字符在准备第一次访问到的时候数字d 输出了多少次,g[i][d] 表示第i 个字符在指针准备从此处向左移走的时候数字d 输出了多少次。然后查询一段区间时

2017-01-25 20:05:33 646

原创 CF 235C Cyclical Quest

后缀自动机几天不碰SAM,已经对SAM一无所知了QAQ求x的同构,等价于把x复制一份贴在后面求xx的长度大于len(x)的子串出现次数,注意要判重。一时智障,把当前SAM匹配的节点的len直接当成真实匹配的len了。。。实际上需要记一个curlen表示当前匹配到哪一位才科学。#include<cstdio>#include<cstring>#define N 1000005#define A

2017-01-25 11:51:03 462

原创 FJOI2017 滚蛋记

在FJOI前面参加了几天的FJWC,下午打了一些模拟赛,大概的情况是:第一天犯傻爆零,有一天是第二名(这真是人生巅峰),还有两天十几名二十几名这样子。总的来说比较惨,毕竟我弱。主要说一下FJOI吧,共三题。先通读一遍题目,花一个小时干掉第三题FJWCD1T1原题,回头搞第二题。第二题,一看题目觉得和最大点独立集有关?可是独立集的那套理论我已经记不太清楚了啊。。。(我以前还专门整理过这些,这样忘掉了是

2017-01-24 17:32:24 2151 5

原创 BZOJ 3729 Gty的游戏

博弈论 + 平衡树这题的模型就是NIM游戏+阶梯博弈点这里查看阶梯博弈的解说 顺便附一点个人的记录与想法。设地板层数为0,则解体博弈等价于奇数层的NIM游戏取石子。证明:若奇数层异或值>0,显然可以构造出必胜策略,如果=0,显然对手就可以构造出必胜策略。推广到这题的树上也是一样。偶数层的石子都没啥用,对奇数层的石子做NIM游戏求所有奇数层节点值的异或和即可。同理于阶梯博弈,从奇挪到偶等价于取掉石子

2017-01-22 23:07:19 374

原创 BZOJ 2809 [Apio2012]dispatching

可并堆如果固定了管理者,那一定是贪心地选取子树内最小的若干个。因此用大根堆维护子树值,满足总和小于m,然后合并给父亲。#include<cstdio>#include<algorithm>#define N 100005#define ll long longusing namespace std;namespace runzhe2000{ int n, m, fa[N], mo

2017-01-20 23:34:46 270

原创 BZOJ 3622 已经没有什么好害怕的了

DP+容斥然而这题还是令我很害怕。 最值问题的DP一般考虑排序之后从小到大或从大到小,一个一个地考虑。对于这题,对A,B排序,记next[i]=j,表示最大的j满足B[j] < A[i],不难想到方程f[i][j]表示做到A的第i个,其中已经有j对满足A>B,然后转移 f[i][j] = f[i-1][j] + f[i-1][j-1] * (next[i] - j + 1)但是这显然是错的,因为

2017-01-18 20:51:01 371

原创 CF 484E Sign on Fence

可持久化线段树+二分简要题意:给出l,r,w,在[l,r]中找连续的长度为w的一段,最大化这一段中的最小值。最大化最小值,想到二分,那么check就应当是判断[l,r]内是否存在一段由大于等于二分答案的数所组成的长度≥w的连续区间。如果已经明确了这些数在哪里,这种查询是可以用线段树维护的。再考虑每一次实际上都是应用大于等于二分答案的所有数,删去小于二分答案的所有数。因此只需按数值从大到小维护可持久化

2017-01-14 22:05:53 342

原创 BZOJ 2865 字符串识别

后缀自动机+线段树考虑最终包含点i的仅出现一次的子串长什么样。记这个子串是[l,r]。l < i < r : 即i不碰到左右端点,对于这种情况,可以暴力在SAM上找出所有出现一次的串,用线段树更新答案。l = i ≤ r : 设以r为右端点的出现一次的最短的串为[l’,r],显然要有l≤l’。于是依然可以暴力找出所有出现一次的串,用r来更新[1,l-1]的答案。l ≤ i = r : 设以r为右端点

2017-01-14 20:33:00 466

原创 BZOJ 3998 [TJOI2015]弦论

后缀自动机弄子串不是SAM最擅长的事情吗。。。注意到SAM上的每一条路径都代表一个子串,所有子串在SAM上都有唯一路径,即它们一一对应。SAM是个DAG,因此本质不同的子串数就是DAG路径条数。T=0就暴力找第k小路径。T=1就求出每个节点的right大小,然后再找第k小。有一些小细节要考虑好,比如走到一个节点i时i->right不应该忽略,即也可以在i结束,然后再考虑i的转移。#include<c

2017-01-14 16:40:30 306

原创 BZOJ 2229 [Zjoi2011]最小割

最小割树关于最小割树的详细内容和证明,请看【ZJOI2016 day2讲课 无向图最小割】,这个东西自己找吧,我就不发了。。。默默摘抄一些Gusfield算法fa[u]在u被枚举到之前表示u所属点集的代表点,枚举到之后表示u在最小割树上的父亲。初始时所有点都属于以1为代表点的点集。从2到|V|依次枚举u,把u所在点集以u和fa[u]为源和汇拆分,所有被分到u侧的点x把fa[x]修改为u。注意枚举之后

2017-01-14 12:02:26 392 3

原创 BZOJ 2251 [2010Beijing Wc]外星联络

后缀数组建出后缀数组,按照排名遍历每一个后缀,对于每一个后缀sa[i],从sa[i]+height[i]枚举每一个子串,即可按字典序枚举所有子串(证明见下)。暴力跳height即可出答案。可以证明每一个子串至多被用上一次,因此时间复杂度O(n^2)。闲着无聊,证明一下为什么这样能够按字典序遍历所有本质不同子串。证明这样能够遍历所有子串。首先,每一个子串一定是一个后缀的前缀,所以一定会被遍历到。其次,

2017-01-07 22:42:11 309

原创 BZOJ 2440 [中山市选2011]完全平方数

二分+莫比乌斯函数+容斥原理方便起见,我们描述完全平方数及其倍数为不合法数,其余为合法数。二分答案x,找小于x的合法数有多少即可。然而这并不好找,我们来找不合法数。一个合数的平方的倍数一定也能写成一个质数的平方的倍数,因此只考虑质数的平方。一个完全平方数i2i^2,它的贡献⌊xi2⌋\left \lfloor \frac{x}{i^2} \right \rfloor。然而这样算是会算重的,比如36=

2017-01-06 23:31:20 290

原创 BZOJ 3238 [Ahoi2013]差异

后缀自动机+后缀树有一种不难想到的后缀数组的做法,详见黄学长题解然而我做这题的目的主要是熟悉一下后缀自动机和后缀树- -一个有趣的性质:反串的后缀自动机的parent树就是正串的后缀树,其树上的边权长度=parent树上儿子的len-父亲的len构出后缀树之后就是一个小DP啦。#include<cstdio>#include<cstring> #define N 500010#define S

2017-01-01 16:50:49 339

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除