自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 bzoj 2879 [Noi2012]美食节 费用流

建图和修车是一样的,不过这题需要动态加边。注意这题费用流必须跑一条路加一条路,不能跑多条路后加边因为如果跑多条路后加边可能导致跑了不是最优的解,然后加了一条边权较小的边出现负环。 不过如果每次跑一条路加一条路可以保证每次取的都是最优解。#include <bits/stdc++.h>using namespace std;#define inf 1e9#define N 11000#def

2016-12-29 21:11:46 388

原创 bzoj 2402 陶陶的难题II 01分数规划 树链剖分 线段树维护凸包

先01分数规划一下,然后这个东西就是求(qj−kpj)+(yi−kxi)(q_j-kp_j)+(y_i-kx_i) 的最大值。 把qi−kpiq_i-kp_i 和yi−kxiy_i-kx_i分开考虑,这是一个斜率的式子,只会取上凸包的点。因此树剖把这个东西放到线段树上,线段树每个节点维护一个凸包。 然后求的时候三分就行了。 虽然这个东西看起来是log4log^4 的,不过01分数规划如果用迭代

2016-12-29 18:07:13 965

原创 hdu 5279 YJC plays Minecraft 分治 NTT

答案中每个岛上一定是一坨森林。岛之间的边可以有可以没有。 不过要减去所有岛都1和a[i]连通并且所有岛之间的边都存在的情况。 设f[x]表示对于一个城镇数为x的岛,连成森林的方案数。 那么f[x]=∑i=0x−1f[i]∗v[x−i]∗Cx−i−1x−1f[x]=\sum\limits_{i=0}^{x-1}f[i]*v[x-i]*C_{x-1}^{x-i-1} =(x−1)!∑i=0x−1

2016-12-29 14:26:25 637

原创 bzoj 2329 [HNOI2011]括号修复 splay

区间赋值,区间翻转,区间反转,也就splay能干这些事吧。。。 维护一个区间最小值low,区间最大值up,区间和sum,然后一段区间的答案是 (−low[x]+1)/2+(sum[x]+(−low[x]+1)/2∗2)/2(-low[x]+1)/2+(sum[x]+(-low[x]+1)/2*2)/2再打一坨标记就行了,注意标记重叠#include <bits/stdc++.h>using n

2016-12-29 09:15:26 376

原创 bzoj4405 [WC2016] 挑战NPC 带花树

Orz vfk 前一段写过一次带花树,现在已经不会敲板子了。。 把每个筐拆成一个三角形,每个球向匹配的筐的三个点连边,然后跑带花树。答案是匹配数-n,因为每个半空的筐都会自己得到一个匹配,而且一定存在一种最大匹配使所有球匹配。感觉这种题即使考场上想出来了板子能不能敲对还是个问题(汗)。。。#include <bits/stdc++.h>using namespace std;#define

2016-12-28 19:58:37 496

原创 bzoj 2300 [HAOI2011]防线修建 splay维护凸包

正常的splay维护凸包不支持删点,把操作倒过来变成加点。 HAOI真心良心呀,边界都给好了。。。#include <bits/stdc++.h>using namespace std;#define N 110000#define M 210000#define which(x) (ch[fa[x]][1]==x)int d,n,Q,root;int X[N],Y[N],vis[N]

2016-12-28 15:00:35 377

原创 hdu 5322 Hope 分治 NTT

设f[i]f[i] 表示长度为i时的答案,那么 f[i]=∑i=1nCj−1i−1∗f[i−j]∗(j−1)!∗j2f[i]=\sum\limits_{i=1}^{n}C_{i-1}^{j-1}*f[i-j]*(j-1)!*j^2 然后这个东西直接分治fft就行了。 推错式子害死人。。。#include <bits/stdc++.h>using namespace std;#define

2016-12-28 11:21:05 451

原创 bzoj 2730 [HNOI2012]矿场搭建 点双连通分量

如果只有一个点双,答案为2,随便选两个点。 否则求每个点双里有几个割点,如果割点个数大于等于2,那么这个点双中不用选点,如果个数为1,那么点双中需要选一个不是割点的点。#include <bits/stdc++.h>using namespace std;#define N 510#define ll long longint m,tot,cnt,cr,top,ans,Case,scc;

