bzoj
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1031[JSOI2007]字符加密Cipher(拆环变链,利用sa数组)
挺裸的一道后缀数组。。注意是环,把他在后面复制一遍再做就好了。。#include #include #define N 200005char s[N];int n,rank[N<<1],st[256],rank1[N],count[N],sa[N],tmp[N];int main(){// freopen("a.in","r",stdin); scanf("%s",s+1原创 2017-07-17 16:32:14 · 380 阅读 · 0 评论 -
bzoj1717(poj3261) [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组,二分答案)
给定一长度为N的数字序列,找出在序列中重复出现了至少K次的最长子串。二分答案。利用h数组判断即可。按h分组,连续大于等于x的分在一组,他们肯定有相同的前缀,统计次数即可。#include #include #include #define N 20005int n,m,a[N],aa[N];int rank[N<<1],count[N],rank1[N],sa[N],t原创 2017-07-17 16:35:51 · 400 阅读 · 0 评论 -
bzoj1692 [Usaco2007 Dec]队列变换(后缀数组)
DescriptionFJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”。在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过。 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首字母取出,按它们对应奶牛在队伍中的次序排成一列(比如说,如果FJ带去的奶牛依次为Bessie、Sylv原创 2017-07-17 16:45:39 · 367 阅读 · 0 评论 -
bzoj4199[luoguP2178]品酒大会[noi2015] (后缀数组+并查集)
bzoj上居然没题面。。可怕。洛谷上都有。首先,r相似其实就是lcp为r。那么就有个显然的做法。每次枚举lcp,按h分组,一组内有cnt个,则答案就是在cnt个数中选两个,C(cnt 2)。符号不会打,意思到了就好。。然后最大值。。想想怎么维护就好了。直接看代码吧。然后就可以拿到50分。而正解是这样的:r相似是不是至少有r+1相似个?那么r+1相似有多少个是不是跟r相似没啥关系??所以我们原创 2017-07-18 22:59:15 · 444 阅读 · 0 评论 -
bzoj4542 [HNOI2016]大数(莫队+离散化+数学)
首先有一个性质:如果A*10^k+B=B(mod p),且p和10^k互质,则A%p=0。那么,要判断一个s[l...r]是否是p的倍数,只要判断s[l...n]和s[r+1...n]在模n的意义下是否相等。于是,我们可以预处理出每一个后缀s[i...n]对p取模的结果a[i]。然后对于一个询问[l,r],就转化成了询问[l,r+1]中有多少对相同的a[i]。用莫队算法就可以解决了。当原创 2017-07-19 15:38:29 · 390 阅读 · 0 评论 -
bzoj2120 数颜色(莫队)
带修改的莫队板子。听说按n^ 2/3分块更快??其实无非就是多了个修改,我们为每一个询问打上一个时间戳。然后照做无误就好了。只是在每一次做之前,先看看时间戳对不对。。不对的就给他暴力改对。所以对每一个修改我们要记该位置改之前和改之后是什么样子的。。#include #include #include #include #define ll long long#define N 200原创 2017-07-19 16:34:47 · 326 阅读 · 0 评论 -
bzoj3289 Mato的文件管理(树状数组求逆序对+莫队+离散化)
首先明确,求交换次数最小其实就是求逆序对的个数。可以用树状数组方便地进行求解。然后题目没说文件大小的范围,我们就赶紧怕怕的采取了离散化。我们还发现这题可以O(logn)的由[l,r]=>[l-1,r]等等。。所以,莫队,就是你啦!具体细节见代码。#include #include #include #include #include using namespace std;#def原创 2017-07-19 16:41:11 · 404 阅读 · 0 评论 -
bzoj3781 小B的询问(莫队)
赤裸裸的莫队。#include #include #include #include #define N 50005using namespace std;int n,m,k,a[N],f[N],ans=0,block=0,ANS[N];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(ch==原创 2017-07-20 16:53:39 · 281 阅读 · 0 评论 -
bzoj4745[USACO16DEC]Cow Checklist (DP)
d数组是两点间距离的平方,提前处理。状态数O(n2)O(n^2),决策数和转移都是O(1)O(1)的原创 2017-07-30 20:35:19 · 480 阅读 · 0 评论 -
bzoj1270 [BeijingWc2008]雷涛的小猫(dp)
比较水的dp,dp[i][j]表示高度为i,在第j棵树上时能获得的最大值。状态转移方程:dp[i][j]=max(dp[i+1][j],dp[i+del][?])+f[j][i]。为了让决策变成O(1)的,我们带着个数组f。f[i]表示在高度i时能获得的最大值。这样决策就变成O(1)得了。转移是O(1)O(1)的,状态是O(nh)O(nh)的,总的时间复杂度是O(nh)O(nh)的。原创 2017-07-30 21:30:04 · 285 阅读 · 0 评论 -
bzoj3052 [wc2013]糖果公园(树上莫队,带修改)
树上莫队参见spoj_cot2,带修改莫队参见bzoj2120.这道题就是把这俩和在一起了╭(╯^╰)╮。bzoj上时间很宽松。。大家如果没把握还是不要去爆oj了的好。给大家推荐个好地方UOJ,这题的题号是58。可以先在那过了再说。。uoj的评测机好好的说。。顺便我树上莫队也是从建了uoj的vfk那里学来的。。大家可以去搜一下他的博客。我在这里放链接是不是算侵权??不懂。。只能orz神犇。(因为打原创 2017-07-21 21:19:46 · 614 阅读 · 0 评论 -
bzoj1597 [Usaco2008 Mar]土地购买(变形+斜率优化)
一开始的题目,只是给我们n块随机的地,让我们分组,可以往的1D1D形式的dp一般都会要求每组中序号都是连续的,这样我们才可以进行dp。那此题怎么办呢?首先有个显然的优化:如果x1<=x2&&y1<=y2则(x1,y1)完全可以和(x2,y2)打包在一起购买而不用付出额外的花费,因此(x1,y1)就可以不再考虑了。所以我们把所有的地按x为第一关键字,y为第二关键字进行升序排序,把可以和别的地“打包”购原创 2017-08-07 17:54:27 · 382 阅读 · 0 评论 -
bzoj3809 Gty的二逼妹子序列(莫队+分块)
很显然的做法是莫队+树状数组,但是我T了。。是我姿势不对么。。。可能常数起飞了吧。。比较好的方法是莫队+分块。对权值分块。那么每个询问就变成了求区间和,可以在O(sqrt(N))解决,而每次莫队的转移则变成了O(1),那么总的复杂度就是O((N+M)*sqrt(N))了,可以过。至于分块大小,我试了试sqrt(n),sqrt(n/2),sqrt(n*2/3),运行时间都差不多。。。#inclu原创 2017-07-23 13:10:44 · 317 阅读 · 0 评论 -
bzoj4829 [TJOI2017]dna(后缀数组)
luogu3763有题面可以去看的说。。大牛分站开o2优化了(没错我就是这样才过的。)后缀数组处理一下lcp,然后枚举三次就好了。bzoj上我的总是T。嗯,一定是姿势不对。。不过我看神犇们都是用SAM写的,贼快。我也要去学习一下。。#include #include #define N 200005char s[N];int tst,n,len1,len2,m,st[N][19],lo原创 2017-07-23 13:20:00 · 591 阅读 · 0 评论 -
bzoj1009 [HNOI2008]GT考试(KMP+DP+矩阵倍增)
f[i][j]表示前i位准考证号,匹配到了不吉利串第j位。我们考虑如何将f[i][j]转移到f[i+1][j].首先用kmp处理出fail数组,假设现在在做前i位匹配到了第j位,那么对于i+1位可能出现的每个字符我们都从j开始匹配,看能转移到哪里去。就是这样: f[0][0]=1; for(int i=0;i<=n;i++){ for(int j=0;j<m;j++){ for(i原创 2017-07-23 21:58:51 · 404 阅读 · 0 评论 -
bzoj3670 [noi2014] 动物园(kmp改编)
解释写代码里了。。noi出这样的题可是很神奇哟。(像我这样的蒟蒻可能场上也不一定能写出来吧。。)#include #include #define ll long long#define N 1000010#define mod 1000000007int tst,fail[N],cnt[N],m;char s[N];inline void getfail(){ //c原创 2017-07-23 22:57:08 · 330 阅读 · 0 评论 -
bzoj3437小P的牧场(斜率优化)
这题就是锯木厂那道的简化版。。只不过是每个点之间的距离都变成1了。。详见锯木厂。f[i]=min{f[j]+c[i]-c[j]-sw[i]*(i-j)| 0<=j< i}+a[i]。表示在i建控制站,上一个控制站建在j所需的最小花费。假设k1< k2且k1优于k2,则有(f[k2]-f[k1]+c[k1]-c[k2]+sw[k2]*k2-sw[k1]*k1)/(sw[k2]-sw[k1])>i。因此原创 2017-08-08 14:57:18 · 335 阅读 · 0 评论 -
bzoj4518 [Sdoi2016]征途 (斜率优化)
求方差的套路见过了,所以直接A掉了hh 答案表示一下就是∑i=1m(x¯−xi)2m∗m2\frac{\sum\limits_{i=1}^m(\overline{x}-x_i)^2}{m}*m^2,其中x¯=∑i=1mxim\overline x =\frac{\sum\limits_{i=1}^mx_i}{m},记前缀和sum,则sum[n]显然就是∑i=1mxi\sum\limits_{i=1原创 2017-08-08 17:38:07 · 383 阅读 · 0 评论 -
bzoj3675 [APIO2014] 序列分割(斜率优化)
首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的。再对乘积进行重分组(还是乘法分配律)我们可以转化为:ans=∑第 i 段×前 i-1 段的和,那我们可以认为这k+1段是从左到右依次分出来的。假设目前这段是j+1…i,则他对答案的贡献为(sum[i]-sum[j])*sum[j].这样就很容易可以得到O(kn2)O(kn^2)的状态转移方原创 2017-08-08 16:24:31 · 371 阅读 · 0 评论 -
bzoj1355: [Baltic2009]Radio Transmission(kmp求循环节)
画画图发现,就是m-fail[m]。。。#include #include #define N 1000010int fail[N],m;char s[N]; inline void getfail(){ int k=0;fail[1]=0; for(int i=2;i<=m;++i){ while(k&&s[k+1]!=s[i]) k=fail[k]; if(s[k+1原创 2017-07-24 16:37:15 · 370 阅读 · 0 评论 -
bzoj4698 [Sdoi2008] Sandy的卡片(后缀数组+二分答案)
差分,就像poj1743那样,多个串的最长公共子串,就像poj3450那样。然后就过了。据说kmp也可以写过这道题。。。各位可以试试。#include #include #define N 1100000int n=0,m=4000,tot,belong[N],s[N],ans=0;int sa[N],rank[N<<1],rank1[N],tmp[N],count[N],h[N];原创 2017-07-24 17:44:12 · 367 阅读 · 0 评论 -
bzoj1087 [SCOI2005]互不侵犯King(状压dp)
压缩每一行的状态,1表示放国王,0表示不放国王,则一行有2n2^n种状态,预处理每行的可能合法状态,即相邻的位置不能同为1,顺便记录cnt,表示此状态放了多少个国王(即状态i有多少个位为1)。然后再预处理相邻两行的合法状态(相同位置不同为1,左上右下相邻位置不同为1,左下右上相邻位置不同为1)。dp[i][j][k]表示前i行一共放了j个king,第i行状态为k的方案总数,则 dp[i][j][k原创 2017-08-16 10:11:29 · 288 阅读 · 0 评论 -
bzoj1725 [USACO2006NOV]Corn Fields牧场的安排(状压dp)
跟上一题很像啊。。这题n=12,每行的状态也不太一样,所以我们就不预处理了。dp[i][k]表示第i行的状态为k的合法方案,等于第i-1行状态为j且j,k可以为相邻行的方案数的和原创 2017-08-16 10:44:48 · 435 阅读 · 0 评论 -
bzoj1925 [Sdoi2010]地精部落(dp)
程序5分钟,思维两小时hh。 问题就是求长度为n的排列满足抖动序列的个数。我们首先要发现答案是具有对称性的,即如果存在一个排列满足答案且第一个数为山峰,则一定还存在一个排列满足答案且第一个数为山谷(把原排列中的每个数x都换成n+1-x即可),推广一下:如果存在一个长度为i的序列满足要求且第一个数为山峰的话,则一定还存在一个长度为i的序列满足要求且第一个数为山谷(把这i个数从小到大排列,分别为a[1原创 2017-08-16 14:54:54 · 373 阅读 · 0 评论 -
bzoj2538&&hdu4844 [CTSC2000]公路巡逻(dp)
黑书1.5.2例题2 公路巡逻 首先对于时刻的处理,我们以六点整为0s,把所有时刻都换成s。然后根据最大和最小速度以及10Km,我们可以知道目标车从i关口到i+1关口需要300~600s的时间,到达i关口的最小时间为(i-1)*300,最大时间为(i-1)*600.我们设k为相邻关口行驶时间的可能数目(300),则最大时间是O(nk)的,用dp[i][t]表示在时间t到达关口i,与巡逻车最少相遇的原创 2017-08-02 12:22:12 · 663 阅读 · 0 评论 -
bzoj1899 [Zjoi2004]Lunch 午餐(dp)
首先不难证明吃饭慢的人一定要先打饭。(吃饭快的排在他前面,那只会使最后所有人吃完饭的时间更长)因此,我们先以吃饭时间由大到小排序,这样就可以只用排队时间来表示状态了。f[i][j]表示前i个人在1号口打饭排队所花的时间为j时所有人吃完饭的最小时间,sum[i]为排队时间的前缀和,则在2号口打饭排队所花时间为sum[i]-j.对于第i个人,无非两种决策: 1.在1号口打饭,则f[i][j]=max{原创 2017-08-16 19:53:02 · 390 阅读 · 0 评论 -
bzoj1831 [AHOI2008]逆序对(dp)
设f[i][j]表示第i个空缺填j,前i个空缺产生的逆序对个数的最小值,然而我们发现这样无法进行转移。。因为不知道前面几个空缺都填了什么。然后我们机智的猜想:让空缺填的数单调不降,两两空缺之间均不构成新的逆序对。我们来证明一下:对于两个空位a和b,分别填入数x和y,且x< y。 如果我们交换x和y,会有如下性质: 1.[1,a-1]和[b+1,n]中的数与x y构成的逆序对数不变。 2.[a+原创 2017-08-16 21:37:50 · 289 阅读 · 0 评论 -
bzoj3342 教主的魔法(分块+二分查找)
题意:维护一段序列,两种操作:A.询问[l,r]大于等于v的有多少个。M.[l,r]都加上v分块练习。。对于区间加法,区间内的整块直接O(1)标记,对于剩下的两头的部分暴力更新。对于查询:每一块我们都保证是有序的(暴力更新后的块要重构),那么对于区间内的整块,我们直接二分查找,剩下的两头的部分我们暴力统计即可。#include #include #include #include原创 2017-07-20 18:02:58 · 357 阅读 · 0 评论 -
bzoj2038[2009国家集训队]小Z的袜子(hose)(莫队板子)
给定序列a[1]~a[n],a[i]表示i的颜色,多次询问区间L~R中选出两个位置颜色相同的概率N,Q若我们已知L~R区间出现的颜色为c1~ck,次数cnt1~cntk概率表达式?若我们已知[L,R]的信息(cnt,P),我们可以O(1)将它更新为[L+1,R]/[L-1,R]/[L,R-1]/[L,R+1].此即为莫队算法。我们将询问以[(l-1)/sqr原创 2017-07-11 14:47:23 · 422 阅读 · 0 评论 -
bzoj4887 [Tjoi2017]可乐(dp+矩阵倍增)
f[0][i][t]表示第t秒到i的全部方案(含之前已经在i炸掉的)f[1][i][t]表示第t秒到i而且还在i没炸的方案数,则 f[0][i][t]=f[0][i][t-1]+f[1][j][t-1]+f[1][j][t-1]|i,j之间有边 f[1][i][t]=f[1][j][t-1]+f[1][i][t-1]|i,j之间有边 t=10^9,需要矩阵倍增加速。#include <cstd原创 2017-08-17 14:31:08 · 863 阅读 · 0 评论 -
bzoj2251 [2010Beijing WC]外星联络(后缀数组+暴力)
求所有出现次数大于1的字串。。用后缀数组处理出h数组,每个子串第一次出现时,往后扫,看重复了几次。n=3000,暴力即可。原创 2017-08-03 12:58:59 · 452 阅读 · 0 评论 -
bzoj1008 [HNOI2008]越狱(组合数学+快速幂)
求越狱的可能状态数,不太好求。我们转化一下:用所有的状态数(mnm^n)-不会越狱的状态数(m∗(m−1)n−1m*(m-1)^{n-1})即可。原创 2017-08-09 22:58:27 · 378 阅读 · 0 评论 -
bzoj3230 相似子串(SA+lcp+二分)
首先用后缀数组处理出h数组。因为要问子串的排名,所以我们再记一个数组num[i],表示前i个后缀有几个本质不同的子串。然后我们用二分查找就可以找到排序后的第i个子串是谁了。然后就是求一下lcp了。。还有反过来的lcp。。算清角标就好了。。还有很坑的一点:可能有超过int范围个实质不同的字串=,=.#include <cstdio>#include <cstring>#include <algor原创 2017-08-03 16:20:00 · 457 阅读 · 0 评论 -
bzoj2751 [HAOI2012]容易题(数学+快速幂)
答案是求合法序列的积的和,其实就是每个位置的合法值的和的积,即 (可以把前m-1个位置相同的式子提出来,发现乘的就是第m个位置的合法值的和,以此类推。)这样的话,虽然位置有10e9个,但是有限制的位置最多10e5个,剩下的位置的合法值的和都是sum(n*(n+1)/2),可以用快速幂进行计算,对于有限制的位置单个计算(排序后即可)。时间就可以过了。原创 2017-08-09 23:02:27 · 393 阅读 · 0 评论 -
bzoj1334 [Baltic2008]Elect(贪心+背包dp)
首先根据他的描述,为了保证合法,我们往不到n/2个人的组合中加比这些党的最少人数都少的人进去超过了n/2则一定合法。即我们把n个党按人数从大到小排序,进行01背包,看最多能装多少。(注意只能从n/2及以下转移) tips:我一开始脑残的加了剪枝。。我也很迷。原创 2017-08-17 22:04:55 · 543 阅读 · 0 评论 -
bzoj4870 [Shoi2017]组合数问题(dp+矩阵倍增)
翻译一下题目:实际上就是要我们从nk件物品里面选出若干件,使得其数量模k等于r的方案数。f[i][j]表示前i件物品拿了若干件使得其数量模k等于j的方案数。显然有dp方程:f[i][j]=f[i-1][j]+f[i-1][j-1]。初始值:f[0][0]=1.用矩阵快速幂加速一下就好啦。时间复杂度为O(lognk∗k3)O(lognk*k^3)原创 2017-08-10 23:30:24 · 507 阅读 · 0 评论 -
bzoj1084 [SCOI2005]最大子矩阵(dp)
因为m<=2,就两种情况,所以分开做就好了。 1.m=1.那就是找k段连续和最大。dp[i][k]表示前i个数选k段的最大和。不选的话dp[i][k]=dp[i-1][k],选取j+1…i做为第k段的话,值为dp[j][k-1]+sum[1][i]-sum[1][j],取最大即可。 2.m=2.dp[i][j][k]表示第一列前i个,第二列前j个,一共选了k个矩阵。 (1)可以不选: dp[原创 2017-08-04 14:12:52 · 348 阅读 · 0 评论 -
bzoj2875 [noi2012]随机数生成器(矩阵倍增)
挺裸的矩阵倍增。。。就是再处理一下ll*ll.思想类似快速幂,例如对x*y,把x变成二进制,y去倍增,每次都mod m,变乘法为许多次加法,保证不会溢出。原创 2017-08-10 23:31:37 · 439 阅读 · 0 评论 -
bzoj1609 [Usaco2008 Feb]Eating Together麻烦的聚餐(dp)
dp[i][1/2/3]表示把前i个变成以1/2/3结尾的合法队列的最少改动数,正着倒着各做一遍取最小。O(n)O(n)#include <cstdio>#include <cstring>#define N 30005int n,a[N],dp[N][4],ans=0;inline int min(int x,int y){return x<y?x:y;}int main(){//原创 2017-08-04 17:21:33 · 298 阅读 · 0 评论 -
bzoj1492 [NOI2007]货币兑换Cash(斜率优化+CDQ分治)
这个大坑,终于填上了=,= 首先理论来自论文,点此查看 题目很长。。耐心读。。首先我们注意到这句话: **必然存在一种最优的买卖方案满足: 每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券。** 分析一下这句话:首先是卖出假设我们手中有一堆A券和一堆B券 选择在一些天数分天卖出,那么这些天中一定有一天,卖出同样比例的证券可以获得的钱最多,我们选择这一天全部卖出 一定比分天卖出更优原创 2017-08-11 19:27:51 · 370 阅读 · 0 评论