自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

无尽

The road ahead will be long. Our climb will be steep.

  • 博客(53)
  • 收藏
  • 关注

原创 UOJ 34 多项式乘法

快速傅里叶变换关于FFT网上的教材不多,而且大多与算法问题关系不大。强烈推荐一个。这个讲得真的很不错:从多项式乘法到快速傅里叶变换本弱数学知识不够多,复数、单位根之类的知识都是下午临时补的。。。从下午开始看FFT,看到晚上,总算大概是把递归版FFT的思路看懂了吧。(迭代版的还没看懂。。。有空慢慢钻研)注意到IDFT的时候需要把所有单位根取倒数,那么有一个复数倒数式子: 设复数Z=a+b i 那么

2016-09-30 23:11:36 469

原创 BZOJ 3450 Tyvj1952 Easy

概率DP膜题解:http://www.cnblogs.com/y7070/p/5039670.html设L为现在的期望连续’o’的长度减一(不统计当前的这块)如果当前为’x’,显然当前格不贡献答案,且令L=0 如果当前为’o’,将会贡献2L+1【 (L+1)2−L2(L+1)^2-L^2 】的答案,L++ 如果当前为’?’,将会贡献0.5*(2L+1)+0.5*0的答案,L=0.5*0+0.5*

2016-09-29 20:47:51 287

原创 BZOJ 1532 [POI2005]Kos-Dicing

二分+最大流二分答案s->所有人,容量为二分的答案,表示允许赢的次数 所有人->分别参与的所有比赛,容量为1,表示赢这局 所有比赛->t,容量1,表示这局已经做完了如何有解,那么一定能满流#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#define N 10010#define S 2*N-1#d

2016-09-29 19:38:18 313

原创 BZOJ 1185 [HNOI2007]最小矩形覆盖

凸包+旋转卡壳结论:一个凸包的最小矩形覆盖一定有一条边在凸包上证明?打表/对拍证明吧。。。(反正我不会证,为什么都说它是显而易见的?)然后跑凸包,枚举边,旋转卡壳找点搞一搞就好了#include<cmath>#include<cstdio>#include<algorithm>#define calc(a,b,c) cross(p[b]-p[a],p[c]-p[a])#define N 50

2016-09-29 15:19:30 318

原创 BZOJ 2763 [JLOI2011]飞行路线

分层图记f[i][j]表示在i,且还可以免费j次的最小代价,直接跑类似最短路即可#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#define N 10005#define M 50001using namespace std;struct edge{int next,to,v;}e[M<<1];c

2016-09-29 15:04:41 282

原创 HDU 1695 GCD

莫比乌斯反演没啥好说的,挂题解:http://blog.csdn.net/lixuepeng_001/article/details/50577932#include<cstdio>#include<cstring>#include<algorithm>#define ll long long#define N 100005using namespace std;bool notprim

2016-09-29 14:24:47 295

原创 BZOJ 4602 [Sdoi2016]齿轮

爆搜+取对数优化很显然我们可以定一个点,然后DFS下去看有没有矛盾。但是这样会炸精度。于是考虑判断a*b==a*c可以转为判断log(a*b)==log(a*c)也就是log(a)+log(b)==log(a)+log(c)。这样精度就安全了。#include<cstdio>#include<cmath>#include<cstring>#define N 1005#define M 100

2016-09-29 11:52:37 534

原创 BZOJ 3261 最大异或和

可持久化trie说实话,可持久化的数据结构细节就是麻烦- -(其实是我太弱了),我调了差不多两个小时才调出来。。。#include<cstdio>#define N 600005#define D 25using namespace std;struct node{ node *ch[2]; int cnt;}*root[N], nodes[N*40], *null;i

2016-09-28 23:22:59 286

原创 BZOJ 2049 [Sdoi2008]Cave 洞穴勘测