2016-12-28 08:43:52 390

原创 hdu 3749 点双连通分量

留个模板(求所有点双) 求所有点双时开个栈维护。注意求点双时记录一下每个子树开始的位置,如果这个点是对于这个子树的割点,那么点双是这个子树在栈中剩下的点+这个点本身。#include <bits/stdc++.h>using namespace std;#define N 5100#define M 21000int n,m,Q,tot,cnt,tim,Case,top,scc;int

2016-12-27 21:12:40 341

原创 bzoj 2006 [NOI2010]超级钢琴 二分答案 可持久化线段树

大家好,这里是一个log^2的智障。 看到第K大直接想到二分答案+主席树,主席树维护区间的个数和区间的和。良心BZ测总时限竟然16s过了。。。 原来正解就是主席树套个堆。。。#include <bits/stdc++.h>using namespace std;#define N 1010000#define M 20000000#define ll long long#define

2016-12-27 18:18:56 322

原创 bzoj 1758 [Wc2010]重建计划 01分数规划 点分治 单调队列

直接01分数规划,然后把树分治查找所有链,然后合并时就是查一个定长区间的最大值,宽搜离线下来然后单调队列搞就行了。不过我想说这题卡常数。。。卡常数。。。常数。。数。。 不过好像三个月之前做就没有这事了。。。树分治可以预处理快了两倍,01分数规划从二分改成迭代快了四倍+,然而bz上还是跑了20+s。。。#include <bits/stdc++.h>using namespace std;#de

2016-12-26 19:27:18 353

原创 bzoj 2759 一个动态树好题 LCT 数学

