![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
特殊算法
文章平均质量分 73
qingdaobaibai
这个作者很懒,什么都没留下…
展开
-
【bzoj3771】Triple FFT
a表示一个的方案数b表示取两个相同的c表示取三个相同的最终,取一个的是a取两个的是(a*a-b)/2取三个的是(a*a*a-3*a*b+2*z)/6a*a*a用FFT算就可以了乘法是序列的卷积#include#include#include#include#include#include#define maxn 200100 #define原创 2016-03-25 08:05:31 · 738 阅读 · 0 评论 -
【bzoj1975】[Sdoi2010]魔法猪学院 A*
A*算法还是比较有意思的,本来以为就是个搜索加减枝,现在看来是有复杂度保证的我们到一个状态后,处理出当前状态的估价函数,每次选择估价函数最小的来更新估价函数g(n)的选取,若g(n)=实际值时,是有时间复杂度保证的,并且每次得到的答案一定是当前的最优解bfs就是一个特殊的A*算法这里的估价函数g(i)可以设置成为从T点到i点的最短路,每次用优先队列选估价最小的那个点更新原创 2016-06-20 10:38:02 · 949 阅读 · 0 评论 -
【bzoj3676】[Apio2014]回文串 后缀自动机+倍增+manacher
每找到一个回文串,就在所有的串中查找出现了多少次因为暴力跳非常的慢,所以用倍增优化f[i][j]表示从第i个节点向上跳2^j步到哪里每次查询都是从末尾节点开始,倍增找到最后一个长度大于等于p的节点manacher算法证明了本质不同的回文串只有O(n)个,复杂度O(nlogn)原来manacher可以直接求偶数长度的回文串呀#include#includ原创 2016-06-29 20:52:41 · 1325 阅读 · 0 评论 -
【bzoj3563】DZY Loves Chinese 在线cdq分治+并查集
和3237做法差不多,把cdq分治改成在线的就可以了。至于怎么在线cdq分治?这个只可意会,不可言传。#include#include#include#include#include#include#define maxn 500010using namespace std;struct yts{ int x,y; bool flag;}e[maxn];原创 2016-05-11 20:12:51 · 1388 阅读 · 0 评论 -
【bzoj3237】[Ahoi2013]连通图 cdq分治+并查集
cdq分治首先把所有没有影响的边都建出来分治过程:1、把左边没有右边有的边建出来2、分治左边3、把并查集恢复至初始的样子4、把右边没有左边有的边建出来5、分治右边每次建的边数为这个区间内的集合中的边数,是一个与n无关的量,所以复杂度是正确的O(qclogqc)如何将并查集恢复至初始的样子?每当一个点的父亲被修改时,将它和它的父亲入栈,每次只需要记录一下当原创 2016-05-11 18:59:59 · 1390 阅读 · 0 评论 -
复习一下整体二分
前阵子颓废了一下,学了个整体二分和cdq分治,感觉还是比较神奇的一个东西,写篇博客总结一下。 关于整体二分 http://www.cnblogs.com/zig-zag/archive/2013/04/18/3027707.html先膜拜下Zig_zag神犇。。。 整体二分是一种非常神奇的离线算法。bzoj1901 http://www.l原创 2015-05-06 19:21:36 · 1555 阅读 · 0 评论 -
【bzoj3585】mex 分块+莫队算法
因为在线不太可搞,所以考虑离线。首先,按照莫队的方式对操作排序,对权值分块,维护一下每个块出现的个数。每次询问,找到第一个没有铺满的块,在下一个块内暴力找即可。#include#include#include#include#include#include#define maxn 200010 using namespace std; struct yt原创 2016-01-18 14:56:21 · 690 阅读 · 0 评论 -
【bzoj2216】[Poi2011]Lightning Conductor 决策单调性+整体二分
其实看到这道题是毫无思路的。先简化思路,对于每个i,求max{aj+sqrt(|i-j|)}-ai把这个式子分成前后两部分,即max(max{aj+sqrt(i-j)},max{ak+sqrt(k-i)})-ai (j然后,我们发现其实这个式子是有单调性的,所以可以用那种二分优化单调性dp的方式做。整体二分是这种单调性dp的一种写法。void solve1(int l原创 2016-01-18 15:06:21 · 1301 阅读 · 1 评论 -
【bzoj1857】[Scoi2010]传送带 三分法
三分法这个问题看上去像是单峰的,于是可以三分求答案大致思路是当前区间为[l,r]mid=(l+r)/2,midmid=(mid+r)/2如果mid比较靠近极值点,则r=midmid如果midmid比较靠近极值点,则l=mid首先三分出AB上的点E,表示先从A走到点E然后三分出CD上的点F,表示从点E走到点F,再走到点D三分套三分#includ原创 2016-03-14 13:51:21 · 803 阅读 · 0 评论 -
【bzoj3203】[Sdoi2013]保护出题人 凸包+三分法
非常好的题目山东二轮前几年还是不错的嘛题解:http://www.cnblogs.com/iwtwiioi/p/4007263.html前i个僵尸的血量和为sum[i]那么第i关的攻击力就是max{(sum[i]-sum[j-1])/(x[i]+i*d-j*d)}(1考虑一下为什么?对于第i只僵尸,可以把前面i-1只僵尸的血量合到第i只上,取最大值已经保证了前i-1只僵原创 2016-03-14 15:01:42 · 790 阅读 · 0 评论 -
【bzoj4071】[Apio2015]巴邻旁之桥 三分套三分
三分一下第一座桥,三分一下第二座桥,貌似就解决了。UOJ跑的死慢,bz也T掉了。#include#include#include#include#include#include#define maxn 100010 #define inf 1000000000000000using namespace std;struct yts{ int op1,x1,原创 2016-03-15 08:03:59 · 758 阅读 · 0 评论 -
【bzoj3533】[Sdoi2014]向量集 三分+线段树+凸包
考虑一个查询操作xz+yw=answ+x/y*z=ans/yw=-x/y*z+ans/yans/y表示过点(z,w)的斜率为-x/y的直线在y轴上的截距当y>0时,截距越大,ans越大,在上凸壳上找答案当y答案可以三分,也可以直接set维护斜率找斜率最接近的那个点问题来了,如何维护区间[L,R]的凸包线段树的每个节点建凸包是O(size log n)的原创 2016-03-22 18:33:05 · 880 阅读 · 0 评论 -
【bzoj4311】向量 线段树按时间分治+凸包+三分
好像没什么好说的,记录每个点进出的时刻,每个点对应线段树上的O(logn)个节点,然后按时间分治就可以了。#include#include#include#include#include#include#include#define maxn 200010 using namespace std;struct yts1{ long long x,y;}p[m原创 2016-03-22 19:55:34 · 946 阅读 · 0 评论 -
【bzoj3672】[Noi2014]购票 斜率优化+树链剖分+线段树+凸包+三分
f[i]表示从根到点i的最少票价f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i] } (dep[i]-dep[j]=f[j]-dep[j]*p[i]+dep[i]*p[i]+q[i]f[j]=dep[j]*p[i]+f[i]-dep[i]*p[i]-q[i]f[i]-dep[i]*p[i]-q[i]表示过点(dep[j],f[j])的斜率为p[i]的直原创 2016-03-23 10:50:29 · 749 阅读 · 0 评论 -
【bzoj2179】FFT快速傅立叶 FFT
卷积求法1、DFT2、点值相乘3、逆DFTDFT快速求法——FFT1、按照下标分成奇数和偶数两个子序列2、求出两个子序列的DFT3、合并成本序列的DFT#include#include#include#include#include#include#define pi acos(-1)#define maxn 200100 usin原创 2016-03-24 10:33:21 · 642 阅读 · 0 评论 -
【bzoj2194】快速傅立叶之二 FFT
原题不是卷积的形式我们把b数组翻转,i-->-ic[i+j]+=a[i]*b[j]为了防止下标为负,然后把b向右平移n-1个单位最后的答案就是c[n-1]到c[2*n-1]#include#include#include#include#include#include#define maxn 500010#define pi acos(-1)usi原创 2016-03-24 12:25:02 · 758 阅读 · 0 评论 -
【bzoj3160】万径人踪灭 FFT+manacher
首先把字符串用#间隔开总数-连续的字符串连续的用manacher求总数如何求?f[i]表示以i为中心有多少对对称的字符(不包含#,但包含本身)ans=∑2^f[i]-n原字符串的位置i对应新字符串的位置2*if[i]=∑str[j]*str[i-j]第一次a=1,b=0第二次a=0,b=1这样算出来是对称的个数,(f[i]+1)/2是对数最后直接计算原创 2016-03-24 20:03:07 · 425 阅读 · 0 评论 -
Codeforces Round #453 (Div. 1)解题报告(ABCD)
A.Hashing Trees题目大意:给定数组a[i],其中a[i]表示深度为i的节点有a[i]个,问是否存在两个不同构的树同时满足这个条件。如果有,请输出。 简要题解:有很多种构造方案。我的做法是,第一次把所有深度为i的节点都向深度为i-1的第一个节点连边。第二次,尝试分出一个深度为i的节点向深度为i-1的第二个节点连边。如果可以这样生成两棵树,则有解。#include<cstdio>#in原创 2017-12-21 13:50:51 · 514 阅读 · 0 评论