- 博客(81)
- 收藏
- 关注
原创 CDQ分治优化DP
昨天被学军的公开赛虐傻了,才发现自己还不会用CDQ优化DP,吓得赶紧去填坑。。。普通的CDQ就是对二分操作,计算前半部分的插入对后半部分的询问的影响。那么如何用CDQ优化DP呢?看一道例题:NOI2007 cash很容易推出平方的dp方程:f[i] = max(f[i-1], f[j]/(R[j]*A[j]+B[j])*R[j]*A[i] + f[j]/(R[j]*A[j]
2015-06-28 22:10:51 1603
原创 [bzoj 3531]sdoi2014 旅行
一眼树剖题对每种颜色开一颗线段树,动态开点,记录最大值与和,查询直接查找,修改的话只会修改单点,所以最多增加2logn个节点(原来把题目看错了,以为修改也是修改连续一段的,似乎这样空间会大很多)
2015-06-22 08:04:54 667
原创 KD-Tree入门
经过这几天研究kd-tree,我可以说kd-tree就是按照基本的思路随便写就可以了吗?以二维平面为例,在二维平面上有若干点,我们如何建立kd-tree?第一层以x坐标的中位数将所有点分为两部分,分别放到左右子树上,第二层以y坐标的为中位数再将当前的集合平分,第三层依然以x坐标……如此递归下去。以查询最近点为例,我们在当前节点上找到查询点应被分在哪一个子树上,优点遍历这个子树,如果在此
2015-06-20 07:39:09 2551 1
原创 XJOI NOI2015训练题7 题解
T1、原本以为是水题的,但是题目里有这么一句话”不模1e9+7“。。。。可以注意到上下左右都要求单调增,那么状态就很好确定了f[i][j]表示第一行放了前i个格子,第二行放了前j个格子,并且这些数都是小于等于i+j的转义很好写:f[i][j]可以推给f[i+1][j]和f[i][j+1]。需要时时保证i>j另外注意此处格子是否可放。由于不取模,需要用高精。但是实现只有0.2
2015-06-13 21:58:19 995 1
原创 [bzoj 3626] LNOI2014 LCA
神题!虽然想到离线,但是还是只会随机数据的做法。。。。有一个比较有意思的结论:把点i到根的所有点权值设为1,其他点为0,此时j到根的所有点权和即为dep[LCA(i,j)]不难发现,这个方法满足加法性质。把询问查分,从1到n处理每个点,将其到根的权值+1,询问只要看这个点到根的权值和就是LCA的深度和了!LCT维护即可#include #include #inclu
2015-06-13 21:55:09 674
原创 SPOJ GSS2
求最大子段和,但是相同的数只算一次。在现很难完成,可以考虑离线。离线方法很trick把原数组按读入顺序加入,用s[i]维护s[i]到当前加入的和(不重复计算)如何维护这个和?很简单,只要用线段树把pre[i]+1~i的s都加上a[i]即可把询问按照右端点排序,对于询问[l,r],我们只要在加入r之后查找s[l~r]曾今的最大值即可这个怎么用线段树维护?可持久化?似乎会爆空间
2015-06-13 21:33:28 770
原创 [bzoj 4080] Wf2014 Sensor Network
will讲的题,网上几乎都是用随机化算法过得,代码短的出奇,为了维护标算的尊严,我决定推广一下表算。。。。你敢信这题是二分图最大独立集!?枚举距离不超过d的两个点,已这两个点为圆心,距离为半径分别作圆,会形成如下的图形可以看到上半部分的点之间距离小于等于d,严格来说是小于确定两点之间的距离。下部分同理。但是上下部分的点之间距离可能超过d,在这些点对之间连一条边。求最大独立集
2015-06-13 07:58:20 1024
原创 [bzoj 2653] middle
陈老师的神题,先拜一下求中位数用二分的方法很容易想到。可以想到我们把二分到数x后,把小于x的定义为-1,大于等于x的定义为1,只要求出一个子序列和大于等于0就说明中位数大于等于x(题目中的n/2是向上取整的)然而之后我并不知道怎么做一般我们建立主席树都是按照数组下标顺序来建的,这题比较奇葩。假设我们只需要查询中位数为x的时候,最大的子序列和是否大于等于0,会做吧——直接弄出
2015-06-13 07:14:20 736
原创 [bzoj 2654] tree
跪神题,跪秒题大神zy!很多人的第一想法就是选前need小的白边,再放黑边,很不幸这是错的正确解法很有启发性。如果我们按照正常的选边来做最小生成树,如果选出的白边大于need条,我们就需要少选一些的白边,否则我们就需要多选一些白边。如何才能少选一些白边呢?我们可以该白边全部加上一个正数,同理我么可以多选一些白边。这样我们就可以二分了!但是这还有一些问题,假设我们二分得到
2015-06-11 22:18:50 822
原创 莫队算法小结
终于把糖果公园a掉了,写点小结冷静一下(由于博主现在思维混乱,所以请用混乱的思维来阅读本篇文章)1、小z的袜子这算是鼻祖了吧。把序列分成sqrt(n)块,把询问先按左端点所在的块顺序,再按右端点升序排序,可以证名这样暴力移动左右端点最多达到O(n^1.5)的复杂度简单吧code是很就以前写的了,很丑勿喷#include #include #include #inc
2015-06-11 22:17:13 677
原创 Chinese Remainder Theorem
用于求解同余方程组x = ri (mod ai) 1更一般的,我们来考虑如何解决ai不互质的情况我们可以用合并方程组的方法来解决此类问题。x = r1 (mod a1)x = r2 (mod a2)我们可以将上述方程写成另一种形式x = k1*a1+r1x = k2*a2+r2我们可以得到k1*a1+r1=k2*a2+r2即k1*a1 = r2-
2015-05-29 19:58:49 961
原创 Primitive root
高大上的数论,先入门再说。原根的定义可以到wiki上找,上面介绍得很清楚。如果你是个热(bu)爱(dong)祖(ying)国(yu)的人,看这个blog就行了1、51nod 1135奇怪的oj,还是放链接吧求奇素数n最小的原根。从2~n-1枚举x,判断x是否满足x^j mod n != 1 j=2,3,4,...,phi(n)-1暴力判断会T,需要跟快的算法。
2015-05-14 19:59:36 1423
原创 [bzoj 3196] 二逼平衡树
网上各种方法都有了。。。。去年学主席树的时候准备用树状数组套主席树水过,结果发现空间比较吃紧,就一直放在那边没敢碰。前几天在那出来时——嗯,似乎是裸的线段树套平衡树(虽然我没有写过)。于是就这样码下去了。。。。。
2015-05-01 09:55:17 801
原创 APIO2014题解
话说就要APIO2015了,我才把2014的题做完。。。。1、回文串当时考场上据说有很多人用Manacher+其他各种字符串利器虐了。。。但是现在我们有了回文树这种裸题,这不是水吗。。。。。#include #include #include using namespace std;typedef long long LL;const int Maxn
2015-04-24 16:36:44 1822
原创 整体二分入门
骗分神器!推荐论文:xhr2013集训队论文能够整体二分的题目必须满足一下几点(摘自xhr论文)1、询问答案具有可二分性2、修改对答案的判定相互独立,互不影响3、如果修改对询问有贡献,则贡献是确定的,且与判定标准为无关4、贡献满足结合律、交换律,具有可加性5、题目允许离线(好像现在大部分题目强制在线)另外一个很重要的一点就是注意些整体二分时必须是的当前步骤的复杂度只
2015-04-24 09:40:40 2218
原创 后缀自动机初步
想学这个算法很久了省选结束后终于下定决心好好学学!先推荐两篇文章http://hi.baidu.com/myidea/item/142c5cd45901a51820e25039?qq-pf-to=pcqq.grouphttp://blog.csdn.net/huyuncong/article/details/7583214学好后缀自动机的关键就是理解其转移边与父亲变得不
2015-04-23 20:01:13 1700
原创 单纯形解线性规划
1、noi2008 志愿者招募这题更广为人知的解法是网络流建模,题解戳这里其实可以拿线性规划水过去单纯形讲义戳这里网上好多程序据若都没看懂,最后才知道他们套用了一个叫做对偶性的定理。。。。大概就是长这样:(证明就不放了,都可以在算到上找到)所以这题就可以水过去了。。。。速度确实比裸的spfa求网络流快code//最小费用最大流#include #
2015-04-23 19:00:03 703
原创 cqoi2015部分题解
只做了前三题。。。。。T1、选数先把题目转化为求选n个数最大公约数为1,不用说了。假定f[i]为选出n个数最大公约数为i的方案数。由于题目中有条件H-L令L=(L-1)/i, R=H/if[i] = (R-L)^n - sigma f[a*i] - (R-L)最后的R-L为减去全部选择一个数的方案数答案为f[1]PS:如果范围中有1,注意f[1]++,因为全部选
2015-04-22 09:48:00 513
原创 [bzoj 3994] sdoi2015 约数个数和
需要用到一个神奇的式子:d(nm)=sigma [ gcd(i,j)==1 ] 其中i|n&&j|m把这个做前缀和应用到最终答案中去可得ans = sigma( {n/i} * {m/j} * [ gcd(i,j)==1 ] ) 其中{x}表示x向下取整应用莫比乌斯反演可得ans = sigma( {n/i} * {m/j} * sigma mu(d) )其中d|i&&d
2015-04-22 09:30:59 1008
原创 JSTSC2015二轮
真是一场奇怪的省选,有的算法考得重复,有的算法还未涉及,不知该说些啥。。。。。Day1T1、子集选取我只能说,这是一道地地道道的noip题,不管你是用什么方法搞出公式的,最后的答案就是2^(n*k)我就说一下自己是怎么得到的吧。题目中要求Ai,j属于Ai-1,j和Ai,j-1,我们知道属于关系对于元素之间是相互独立的,如果我们知道单个元素的方案数为x,答案就是x^n考虑如何
2015-04-19 06:42:01 1117 4
原创 省选模版复习——主席树
bzoj3653 谈笑风生dfs序,主席树水过去吧#include #include #include #include using namespace std;#define pb push_backtypedef long long LL;const int Maxn=300005;LL sum[Maxn*20],ans;int stk[Maxn],dep[Maxn
2015-04-16 08:50:23 514
原创 省选模版复习——费用流
bzoj3876 支线剧情其实也是2014江苏的题上下界的费用流很裸吧其实也可以利用图的特殊性把他转化成普通的费用流比较一下时间,普通费用流有时还是很明显的//普通费用流#include #include #include using namespace std;const int Maxn=305, Maxm=200005, INF=1e9;int no
2015-04-16 08:39:33 541
原创 省选模版复习——线性筛法
bzoj 3944 sum求phi和mu的前缀和,n首先orz叉院lyp大神的讲义。以下为lyp大神讲义的公式推导过程(我不生产公式,我只是大神的搬运工~~)假设我们需要求f(x)的前缀和令g(n)=sigma f(d) (满足d|n) F(n)=sigma f(i) (1我们可以得到sigma g(i) (1 =sigma f(i)*[n/i] (1<
2015-04-15 19:24:54 583
原创 省选模版复习——FFT
hdu1402 大整数乘法, 裸FFT#include #include #include #include using namespace std;const int Maxn=200005;const double PI=acos(-1);char S[Maxn],T[Maxn];int ans[Maxn],n,m,i,N;struct CP{ double x,
2015-04-15 08:24:20 589
原创 省选模版复习——LCT
bzoj2157 LCT裸题#include #include #include using namespace std;const int INF=1e9;const int Maxn=40005;int son[Maxn][2],sum[Maxn],minx[Maxn],maxx[Maxn];int inv[Maxn],rev[Maxn],w[Maxn],fa[Maxn]
2015-04-15 08:22:42 539
原创 省选模版复习——后缀数组
bzoj3238 后缀数组水#include #include #include using namespace std;const int Maxn=500005;typedef long long LL;LL Ans;char S[Maxn];int H[Maxn],Rank[Maxn],q[Maxn],pre[Maxn],nxt[Maxn];int l,r,N,i,
2015-04-15 08:20:52 509
原创 除草(4.6~4.11)
1、 加特技水题,树上背包dp。2、花可以推出第一步答案为(n!)^2的约数个数第二步其实要求一个long long范围内的质因数分解,Pollard_rho解决。3、连电线任意重连一条树边,求修改后树直径的最小值和修改方案。比较繁琐的树dp。大概就是想办法搞出子树里的直径,子树外的直径,那么割去子树连向外的边,添边的最优方案就是加在两条直径的中间。开了20来个数
2015-04-13 23:08:47 651
原创 [bzoj 3563&3569]DZY Loves Chinese I&II
3263是道sb题,随便水过去吧。。。。。3569才是正真的神题!用dfs搞出一棵生成树,把边分为树边和非树边。对于非树边我们随机分配一个数值给他,而树边上的值为覆盖其所有非树边权值的异或和。我们来看一看删边的情况:1、仅删除非树边,很明显这样一定仍是联通的。2、删除树边和非树边,只有将树边和覆盖这条树边的非树边全部删除才能使图不联通,由于我们刚刚的预处理,这些边权值的异或
2015-04-13 22:39:39 980
原创 [bzoj 1049] HAOI2006数字序列
这题放了很久了,这次终于下定决心切掉他!第一问很好处理,把值减去标作为新值,求最长不下降序列即可。第二问,有一个很好的性质。还是处理第一问中的新值,发现最优解中两个不变点i,j之间的数都是小于a[i]或大于a[j],并且修改之后存在一个k使得i~k个全为a[i],后面的全为a[j]。这个性质很好利用,借鉴Mato的blog里的做法可以水(随机数据。。。。。)//Mato用理论O
2015-04-13 11:14:02 886
原创 codeforces17E Palisection
求母串中互相交的回文串对数。回文树练习题。求相交的不好求,但是我们很容易求出不相交的(精华所在!要学会逆向思维!)用回文树求出在此处开头和结尾的回文串非别为多少,直接搞就可以了。#include #include #include using namespace std;typedef long long LL;const int Mod=51123987;con
2015-04-13 11:09:27 840
原创 [ural 1960] Palindromes and Super Abilities
继续练习模版。回文树。。。#include #include #include using namespace std;const int Maxn=100005;char S[Maxn];int len[Maxn],ans[Maxn],fail[Maxn];int son[Maxn][26],n,st,p,c,last,i,t;int newnode(int x){
2015-04-09 20:39:34 541
原创 [bzoj 2565] 最长双回文串
似乎把这题些颓了。Manacher预处理,得到g[]数组。之后蒟蒻就开始无脑的用数据结构大法了。。。慢得飞起#include #include #include #include using namespace std;char S[200005];int minx[800005],tip[800005],g[200005];int maxl,p,i,N,n,t,
2015-04-09 19:57:21 529
原创 [bzoj 1484] HNOI2009 通往城堡之路
找了别人的程序看了好久,终于大概理解做法了。。按第一个点的值可以搞出每个点的下界:b[i]=a[1]-(i-1)*d这样每次我们可以把操作变成增加一些值,尽量使代价减小,并最终使a[n]=b[n]每次选择对结果影响最优的点j(代价增加得最少或者减少得最多),注意dlt要满足大概就是这样吧。。。。。/*网上好多鬼畜的题解都说啥“仙人掌dp”。。。。。也许是蒟蒻太弱,无
2015-04-07 19:11:07 1215
原创 hdu 4344 Mark the Rope
依然是pollard_rho和Miller_Rabin的模版。。。#include #include #include using namespace std;const int PRIME[9]={2,3,5,7,11,13,17,19,23};typedef long long LL;LL ans1,ans2,tmp,n,dig[200];int Case,cnt;LL
2015-04-06 21:09:30 576
原创 POJ1811 Prime Test
Miller_Rabin+Pollard_rho算导上都有,贴模板啦#include #include #include using namespace std;typedef long long LL;const int PRIME[9]={2,3,5,7,11,13,17,19,23};LL n,minx;LL mult(LL a,LL b,LL Mod){ LL
2015-04-06 17:10:03 463
原创 2015年国家集训队测试 矩阵变换
居然给想出解法了。。。。从题目中我们可以看出,每个数一定是尽量取列靠后的。如果这样一行中出现了多个数怎么办?拿纸出来画一画可以发现我们因该保留靠前的那一个而把靠后的一个再向前一列取一下。#include #include #include #include using namespace std;#define pb push_backint g[205],rk[205]
2015-04-05 20:32:25 651
原创 除草(3.30~4.4)
//以下所有代码都可在我的代码片里找到1、travel基本把树剖忘光了。。。注意到b树上的点至多对应a树上的一个点,询问要求b树上的一条路径对应a树上几条路径。简单的说就是把树上的路径剖成logn段,每段我们都可以利用主席树对每段查询即可。2、弗洛伊德的复仇可以看到如果所有的边都满足ai>bi(应该是优惠吧),那么一定存在最优策略使得所有的货物都应该是选择一条路径来运输。
2015-04-05 15:25:14 731
原创 记些东西
1、写FFT时需要对N位二进制翻转,我一直都是开一个rev数组预处理来搞的,如下 for (N=2, M=1;N<(n+m);N<<=1, M++); for (i=0;i<N;i++){ int len=0; for (j=i;j>0;j>>=1) dig[len++]=(j&1); for (j=0;j<M;j++) rev[i]=( (rev[i]<<1)|dig
2015-04-05 00:36:59 520
原创 LCT练习
————LCT建议研究杨哲大神的《QTREE解法的一些研究》,自觉讲得十分详细。LCT的核心算法也就是几个过程:access.makeroot,link,cut……搞出这几个过程LCT也不是啥难写的东西啦。在最近做了几道入门题,奉上。spoj qtree3树上支持修改颜色(黑白),查询路径上第一个黑点编号。直接LCT搞吧,记录路径上黑点的数量。修改时把x店转
2015-03-25 13:10:35 863
原创 codeforces 293B Distinct Paths
n,m因为n+m-1>k无解啦。。。k暴力大法好。。。我们从左上向右下枚举棋子,遵循每次只放放过的棋子或者没放过的编号最小的棋子(当然是符合题目要求的情况下),最后用组合计数搞一搞即可以啦#include #include #include using namespace std;typedef long long LL;#define two(x) (1<<(
2015-03-24 12:30:40 1018
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人