LCT模板题顺便挂一个不错的LCT教程:link-cut trees#include<cstdio>#include<algorithm>#define N 10005using namespace std;struct node{ int fa, ch[2], lazy; }t[N];char s[10];int stk[N], top;void pushdown(int

2016-09-28 18:41:21 336

原创 BZOJ 4011 [HNOI2015]落忆枫音

拓扑图DP对于拓扑图,deg[i]表示i的入度,根为1,答案就是 ∏ni=2deg[i]\prod_{i=2}^{n} deg[i]即除根节点外,每个点都选择一条入边,由于图是DAG,因此一定会形成一个树形图(听说这是朱刘算法的推论?)考虑加完边之后有环怎么办?只要在答案里减去环的贡献即可。如何求环的贡献?当环的边全部被选时,方案数肯定是所有非环上点(除了根)的入度之积。脑补即可证明。附大爷题解:h

2016-09-28 14:24:52 292

原创 BZOJ 2111 [ZJOI2010]Perm 排列计数

组合数+Lucas定理题目可以转化成求1~n排列的小根堆数目,那么对于每一个i位置,他的子树节点个数是确定的,记为f[i],那么有f[i]=C(siz[i-1],siz[i<<1])*f[i<<1]*f[i<<1|1]注意到n可能大于p,套Lucas定理即可【Lucas定理】注意,当且仅当p是质数时才可以用Lucas定理。在不考虑求逆元的情况下,单次时间复杂度O(logpn)O(log_pn)#in

2016-09-28 11:35:11 275

原创 BZOJ 2208 [Jsoi2010]连通数

缩点+bitset+DP先缩点。每一块的答案是他能到达的(包括自己)所有块的siz和自己的siz相乘的和,于是对缩点后的拓扑图进行DP即可。#include<cstdio>#include<queue>#include<bitset>#include<algorithm>#define N 2005using namespace std;bitset<N> f[N];queue<int

2016-09-27 14:50:53 356

原创 BZOJ 1483 [HNOI2009]梦幻布丁

链表+启发式合并黄学长题解(orz):http://hzwer.com/2858.html附: pos[i]表示i颜色(数据中的正确颜色)在链表中存储为pos[i]。那么交换pos[i]和pos[j]就是交换他们存储的颜色。反正最后合成完一定是一个完全的链表,且这个链表是被pos[y]指向的,这样就可以了,复杂度每一次操作均摊logn #include<cstdio>#include<algor

2016-09-27 14:42:02 283

原创 BZOJ 3688 折线统计