果然是一道动态树好题。 《论LCT的正确使用方法》以及《出题人真会玩》系列把每个点向p连一条边,那么这是一个基环树森林。 先从环上拆下来一条边并记录这条边指向的点,然后这玩意就变成了一坨有根树。 设根为x1,根指向的点为x2,那么所有点都可以用关于x2的一次函数表示。然后用x2本身的一次函数可以解出x2。 然后用LCT维护这坨有根树。 splay上每个点维护用这个点子树中最小(最靠左,原树

2016-12-26 11:27:25 501

原创 bzoj 1453 双面棋盘 LCT 并查集

把每个格子看成点,同色格子之间连边。 LCT维护关于删除时间的最大生成树。 设有x1个原来与当前格子同色的连通块与当前格子断开,x2个原来与当前格子不同色的连通块与当前格子连通,那么会增加x1-1个当前格子原来颜色的连通块,减少x2-1个当前格子现在颜色的连通块。 写得比较挫,初始状态用的并查集。。。#include <bits/stdc++.h>using namespace std;#

2016-12-24 15:05:54 329

原创 4574 [Zjoi2016]线段树 dp

这题的前缀和开始没有想到。 如果不用前缀和状态是五维的。。。由于数据随机所以不会有两个相等的数。 最终答案是求每个数在所有方案下的取值的和。 对于每个数dp一下,设当前数为val,区间[L,R]为以当前数为最大值的最大区间。 设f[i][l][r]f[i][l][r] 表示前i个询问,区间[L,R]剩余的小于等于当前数的区间为[l,r]的方案数。 然后转移时处理一个前缀和可以O(1)转移。

2016-12-23 07:55:47 303

原创 bzoj 4321 queue2 dp

设f[i][j][0/1]f[i][j][0/1] 表示前i个数有j个非法的,i是否与i-1相邻的方案数,转移看代码吧。。#include <bits/stdc++.h>using namespace std;#define N 1100#define mod 7777777#define ll long longint f[N][N][2],n;void upd(int &x,int

2016-12-22 17:58:13 324

原创 bzoj 4318 OSU! 概率dp

这道题只是想告诉我们只有两个期望无关时才可乘,因此平方的期望不等于期望的平方。。。 需要维护f1[i]表示到i连续的个数的期望,f2[i]表示到i连续的个数平方的期望,f3[i]表示到i连续的个数立方的期望#include <bits/stdc++.h>using namespace std;#define N 110000int n;double f1[N],f2[N],f3[N],pr

2016-12-22 15:02:12 261

原创 bzoj 4197 [Noi2015]寿司晚宴 dp 容斥

注意到小于n√\sqrt{n} 的质数最多有8个。而大于n√\sqrt{n} 的质因子每个数至多有1个。 因此状压<n√<\sqrt{n} 的质数。 设f[i][j]f[i][j] 表示A选的<n√<\sqrt{n} 的质数集合为i的子集,B选的<n√<\sqrt{n} 的质数集合为j的子集的方案数。预处理num[i][j]num[i][j] 表示<n√<\sqrt{n} 的质因子集合为i,>n

2016-12-22 13:52:12 286

原创 bzoj 4145 [AMPPZ2014]The Prices dp

设f[i][j]f[i][j]表示前i个商店买了j集合的物品的最小花费。 g[i][j]g[i][j] 表示第i个商店的买了j集合的物品的最小花费(含路费)。 注意到如果g[i][x]≤g[j][x]g[i][x]\le g[j][x] 那么去i买x的物品一定不比去j买x的物品差。 因此对于一种物品集合只需要有一个商店转移时转移这个集合就行。 复杂度O(n2m+3m)O(n2^m+3^m)

2016-12-22 09:52:38 318

原创 bzoj 4008 [HNOI2015]亚瑟王 期望dp

先考虑这么一个式子: Pr第2次选2=Pr第2次不选1∗Pr第1次不选2∗Pr选2Pr_{\text{第2次选2}}=Pr_{第2次不选1}*Pr_{第1次不选2}*Pr_{选2} 其中Pr表示概率。 这个式子是错的,因为 第1次不选2和第2次不选1的概率不是独立的。 所以直接算的方法gg了。 设f[i][j]f[i][j] 表示前i个点有j个被选过的概率。 g[i]g[i] 表示点i被选

2016-12-20 21:27:36 441

原创 bzoj 4000 [TJOI2015]棋盘 dp 矩乘

逗比题面,毁我青春 行列编号从零开始。。。然后我以为那个点在最上面那排。。。 妈蛋那样要记两排状态!!! 点在中间那排的话记一排状态矩乘转移就行了。#include <bits/stdc++.h>using namespace std;#define ui unsigned intint n,m,p,K;int a[4][7],able[71];ui ans;struct Matr

2016-12-20 18:42:04 520

原创 bzoj 3879 SvT 后缀数组 rmq 并查集

先求出后缀数组。 对于每组询问,按rank排序,求相邻两个的lcp,按lcp从大到小合并相邻两个,用并查集维护。#include <bits/stdc++.h>using namespace std;#define N 510000#define M 3100000#define ll long long#define mod 23333333333333333llint n,m,Q;

2016-12-20 15:41:01 433

原创 bzoj 3851 2048 dp

一开始sb看错题,没看见两个相等的数拼在一起。 如果只有两个相等的数能拼在一起,那只有2的整数次幂有用。 设f[i][j]f[i][j] 表示选了202^0 到 2i2^i 的数和为j的方案数。 注意到只要和大于等于2048就有解,因此第二维只需要到2048(表示大于等于2048)。 然后对组合数求一个后缀和,当第二维大于2048时直接用后缀和转移。#include <bits/stdc++

2016-12-20 12:40:55 471

原创 bzoj 3611 [Heoi2014]大工程 虚树 dp

直接上虚树dp一下就好了。。。#include <bits/stdc++.h>using namespace std;#define N 1100000#define ll long longint n,Q,cnt,top,tot,m,tim;int head[N],nex[N<<1],to[N<<1],st[N];int a[N],pos[N],fa[N][21],deep[N],bj

2016-12-20 09:37:46 302

原创 bzoj 3598 [Scoi2014]方伯伯的商场之旅 数位dp

当位置向后移动时,可以发现答案加上前面一段所有数字之和减去后面一段所有数字之和。 然后前面一段所有数字之和单调不减,后面一段所有数字之和单调不增。 为了避免重复找最前面的满足的点。设答案的位置为a1,a1的下一个位置为a2。 应该选取的位置满足s1<a1+a2+s2     s1+a1≥a2+s2s1<a1+a2+s2\ \ \ \ \ s1+a1\ge a2+s2 然后对左边右边分别数

2016-12-20 08:39:33 691

原创 bzoj 3572 [Hnoi2014]世界树 虚树 dp

先建出虚树(似乎虚树可以不写重新标号) dfs两次维护f[x]f[x] 在x的子树中距x最近的选中的点,g[x]g[x] 整棵树中距x最近的选中的点。 考虑虚树中的每一条边,这条边上的所有不在虚树上的点以及他的子树只能选这条边两端的虚树上的点的g[x]g[x]。 求出分界位置。对于求一条链上点的子树的大小之和,可以倍增维护一个点到祖先的size之和,假设求链fa[x]到fa[y]上点的子树

2016-12-19 18:41:19 228

原创 bzoj 3566 [SHOI2014]概率充电器 概率dp

题里那个直接充电和间接充电是一样的。。。 除0挂了半天还以为是卡精。。。设f[i]f[i] 表示i和i的子树使点i充电的概率。 设g[i]g[i] 表示除掉i的子树的剩余的部分把i的父亲充电的概率。 转移看代码吧。。。。#include <bits/stdc++.h>using namespace std;#define N 510000#define eps 1e-15int n,t

2016-12-19 13:33:17 339

原创 bzoj 3120 Line 矩乘 dp

每行结尾连续的1的个数只能是0,1,2。 状态记录一下有几行结尾连续的1的个数为0,几行结尾连续的1的个数为1,当前有多少列为全1。 然后矩乘转移就好了。#include <bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000007int n,P,Q,cnt,ans;ll m;struct

2016-12-16 09:43:57 405

原创 bzoj 3072 [Pa2012]Two Cakes dp

这是一个排列因此上下的点是两两对应的。 然后每次找最近的上下对应位置相等的点,在这个位置把上面或下面往后移动一格。这样一定可以得到最优解。 就像这样: 其中红色和蓝色对应相等。 设下面第i个点和上面值对应相等的位置差为val[i]val[i](可以为负) 那么如果当前点为i,那么当前点往前或往后移动后,下一个上下对应位置相等的点的valval 为 val[i]+1val[i]+1 或

2016-12-15 20:22:54 428

原创 bzoj 2734 [HNOI2012]集合选数 dp

注意到每一组k2x3y(k%2!=0,k%3!=0)k2^x3^y(k\%2!=0,k\%3!=0) 都是独立的。 那么可以分开算。对于一个k,2x3y2^x3^y 的上界为nk\frac{n}{k},把(x,y)(x,y)看成一个点,形成的图形大概是这样的。 如果一个点选了那么他左边和下边的点不能选。设f[i][j]f[i][j]表示选到第i列,当前列的选法为j的方案数。最后把对于所有k的答案

2016-12-15 12:59:42 195

原创 bzoj 2726 [SDOI2012]任务安排 CDQ分治维护凸包 dp

单调处理出第一个串往两边K个能覆盖的字符。 然后对四种字符每种字符做一遍FFT。 对于第一个串,如果这个位置不能匹配当前字符,那该位置为1。 对于第二个串,如果这个位置为当前字符,那该位置为1。 把第二个串反过来和第一个串跑FFT。 答案是在所有FFT中都为0的合法位置个数。#include <bits/stdc++.h>using namespace std;#define N 21

2016-12-15 08:57:41 602

原创 codeforces 528D Fuzzy Search FFT

单调处理出第一个串往两边K个能覆盖的字符。 然后对四种字符每种字符做一遍FFT。 对于第一个串,如果这个位置不能匹配当前字符,那该位置为1。 对于第二个串,如果这个位置为当前字符,那该位置为1。 把第二个串反过来和第一个串跑FFT。 答案是在所有FFT中都为0的合法位置个数。#include <bits/stdc++.h>using namespace std;#define N 21

2016-12-13 21:00:15 382

原创 bzoj 2708 [Violet 1]木偶 dp 贪心

把所有pi排序。最终答案一定是这样的。 就是先一些向左匹配的,再一些向右匹配的。 设f[i]f[i] 表示前i个点的最大个数。 枚举最后一个同向的区间。验证时从小到大枚举验证。#include <bits/stdc++.h>using namespace std;#define N 61int n;int a[N],f[N];int get(int l,int r,int x)

2016-12-13 18:00:59 337

原创 bzoj 2560 串珠子 状压dp 容斥

设f[i]f[i] 表示集合i连在一起的方案数,容斥一下就行了。 复杂度O(3n)O(3^n)#include <bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000007int n;int c[21][21],f[(1<<16)+10],sum[(1<<16)+10];int main()

2016-12-13 16:21:44 420

原创 bzoj 2500 幸福的道路 dfs 单调队列

dfs维护一个每个点向下和向上的最长路。 开两个单调队列,单调递增和单调递减,找最后一个不满足条件的点。 注意队首留一个非法的点便于更新。 每次的决策点与之前的决策点取max。#include <bits/stdc++.h>using namespace std;#define N 1100000#define ll long longint n,m,top,ans,pos;int

2016-12-12 20:36:36 311

原创 bzoj1895 Pku3580 supermemo splay

裸splay。 写这篇文章的目的在于说明我是一个智障。 woc函数又没写return,被各种编译器坑惨。。。 开-Wall 开-Wall 开-Wall。。。。#include <bits/stdc++.h>using namespace std;#define N 510000#define ls(x) ch[x][0]#define rs(x) ch[x][1]#define

2016-12-12 20:30:04 368

原创 bzoj 2286 [Sdoi2011]消耗战 虚树

倍增,然后直接上虚树。#include <bits/stdc++.h>using namespace std;#define N 260000#define ll long long#define inf 1e9int n,Q,m,cnt,top,tot;int head[N],nex[N<<1],to[N<<1],val[N<<1];int pos[N],a[N],st[N],dee

2016-12-10 20:08:48 252

原创 bzoj 2090 [Poi2010]Monotonicity 2 树状数组 dp 贪心

设f[i]f[i] 表示到i最长的长度。 然后两个树状数组和一个普通数组分别维护大于,小于和等于。 不会证这个东西。。。#include <bits/stdc++.h>using namespace std;#define N 1100000#define A 1000000int n,K;char s[N];int tr1[N],tr2[N],tr3[N];int a[N],f[

2016-12-09 20:26:20 440

原创 bzoj 4071 [Apio2015]巴邻旁之桥 splay

500题留念: 对于不过桥的人在最后加进答里就行了。 一个人过桥一定是先从a到桥再从桥到b。对于K=1的情况,设桥的位置为x,答案就是∑|a[i]−x|+∑|b[i]−x|\sum|a[i]-x|+\sum|b[i]-x|。因此选在所有a和b的中间最优。 对于K!=1的情况,考虑如果当前点选的桥坐标为x,那么对于这个点,答案是−b−a+2x-b-a+2x(a,b都在桥左),|b−a||b-a|

2016-12-09 10:13:10 477

原创 bzoj 2733 [HNOI2012]永无乡 splay启发式合并

splay启发式合并#include <bits/stdc++.h>using namespace std;#define N 110000#define which(x) (ch[fa[x]][1]==x)int n,m,Q;char s[11];int ft[N],root[N],val[N];int fa[N],ch[N][2],size[N];int find(int x){

2016-12-08 08:38:07 241

原创 bzoj 2067 [Poi2004]SZN 贪心 二分

对于第一问答案就是∑(du[i]−1)/2+1\sum{(du[i]-1)/2}+1 对于第二问先二分答案,对于一个非根的点,一定有一条从父亲向下的链,设f[i]表示到点i父亲往下的链最短长度。 将当前点的所有儿子的f[son[i]]+1f[son[i]]+1 放到一起排个序。 二分f[i]的位置,检验时去掉二分位置的值,贪心每次拿一个最小的匹配最大的(组成一条链),如果儿子总数是偶数把剩余的

2016-12-03 19:32:09 931

空空如也

空空如也

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

TA关注的人

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