02 2016 档案
bzoj 3439
摘要:先把所有词扔进tire,然后dfs序弄出区间,然后就是区间最大值了 主席树各种写挂QAQ 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>= 阅读全文
posted @ 2016-02-25 18:36 onlyRP 阅读(142) 评论(0) 推荐(0)
bzoj 2330
摘要:开学了,不能愉快地刷题了QAQ 差分约束(以前用并查集做真是作死。。)然后有个点比较坑,要过的话就要倒着加边,否则TLE 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) 阅读全文
posted @ 2016-02-21 17:22 onlyRP 阅读(191) 评论(0) 推荐(0)
bzoj 1030
摘要:单词建出AC自动机,然后在自动机上做DP d[i][j]表示第i个字符匹配到节点j上的方案数 直接算有点麻烦,统计不满足的方案数就好了 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec 阅读全文
posted @ 2016-02-17 00:05 onlyRP 阅读(157) 评论(0) 推荐(0)
hdu 2222
摘要:AC自动机入门题,只是上来传个模板。。。 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<queue> 7 阅读全文
posted @ 2016-02-16 15:22 onlyRP 阅读(172) 评论(0) 推荐(0)
bzoj 4260
摘要:设a[i]为前缀和,则i~j的异或和为a[j]^a[i],对于2个只需把另一个当成后缀就可以了 求max(a[j]^a[i])的话就用tire维护就可以了 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 # 阅读全文
posted @ 2016-02-15 00:02 onlyRP 阅读(257) 评论(0) 推荐(0)
bzoj 1212
摘要:tire入门,死得好惨。。。 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) for(e 阅读全文
posted @ 2016-02-14 20:48 onlyRP 阅读(244) 评论(0) 推荐(0)
bzoj 1935
摘要:很明显直接二维是作死的。。所以给按X点排下序,当然离线处理询问时差分的点会方便些。。 对Y坐标就用BIT维护就行。。 但由于坐标比较大,所以还要离散化= = 处理起来略麻烦但代码并不难写 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #includ 阅读全文
posted @ 2016-02-13 22:57 onlyRP 阅读(284) 评论(0) 推荐(0)
bzoj 2743
摘要:和上道差不多,离线处理,然后扫一遍序列,扫到就数先不增加,上个相同的数+1,上上个数-1,用BIT维护前缀和 静态差错要多练练。。。 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algor 阅读全文
posted @ 2016-02-13 16:10 onlyRP 阅读(192) 评论(0) 推荐(0)
bzoj 1264
摘要:用DP直接求LCS明显超时,这题和平时的区别在与给定了数,所以从这入手可以直接记录各数字的位置 然后依次填入dp[i]=max{dp[j]}+1(1<=j<=i)用BIT维护最大值O(nlogn) 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #i 阅读全文
posted @ 2016-02-13 00:51 onlyRP 阅读(190) 评论(0) 推荐(0)
bzoj 1878
摘要:这题的做法有点神奇。。 离线处理。按r排序,记录上个相同的数出现的位置,边加入一个数的同时删去上一个相同的数就好了。。用BIY维护和 BIT写起来挺快的。。 1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #i 阅读全文
posted @ 2016-02-12 21:23 onlyRP 阅读(159) 评论(0) 推荐(0)
bzoj 1452
摘要:二维BIT。。。 感觉不会树状数组还是不太好。。而且这题用线段树肯定MLE。。 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i-- 阅读全文
posted @ 2016-02-12 12:34 onlyRP 阅读(227) 评论(0) 推荐(0)
bzoj 4199
摘要:没有题面差评 先来遍SA求出h,再给h排序,从大到小计算,并查集维护连续的区间(表达能力太弱。。还是看代码好说话) 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) fo 阅读全文
posted @ 2016-02-11 23:01 onlyRP 阅读(148) 评论(0) 推荐(0)
bzoj 3238
摘要:明显要用求SA再求h,而lcp(i,j)就等于i到j之间最小的h 用f[i]表示i跟比i大的后缀的lcp的和,然后用单调栈维护最小值就好了(有点像DP?) 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 # 阅读全文
posted @ 2016-02-11 16:11 onlyRP 阅读(177) 评论(0) 推荐(0)
bzoj 1031
摘要:复制一下原串处理环,然后直接出SA就可以了 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x 阅读全文
posted @ 2016-02-10 19:52 onlyRP 阅读(181) 评论(0) 推荐(0)
codevs 3160
摘要:SA入门题,将2个串中间用另外的字符链接即可 调了半天一直以为是模板的错,原来是乘法超了intQAQ 不好意思。。传错代码,误认子弟(啪啪啪 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define 阅读全文
posted @ 2016-02-10 18:17 onlyRP 阅读(278) 评论(0) 推荐(0)
bzoj 1072
摘要:状压DP,f[i][j]表示在i状态下余数为j的情况 然后就是i的表示。。先认为数字互不相同(坑爹的想法= =),然后就有没有用到压缩状态 然后还要去重。。对每个数字来说除以数字个数的阶乘即可 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(in 阅读全文
posted @ 2016-02-06 00:56 onlyRP 阅读(209) 评论(0) 推荐(0)
bzoj 1076
摘要:最近好懒散QAQ 就是状压DP+概率。。由于顺着推还要计方案数略麻烦,所以就倒着推 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i 阅读全文
posted @ 2016-02-05 20:45 onlyRP 阅读(128) 评论(0) 推荐(0)
bzoj 1875
摘要:把边当做一个状态(orz居然有这种想法),初始点也看成边,然后矩阵快速幂就可以了(感觉有点像flyod) 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int 阅读全文
posted @ 2016-02-04 21:18 onlyRP 阅读(171) 评论(0) 推荐(0)
bzoj 2301
摘要:先预处理莫比乌斯函数,再分块求 不会用公式编辑TAT,直接贴题解吧。。 从结论来看貌似也能用容斥原理? 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int 阅读全文
posted @ 2016-02-03 13:33 onlyRP 阅读(118) 评论(0) 推荐(0)
bzoj 1257
摘要:今天题目看来看去都觉得不可以做啊,数论弱到不堪直视 分为2个部分,对于n>k部分直接n*(n-k) 对于n<=k部分,x%i=x-(x/i)*i,这样就可以枚举商,然后分段加起来。。 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l 阅读全文
posted @ 2016-02-03 00:22 onlyRP 阅读(128) 评论(0) 推荐(0)
bzoj 2705
摘要:orz教主的解法实在太神了 直接贴题解 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) 阅读全文
posted @ 2016-02-02 00:11 onlyRP 阅读(151) 评论(0) 推荐(0)
bzoj 2818
摘要:记得以前是用容斥原理过的?好吧现在只记得奇加偶减了。。。 转化题目成求满足x/p和y/p互质的数对,那和上题就差不多了 先欧拉筛求出phi的前缀和a[i],依次枚举每个素数p[i],排除(1,1)答案就是sigma(a[n/p[i]]*2-1) 1 #include<bits/stdc++.h> 2 阅读全文
posted @ 2016-02-01 21:12 onlyRP 阅读(193) 评论(0) 推荐(0)
bzoj 2190
摘要:开始补我不敢碰的数论QAQ 看了资料感觉还是很晕,先把结论记下吧。。 若(x,y)符合提议gcd(x-1,y-1)=1,那么先欧拉筛法求出s=sigma(phi[i]),然后注意(1,2)(2,1)(2,2)3个点,答案就是2*s+1了 1 #include<bits/stdc++.h> 2 #de 阅读全文
posted @ 2016-02-01 20:51 onlyRP 阅读(160) 评论(0) 推荐(0)
bzoj 1491
摘要:flyod时顺便算出c(s,t),我的计数原理要补补。。。 阅读全文
posted @ 2016-02-01 00:31 onlyRP 阅读(90) 评论(0) 推荐(0)