线段树维护DP令f[i][j][0/1]表示前i个点,选择j段,最后一段是下降/上升的方案数。f[i][j][0]=∑(f[k][j][0]+f[k][j-1][1]) (k < i且a[k].y>a[i].y)f[i][j][1]=∑(f[k][j][1]+f[k][j-1][0]) (k < i且a[k].y#include<cstdio>#include<algorithm>#define

2016-09-27 14:35:02 392

原创 BZOJ 3170 [Tjoi 2013]松鼠聚会

排序+前缀和+切比雪夫转曼哈顿如果本题给出的是曼哈顿距离,那么我们就可以按X和Y分别排序,求出前缀和,对于每个点O(1)判断找最佳答案。可是切比雪夫距离呢?也可以转化成曼哈顿距离!先引入一个恒等式: max(|a|,|b|)=|a+b2|+|a−b2|max(|a|,|b|)=|\frac{a+b}{2}|+|\frac{a-b}{2}| 可对a,b的正负性分类讨论进行证明切比雪夫距离公式

2016-09-27 14:29:57 301

原创 BZOJ 4236 JOIOJI

遍历统计+mapf[0/1/2]表示到目前为止,I/J/O出现的次数,用一个pair记录(f[2]-f[1],f[1]-f[0]),找到最早的一个位置,使得他们pair相减等于0即可。我原先的想法也是类似的,但我只想到用一些奇怪的模数来搞,没想到用pair记#include<map>#include<cstdio>#include<algorithm>#define N 200005usin

2016-09-27 14:13:10 296

原创 BZOJ 1878 [SDOI2009]HH的项链

离线+排序+树状数组先离线,按右端点排序。 记当前位置之前最后一次出现的数的位置的值为1,这玩意儿可以随位置右移而很方便地更新,询问就是求区间和了,树状数组维护。 #include<cstdio>#include<algorithm>#define lowbit(x) (x&(-x))#define N 50005#define M 200005#define C 1000005usi

2016-09-27 14:06:44 240

原创 BZOJ 1032 [JSOI2007]祖码Zuma

区间DP发现对于连续的相同颜色个数,我们只关心它大于1还是等于1,于是可以把相同颜色的块合起来,记一个size。注意到一个区间[i,j]的消除有两种情况。一是先消除[i,k]再消除[k+1,j],二是消除了[i+1,j-1]之后剩下两边的一样恰好消掉。记f[i][j]表示区间[i,j]全消除需要的最小代价,就可以DP了#include<cstdio>#include<cstring>#inclu

2016-09-27 14:03:33 376

原创 BZOJ 2754 [SCOI2012]喵星球上的点名

AC自动机对每一个询问串建AC自动机,拿每一个名字跑AC自动机,不断在fail指针上统计答案即可。因为字符串总长度有保证,时间复杂度可以近似看成O(LEN)。刚开始比较SB,每一个trie节点都开了一个next[10000],结果MLE了。实际上每个节点根本用不到这么多,可以改成map。做fail指针的时候不用从1扫到10000来找子节点,因为子节点并没有那么多,可以把子节点的编号用vector记录

2016-09-27 13:56:05 348

原创 BZOJ 4195 & UOJ 127 [Noi2015]程序自动分析

并查集出现矛盾当且仅当x1=x2且x1!=x2于是先处理所有等于,把两个数用并查集并起来,对于每一个不等于判断一下就好了NOI为什么会有这种题。。。#include<map>#include<cstdio>#include<cstring>#include<algorithm>#define N 100005using namespace std;int a[N], b[N], c[N]

2016-09-25 15:26:56 335

原创 BZOJ 1854 [Scoi2010]游戏

并查集 或 二分图匹配这题复杂度错误的算法竟然跑得比正解快 错误的算法(1):用装备的两种属性向装备连边,跑二分图匹配即可,注意题目要求是连续攻击,所以一旦匹配不成功就要退出正确的算法(2):把每一个装备考虑成一条边,它的两个属性考虑成边两端点的编号。使用装备相当于删除这条边。于是可以发现如果某连通块图中有环,那么环上的点必定都可以取到。如果是树结构,让编号最大的取不到即可。二分图匹配#includ

2016-09-25 14:48:13 392

原创 BZOJ 2326 [HNOI2011]数学作业

分段递推+矩阵乘法根据模运算的分配律,i表示连接到第几个数,有递推式:f[i]= f[i-1]*(10^log(i))+i mod M构造矩阵进行加速{f[i-1],i-1,1} * { 10^log(i) ,, 0 ,, 0 } { 1 ,,,,,,,,,,,,,,,,,, 1 ,, 0 } { 0 ,,,,,,,,,,,,,,,,,, 1 ,, 1 } (空格没法对齐,强行用逗号对齐)

2016-09-25 14:33:54 239

原创 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊

分块分为根号n块,对每一个装置,记录它跳出所在块需要的步数和跳出所在块之后到达的点#include<cstdio>#include<cmath>#define N 200005#define SN 1000using namespace std;int k[N], step[N], next[N], n, block, cnt, l[SN], r[SN], belong[N];void

2016-09-25 14:26:35 287

原创 BZOJ 1059 [ZJOI2007]矩阵游戏

二分图匹配可以证明,如果存在n个黑格,且他们互不同行互不同列,就一定有解。相反如果有解,就一定有这样的n个黑格。于是找完美匹配#include<cstdio>#include<cstring>#define N 205using namespace std;struct edge{int next,to;}e[N*N];int ecnt=1;int last[N], mat[N], n;

2016-09-25 14:23:17 236

原创 BZOJ 1088 [SCOI2005]扫雷Mine

暴力枚举或DP如果确定了第一行是否有雷,就可以根据第一行的数字推出第二行,进而第三行。。。于是可以暴力枚举第一行的状态来搞然而我想复杂了,记f[i][sta]表示到第i行,i的前三行的状态为sta的方案数。。。#include<cstdio>#define N 10005int f[N][1<<3], a[N];int main(){ int n; scanf("%d",&n

2016-09-25 14:17:12 232

原创 BZOJ 4034 [HAOI2015]T2

树剖+线段树要能够一次性给子树赋值,可以用DFS序+线段树 要查询点到根的路径和,树剖+线段树 于是用树剖的DFS序建树#include<cstdio>#define N 100005#define ll long longusing namespace std;struct edge{int next,to;}e[N<<1];struct segment_tree{int l, r;

2016-09-25 13:47:58 265

原创 BZOJ 1597 [Usaco2008 Mar]土地购买

斜率优化考虑到如果一个长方形可以被另一个长方形覆盖,那么它就可以直接忽略。然后按x递增y递减的顺序排序,如果取了i和j,那么i和j之间的长方形显然是可以都取的而不会产生新的贡献。于是变成区间DP,然后发现可以斜率优化#include<cstdio>#include<algorithm>#define N 50005#define ll long longusing namespace std

2016-09-25 13:40:32 291

原创 BZOJ 1050 [HAOI2006]旅行comf

排序+贪心按边权排序,枚举权值最小边,贪心地从小到大选取比最小边大的边,用并查集维护连通性#include<cstdio>#include<algorithm>#define M 5005#define N 505using namespace std;struct edge{int a,b,v;}e[M];const int INF=30005;int fa[N];bool cmp

2016-09-25 13:35:23 328

原创 BZOJ 1975 [Sdoi2010]魔法猪学院

A*#include<cstdio>#define N 5005#define M 200005using namespace std;struct edge{int next, to; double val;}e[M<<1];struct node{int id; double g, h;}heap[2000000];int ecnt=1, ans=0, last1[N], last2

2016-09-25 13:30:55 344

原创 BZOJ 1724 [Usaco2006 Nov]Fence Repair 切割木板

合并果子裸题每次选取最小的两个合并即可证明:把合并过程画成哈夫曼树,如果最小点的兄弟不是次小点,把次小点和最小点的兄弟换一个位置答案肯定不会更劣。也就是记次小点i,最小点的兄弟j,点到根的距离为d,点权为w 由 w[i]<w[j],d[i]<d[j]w[i]<w[j],d[i]<d[j] 一定有 d[j]∗w[j]+d[i]∗w[i]>d[j]∗w[i]+d[i]∗w[j]d[j] * w[

2016-09-25 12:42:48 371

原创 BZOJ 1084 [SCOI2005]最大子矩阵

分类DP记mx[i][j]表示[j,i]这一个区间里,必须取i的最大连续子段和,用前缀和pre维护。如果m=1,记f[i][j]表示做到第i行,已经取j个的答案,如果m=2就记f[i][j][k],i和j表示两列分别做到哪一行,已经取k个的答案。#include<cstdio>#include<cstring>#include<algorithm>#define N 105#define K

2016-09-25 12:29:35 241

原创 BZOJ 3720 Gty的妹子树

树分块每S个节点分一块,如果x的父亲所属块超过S就自己分一块。 块内的所有权值排序。 对于询问,块内二分,块外暴力。 对于修改和加入,维护排序就好。#include<cstdio>#include<vector>#include<algorithm>#define N 60005#define S 472//经过计算 这个值是最佳的 using namespace std;stru

2016-09-25 12:21:35 344

原创 BZOJ 2502 清理雪道

上下界最小流网络上退流的算法没弄懂,于是我就按照论文里面说二分+最大流判定论文:《一种简易的方法求解流量有上下界的网络中网络流》(没有超链- -)#include<cstdio>#include<cstring>#include<algorithm>#define N 105#define S 101#define T 102#define SS 103#define TT 104

2016-09-25 12:17:45 247

原创 BZOJ 1485 [HNOI2009]有趣的数列

卡特兰数记把ai放在奇数项为0操作,放在偶数项为1操作从a1->an的所有操作中,把0看作入栈,1看作出栈,则就是卡特兰数。公式: h(n)=C(2n,n)/(n+1) (n=0,1,2,…)#include<cstdio>#define N 2000005using namespace std;int prime[N], minprime[N], cnt=0, cntprime[N];b

2016-09-25 12:09:35 304

原创 BZOJ 1934 [Shoi2007]Vote 善意的投票

最小割如果能想到最小割,建图也大概可以脑补出来了。容量都是1。 如果i同意,S->i,否则,i->T。割掉表示与自己冲突。 对于一对朋友i,j,i->j,j->i,割掉表示和朋友冲突。根据割的性质,最终一定没有S->T的路径,即不会有不同决策落入同一连通分量。#include<cstdio>#include<cstring>#include<algorithm>#define N 305

2016-09-15 16:36:43 211

原创 UOJ 31 [UR #2]猪猪侠再战括号序列

模拟orz居然有大神用splay搞出来下面的()括号表示题目中的左括号和右括号,挑战阅读能力我的做法:记(值为1,)值为-1,从左到右不断累加。如果前i个括号是合法的括号序列,即累加值为0且累加值不出现负值,就直接不管前i个。对于每一个不合法的括号序列一定是以)为开头,此时累加值为-1,从这个位置向右不断累加,直到累加值为0,把这之间全部翻转就一定能形成合法序列。#include<cstdio>#

2016-09-15 14:46:21 442

原创 BZOJ 1925 [Sdoi2010]地精部落

抖动序列DP思维难度好大- -,我就发一个比较详细的题解吧记f[i][j]表示长度为i(可以理解为序列是1~j的排列),首项取值为[1,j]的第一段为下降抖动序列方案数。(这个方程还真是很难想出来,要考虑到长度为i的序列可以由长度为i-1的序列通过首项的关系转移过来)方程:f[i][j]=f[i][j-1]+f[i-1][i-j]f[i][j-1]好理解,这可以直接求出首项为[1,j-1]的方案数,

2016-09-14 21:28:05 453

原创 BZOJ 1096 [ZJOI2007]仓库建设

斜率优化DP记pre[i]为p[i]的前缀和,s[i]为1~i的物品全部运到i的花费,然后可以弄出一个方程,接着就可以发现斜率优化。下午脑子不太清楚方程写错+程序打错 吃枣药丸。。。#include<cstdio>#define N 1000005#define ll long long#define TEMP N-1using namespace std;ll f[N], pre[N]

2016-09-14 15:56:08 275

原创 BZOJ 1043 [HAOI2008]下落的圆盘

三角函数计算+区间合并对于每一个圆,判断接下来掉落的圆是否会覆盖它,用余弦定理之类的三角函数搞一搞就好了。计算出被覆盖的角的区间,然后并一下。#include<cstdio>#include<cmath>#include<algorithm>#define N 1005using namespace std;struct circle{ double r, x, y;}c[N]

2016-09-14 10:34:03 316

原创 BZOJ 1051 [HAOI2006]受欢迎的牛

缩点对于一个强连通分量,里面的所有点都是等效的,任意一个点被欢迎等价于全部被欢迎,任意一个去欢迎等价于全部去欢迎,于是把他们缩起来。缩完得到一棵树,只需判断出度为零点是否唯一即可#include<cstdio>#include<algorithm>#define N 10005#define M 50005using namespace std;struct edge{int next,t

2016-09-14 10:26:44 290

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除