
zP1nG的bzoj
代码风格清新。
zP1nG
Only the Paranoid Survive.
展开
-
【bzoj 5127】数据校验(乱搞)
传送门biu~ 可以发现,如果区间[l,r]满足条件,那么它的长度为2的子区间一定满足条件;如果所有长度为2的子区间满足条件,那么这个区间也一定满足条件。所以只需要判断[l,r]之间是否有不满足条件的长度为2的子区间即可,用前缀和乱搞一下就可以了。#include<bits/stdc++.h>#define N 100005using namespace std;int...原创 2018-06-23 17:25:08 · 346 阅读 · 0 评论 -
【bzoj 5128】寻找母串(区间dp)
传送门biu~ 枚举长度是|T||T||T|因子的子串ttt,并进行判断。 设fi,jfi,jf_{i,j}表示子串T[i,j]T[i,j]T_[i,j]能否合法由t产生。 转移是:要么再末尾加长度为|t||t||t|倍数的区间,要么匹配1位t(j−i)mod|t|t(j−i)mod|t|t(j−i)mod|t|.#include&amp;lt;bits/stdc++.h&amp;gt;#de...原创 2018-06-23 17:29:07 · 420 阅读 · 0 评论 -
【bzoj 2654】tree(参数二分+最小生成树)
传送门biu~ 因为要固定白色边的数量,所以我们可以让“选取一条白色边”有一个代价。显然,随着“选取一条白色边”代价的降低,最小生成树上白色边的数目一定是不降的。因此我们可以二分这个代价,每次验证时让所有白色边权加上这个代价,然后跑最小生成树,最后再将这些代价减去。 因为保证数据合法,所以假设代价为mid时用的白色边数大于need,代价为mid+1时白色变数小于need,一定可以在代价为nee...原创 2018-06-24 08:26:49 · 406 阅读 · 0 评论 -
【bzoj 1913】signaling 信号覆盖(计算几何)
传送门biu~ 考虑贡献。我们可以发现,对于能组成凸四边形的四个点,它们对答案的贡献是2;对于能组成凹四边形的四个点,它们对答案的贡献是1。问题就转化成了计算凹/凸四边形的数量。 因为凹四边形和凸四边形的数量和是确定的C4nCn4C_n^4,而凹四边形还有着“有中心点”这个性质,所以我们选择计算凹四边形。 枚举凹四边形的中心点,将其它点按辐角排序。如果其余三个点到中心点的辐角差不超过ππ\p...原创 2018-06-24 08:44:53 · 323 阅读 · 0 评论 -
【bzoj 5390】F.糖果商店(背包DP)
传送门biu~ #include<bits/stdc++.h>#define inf 1000000000000000ll#define N 105#define M 100005using namespace std;int n,m,cnt,w[N],v[N],l[N],d[M];long long ans,f[M][N];long long dp(int i...原创 2018-06-25 16:45:28 · 676 阅读 · 0 评论 -
【bzoj 2383】ballons(单调栈)
传送门biu~ 对于一个气球i,如果它左边的某个气球j的右边有比j大的气球,显然j不会对i的大小产生影响。所以能够影响气球i的大小的气球集合是坐标递增半径递减的。 我们把这些气球放在一个栈里,从栈顶的气球开始考虑其对第i个气球的影响。第i个气球的半径初始化为上限ri,然后用栈顶的气球更新半径。 如果更新后第i个气球的半径比栈顶气球半径大,那么这个栈顶之后就没有用了,弹栈。如果此时栈非空,那么...原创 2018-06-26 11:21:52 · 605 阅读 · 0 评论 -
【bzoj 2820】YY的GCD(莫比乌斯反演)
传送门biu~ 参考博客:莫比乌斯反演#include<bits/stdc++.h>#define N 10000000using namespace std;int T,n,m,prime[N+5],mu[N+5],f[N+5];bool mark[N+5];void GetPrime(){ mu[1]=1; for(int i=2;i<=N...原创 2018-05-30 14:46:15 · 328 阅读 · 0 评论 -
【bzoj 3744】Gty的妹子序列(分块+树状数组)
传送门biu~ 默认按size=n−−√size=nsize=\sqrt{n}分块(求导个屁)。对于每个询问,有三个部分: ①对于大块之间形成的逆序对, 因为求长度为n的序列的逆序对数可以用树状数组在O(nlogn)O(nlogn)O(n\log n)的时间复杂度内完成,所以可以在O(nn−−√logn)O(nnlogn)O(n\sqrt{n}\log n)的复杂度内预处理ani,j...原创 2018-05-30 20:25:06 · 349 阅读 · 0 评论 -
【bzoj 3339】Rmq Problem & 【bzoj 3585】mex(可持久化线段树)
传送门biu~biu~ 两道题区别只在于ai的范围,显然>=n的那些ai都是没有意义的,因此两题相同。 权值线段树上的i点记录数字i的最右出现位置,查询区间[l,r]即为查询第r棵线段树上最小的i满足i最右出现的位置#include<bits/stdc++.h>#define N 200005using namespace std;struct Node{ ...原创 2018-06-08 16:11:11 · 395 阅读 · 0 评论 -
【bzoj 5329】战略游戏(圆方树+虚树)
传送门biu~ 对于原图建圆方树,每次询问在圆方树上建虚树,树上的每一个圆点都符合条件,统计圆点个数即可。#include&amp;lt;bits/stdc++.h&amp;gt;#define N 200005using namespace std;int n,m,tot,top,tim,TIM,s[N];int stac[N],dfn[N],low[N],dep[N&amp;lt;&amp;lt;1],val[...原创 2018-05-23 07:51:46 · 485 阅读 · 0 评论 -
【bzoj 3277】串 & 【bzoj 3473】字符串(后缀自动机)
传送门biu~biu~ 对于所有串建广义后缀自动机,沿着父亲指针不断向root走,把路径上的节点计数+1。为了避免出现重复,记录每个节点最后一次被哪个串访问,串在走的时候如果遇到了这个串已经访问过的节点就停止。 可以在parent树上dp出这个点到root路径上有多少子串出现了k次以上作为答案。最后把每个串在自动机上跑一遍,过程中每个访问到的节点答案的和即为每个串的答案。 复杂度不会证。...原创 2018-05-23 13:41:32 · 413 阅读 · 0 评论 -
【bzoj 3555】企鹅QQ(字符串哈希)
传送门biu~ 枚举不看字符串的每一位,用字符串哈希匹配。但是单模会WA,改成双模才能过。#include<bits/stdc++.h>#define N 30005#define base1 137#define base2 19260817#define pa pair<int,int>using namespace std;int n,ans,l...原创 2018-05-16 20:29:00 · 319 阅读 · 0 评论 -
【bzoj 2795】A Horrible Poem(字符串哈希)
传送门biu~ 如果一个长度为l的串s的循环节为n,那么需要满足n是l的约数且s[1,l-n]=s[1+n,l]。 所以对于每一个询问,枚举每个质因子,用哈希判断字符是否相等。#include<bits/stdc++.h>#define N 500005#define base 19260817using namespace std;int n,q,prime[N],c...原创 2018-05-18 14:48:18 · 670 阅读 · 0 评论 -
【bzoj 2260】商店购物 & 【bzoj 4349】最小树形图 (朱刘算法)
传送门biu~biu~ 只需要考虑第一次购买的顺序,然后剩下需要买的都按最小价格买。设一个虚拟节点0,原价购买i物品就从0向i连边,u对v有优惠关系就从u向v连边。跑朱刘算法即可。...原创 2018-05-18 15:06:39 · 357 阅读 · 0 评论 -
【bzoj 2653】middle(二分+可持久化线段树)
传送门biu~ 先二分答案,对于二分出的答案x,在序列中把大于等于x的值改为1,小于x的值改为-1,那么求区间[a,d]包含[b,c]的最大连续子段和,如果大于等于0说明答案大于等于x,如果小于0说明答案小于x。可以证明经过二分最后得到的答案一定在区间中。 我们可以对每个x序列建一棵线段树维护最大子段和。假设x排好序,每个x的序列跟前一个相比只有一个点的1改为-1,所以可以对线段树进行可持久化...原创 2018-05-14 11:35:06 · 317 阅读 · 0 评论 -
【bzoj 3245】最快路线(最短路)
传送门biu~ dis[i][j]代表到第i个点速度为j时需要的最少时间,spfa转移即可。#include&amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;gt;#define pa pair&amp;amp;amp;lt;int,int&amp;amp;amp;gt;#define N 155#define M 505using namespace std;int n,m,d;pa fr原创 2018-05-14 11:40:49 · 476 阅读 · 0 评论 -
【bzoj 1922】大陆争霸(Dijkstra堆优化)
传送门biu~ 对于每个节点,dis1表示走到这个点的最早时间,dis2代表解除了有关这个点的所有限制的最早时间,所以每个点最早到达时间为max(dis1,dis2)。在Dijkstra时,每到一个节点,就解除这个点对其它点的保护,当一个点的所有限制都被解除时,可以入堆。#include<bits/stdc++.h>#define N 3005#define M 7000...原创 2018-04-23 22:47:48 · 297 阅读 · 0 评论 -
【bzoj 4631】踩气球(链表+线段树合并)
传送门biu~ 先用链表将原序列链在一起,每次一个点的值被减至0时将这个点从链表中删除。即用链表维护每一个点左右第一个值不为0的点。 对于序列上的每一个点开一个值域为[1,n]的权值线段树。对于每个熊孩子区间[l,r],将l作为权值加入线段树r中。当一个点x的值被减至0并将被从链表中删除时,假设点x左边第一个值不为0的点为p,那么线段树x上每一个>p的权值,即每一个熊孩子区间,都会在点x...原创 2018-04-25 15:26:45 · 439 阅读 · 0 评论 -
【bzoj 3990】排序(DFS)
传送门biu~ 显然一个操作序列是否合法与操作序列的顺序是无关的,所以我们只需要知道某种操作选不选即可。可以从小操作向大操作枚举,这样一个合法的操作序列对答案的贡献为选择的操作数的阶乘。 对于第i种操作我们将序列分成2n−i段2n−i段2^{n-i}段,每段长度2i2i2^i。找到序列中不递增的段,如果这样的段超过两个,显然无法实现;如果不存在这样的段,则不用操作;如果这样的段有一个,判断将这...原创 2018-05-02 18:24:49 · 352 阅读 · 0 评论 -
【bzoj 4919】大根堆(set启发式合并)
传送门biu~ 假设是在序列上,就变成了nlogn的dp求最长上升子序列问题;假设是在树上,我们只需要在每个节点存下dp数组,然后用set的启发式合并将dp数组合并就可以了(代替Splay)。 #include<bits/stdc++.h>#define N 200005using namespace std;vector<int>e[N];multise...原创 2018-04-13 16:22:53 · 474 阅读 · 0 评论 -
【bzoj 2073】PRZ(状压DP)
传送门biu~ 把当前过去了哪些人进行状态压缩,枚举当前状态走的最后一批人来转移。#include<bits/stdc++.h>#define inf 0x3f3f3f3f#define lowbit(x) (x&(-x))using namespace std;int W,n,w[17],t[17],sw[1<<16],st[1<<16]...原创 2018-04-18 23:28:00 · 323 阅读 · 0 评论 -
【bzoj 2563】阿狸和桃子的游戏(贪心乱搞)
传送门biu~ 把每条边的边权平分给它连的两个点。因为最终求的是比分的差值,所以如果两个点被同一个人选取,那么这个人就会得到这条边的边权;如果被两个人选取,两个人的分值作差时会把边权这部分抵消掉。按大小顺序依次选取即可。#include<bits/stdc++.h>using namespace std;int n,m,a[10005],ans;int main(){ ...原创 2018-04-20 07:53:34 · 293 阅读 · 0 评论 -
【bzoj 5201】Connections(强连通分量)
传送门biu~ 只要跑一边Tarjan,记录选择了哪些树边和返祖边就好了。因为对于每个点,所选的与这个点相连的边的数量不会超过2,所以最终选择的边数一定少于2n。最后随便加边使边数到达2n即可。 ps.因为最后整个图也一定是强连通图,所以在Tarjan的时候完全不用stack和low[]。随便拿个dfn[]搞搞就可以了。#include<bits/stdc++.h>#defi...原创 2018-04-12 10:54:10 · 439 阅读 · 0 评论 -
【bzoj 5216】公路建设(线段树+Kruskal)
传送门biu~ 用线段树维护使用编号在[l,r]内的道路最终会选择哪些道路。即线段树每个节点记录一个边的集合,集合大小显然不超过n。 在合并两个区间的时候采用Kruskal用归并的方式合并(暴力)。#include<bits/stdc++.h>#define N 105#define M 100005#define inf 0x3f3f3f3fusing namespa...原创 2018-04-12 11:04:21 · 421 阅读 · 0 评论 -
【bzoj 4423】Bytehattan(平面图转对偶图+并查集)
传送门biu~ 把网格图转成对偶图,网格图删边相当于在其对偶图上连边,如果对偶图上要连边的两个点曾经连过边,就说明原图删边删出了个环,即原图不连通。用并查集维护联通性。#include<bits/stdc++.h>using namespace std;bool ans=true;int n,m;int father[1505*1505];int search(int ...原创 2018-03-26 20:25:17 · 351 阅读 · 0 评论 -
【bzoj 5200】Factor-Free Tree(分治+启发式分裂)
传送门biu~ 预处理每个点能作为树根的区间,即预处理出每一个数左边和右边第一个与它不互质的数的位置。可以发现对于一棵子树,以任一合法的点作为根都是一定成立的。用【bzoj 4059】Non-boring sequences的启发式分裂思想进行递归验证。时间复杂度O(nlogn)O(nlogn)O(n\log n)。#include<bits/stdc++.h>#define...原创 2018-03-27 18:34:58 · 838 阅读 · 0 评论 -
【bzoj 2555】SubString(SAM+LCT)
传送门biu~ 查询一个串出现了几次,即询问SAM上表示这个串的的Right数组有几个。当我们向SAM上添加一个节点时,这个节点在parent树上到根的路径上的所有节点Right数组数量都会+1。可以用LCT维护。 本来说快省选了在省选完挂之前写一道听起来很厉害的SAM+LCT,退役了也没什么遗憾了。没想到其实就是在维护SAM的时候顺便维护一个LCT,而且还1A了。生活失去了色彩,退役了退役了...原创 2018-03-30 11:28:54 · 415 阅读 · 1 评论 -
【bzoj 4887】可乐(Floyd+快速幂)
传送门biu~ 可以建一个虚拟节点表示自爆,虚拟节点不连出边。计算矩阵t次幂后1到每个节点的方案数和。#include<bits/stdc++.h>using namespace std;const int mod=2017;int n,m,t,ans;struct Matrix{ int a[35][35]; Matrix operator*(con...原创 2018-03-31 16:36:34 · 286 阅读 · 2 评论 -
【bzoj 4975】区间翻转(博弈论)
传送门biu~ 考虑序列中顺序对的个数。 ① 对于终止态,顺序对一定为0(偶数),此时先手必败。 ② 对于翻转的区间[l,r],可以视作将[l,r]内的顺序对数和逆序对数调换。 ③ 因为区间长度为4x+2或4x+3,带入可知区间内的数对数(即顺序对数+逆序对数)为奇数。 综上可知,令当前序列顺序对数的奇偶性作为当前状态,那么对于一个奇状态,必定会转移到一个偶状态;反之,对于一个偶状态,必...原创 2018-04-11 16:44:56 · 677 阅读 · 0 评论 -
【bzoj 4976】宝石镶嵌(贪心、高位前缀和)
传送门biu~ 当n-k>=16时,每一位上的1都可以出现,只需要考虑每位是否有1即可。 剩下的情况n最大只有115(数据范围瞬间变得友善了)。 令f[state]代表组合出state最少需要多少个数,跑背包即可。然后再将f[state]更新成组合出包含state这个集合的数最少需要多少个数,枚举每个状态的子集从大到小更新即可。 计算答案时,从高位到低位贪心,只要f[state]&l...原创 2018-04-11 17:12:29 · 392 阅读 · 0 评论 -
【bzoj 5281】Talent Show(分数规划的背包dp验证)
传送门biu~#include<bits/stdc++.h>#define N 255#define maxw 1005using namespace std;const double eps=1e-6,inf=1e6;int n,W,w[N],t[N];double v[N],f[maxw];inline bool check(double x){ fo...原创 2018-04-11 19:19:03 · 285 阅读 · 0 评论 -
【bzoj 4516】生成魔咒(后缀自动机)
传送门biu~ 求本质不同的子串个数,相当于把SAM上的每一个节点表示的长度范围大小(Max-Min+1)求和。#include<bits/stdc++.h>using namespace std;int n;long long ans;struct Node{ map<int,Node*>ch; Node* fa; int val;...原创 2018-03-26 09:43:31 · 264 阅读 · 0 评论 -
【bzoj 3926】诸神眷顾的幻想乡(后缀自动机)
传送门biu~ 题目中说叶子节点不超过20个,可以以每个叶子为根建广义后缀自动机,然后像【bzoj 4516】生成魔咒那样统计答案即可。#include<bits/stdc++.h>#define N 100010using namespace std;struct Node{ Node *fa,*ch[10]; int val; Node(in...原创 2018-03-26 16:44:03 · 217 阅读 · 0 评论 -
【bzoj 4698】Sandy的卡片(后缀自动机)
传送门biu~ 把原序列差分,建广义后缀自动机。再用原序列在SAM上匹配,对于每一个单词,把这个点到根的所有节点的sum值+1。假如一个点的sum值为n,那么说明这个单词在所有序列中都出现过,用val+1更新答案。为了避免重复运算,在节点上加时间戳。#include<bits/stdc++.h>using namespace std;int n,ans,a[1005][1...原创 2018-03-26 16:57:26 · 292 阅读 · 0 评论 -
【bzoj 1912】patrol 巡逻(树DP)
传送门biu~ 在加新路前每条边需要走两次,加一条新路(u,v)可以使总距离减小dis(u,v)。所以在k=1时只需求树的直径;在k=2时选两条路的路径长度和最大,将选择的两条路(u1,v1)、(u2,v2)在树上相交的部分抵消掉,可以在求完第一条最长路以后将这条路上的权值都改成-1,这样在跑第二条路的时候就可以看作相互抵消了。#include<bits/stdc++.h>...原创 2018-03-21 19:09:38 · 377 阅读 · 0 评论 -
【bzoj 1040】骑士(树DP)
传送门biu~ 如果是一棵树,答案显而易见。用f[i]代表以i为根的子树中选择i这个点的最大值,g[i]是不选择i这个点的最大值。递归求解即可。 对于一棵环套树,我们可以从环中任意选择一条边(u,v),u和v不能同时选择。我们可以先计算不选v的最大值,再计算不选u的最大值,最后取max即可。#include<bits/stdc++.h>#define N 1000010us...原创 2018-03-21 19:24:14 · 227 阅读 · 0 评论 -
【bzoj 2064】分裂(状压DP)
传送门biu~ 一种一定可行的方案就是用n次操作先把所有数合并,再用m次操作分开。总操作次数n+m。 如果对于第一个序列中的某个集合和第二个序列中的某个集合,他们的和是相同的,那么操作次数就可以少2次。也就是说把两个序列的集合分成尽量多的部分满足每个部分的和相同即为最优答案。 状态压缩,每次枚举每个状态的子集转移。 可以把第二个集合中的数存成负数,这样在计算时如果两个集合的数字和为0就是一...原创 2018-03-21 19:35:11 · 312 阅读 · 0 评论 -
【bzoj 2502】清理雪道(有源汇上下界最小流)
传送门biu~ 题目相当于给一个拓扑图,每个边的流量下界为1,求最小流。 首先跑出可行流。建超级源点SS和超级汇点TT。原网络中的T->S连一条流量为inf的弧。把每个点必须流入的流量从SS流入,必须流出的流量流进TT。从SS到TT跑最大流即为原网络满足所有下界的可行流,我们就可以知道原网络中的流量是多少。 对于原网络在求完可行流后的残量网络,无法保证是最小流。这时把原网络以外的弧全删...原创 2018-03-19 15:25:46 · 282 阅读 · 0 评论 -
【bzoj 3382】Cave Cows 3 洞穴里的牛之三(切比雪夫距离)
传送门biu~ 把曼哈顿距离用公式: ||x1−x2|+|y1−y2|=max{|(x1+y1)−(x2+y2)|,|(x1−y1)−(x2−y2)|}||x1−x2|+|y1−y2|=max{|(x1+y1)−(x2+y2)|,|(x1−y1)−(x2−y2)|}||x_1-x_2|+|y_1-y_2|=\max\{|(x_1+y_1)-(x2+y2)|,|(x_1-y_1)-(x2-y2)...原创 2018-03-14 16:54:24 · 391 阅读 · 0 评论 -
【bzoj 3170】松鼠聚会(切比雪夫距离)
传送门biu~ 原问题是求一个切比雪夫距离,我们像【bzoj 3210】花神的浇花集会那样把问题转化为曼哈顿距离。 维护x、y的前缀和,很容易就可以求出某个点的答案,时间复杂度O(nlogn)O(nlogn)O(n\log n)。#include<bits/stdc++.h>#define N 100050using namespace std;int n,X[N]...原创 2018-03-14 20:18:23 · 344 阅读 · 0 评论