自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lych的博客

nothing

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

原创 bzoj 3530: [Sdoi2014]数数 AC自动机&动态规划

构建幸运数的AC自动机。令dp[i][j][k]表示匹配到n的第i位,在AC自动机的第j位,状态为k的方案。其中状态定义如下:       k=0表示前i为比n的前i位小;k=1为相等;k=2为大于。       然后对每一个i统计答案即可。AC代码如下:#include#include#include#define ll long long#define mod 1000

2016-04-04 20:42:12 756

原创 bzoj 3529: [Sdoi2014]数表 莫比乌斯反演&树状数组

然后按照f[i]和a分别排序之后离线插入用树状数组维护前缀和即可。AC代码如下:#include#include#include#define N 100005using namespace std;int cnt,pt,mx,p[N],mu[N],c[N],prm[N],ans[N];struct node{ int x,y,k,id; }a[N],f[N];int re

2016-04-04 20:36:49 609

原创 bzoj 2743: [HEOI2012]采花 树状数组

令pre[i]表示在i之前和i同色的与i最近的点,则答案相当于统计有多少点,满足pre[]在(l,r)区间中,而pre[pre[]]不再(l,r)中。离线树状数组即可。AC代码如下:#include#include#include#include#define N 1000005using namespace std;int n,cnt,m,pt,tot,c[N],fst[N

2016-04-02 13:27:54 900

原创 bzoj 4384: [POI2015]Trzy wieże 树状数组

显然全部相同的可以O(N)扫一遍得到,那么不妨考虑不存在某两种字母相同的最长长度。       令x[i]为1~i中‘B’的个数,y[i]为'C'的个数,z[i]为‘S’的个数。那么某一段i+1~j,不符合题设的条件为:       x[i]-x[j]=y[i]-y[j]或x[i]-x[j]=z[i]-z[j]或y[i]-y[j]=z[i]-z[j]。       如果把与i相关的

2016-04-02 12:01:34 2010 6

原创 bzoj 4386: [POI2015]Wycieczki 矩阵乘法&倍增

由于边权       但是由于拆了点,因此不是每个点都是到达状态的,有两种解决办法,一种是新建一个汇点T,然后到达状态向T连一条边;或者根据出发状态然后乘上出去的路径条数转化为到达状态(见代码)。       求答案的时候,可以将k变成开的上界,然后答案+1即可。       如果考虑二分答案,那么可以,新建源点S,然后向所有点连一条边,就可以用矩阵乘法得到步数=x的路径的条数。如果要

2016-04-01 16:42:52 1596

原创 bzoj 4383: [POI2015]Pustynia 线段树优化建图

首先对于题目中的某一个条件,考虑朴素建图,如下:       新建一个点p,向所有的条件给定的x[i]连边p->x[i],边权为0;同时向所有l~r中不是x[i]的点t连边t->p,边权为1;那么一个点i的值f[i]就是max(a[i],f[j]+Wj->i)。拓扑排序或者记忆化搜索都可以。       但是这样建图为O(N^2),观察发现所有的边t->p中的t实际上是若干个区间。那么可以

2016-04-01 09:18:12 2898

原创 bzoj 4345: [POI2016]Korale 优先队列&dfs

首先构造出第k小的项链的权值。根据dfs求第k小的权值的流程类比,每一个项链可以用一个二元组(i,j)表示权值为i,最大的为j号(从小到大排序之后)。那么把这个二元组塞进优先队列,一个二元组(i,j)可以得到(i-a[j]+a[j+1],j+1)或者(i+a[j+1],j+1),然后一直拓展到k个为止。       接着是求第k小。我们可以直接按照dfs,得到第k小,那么只要保证只dfs 1~

2016-04-01 07:19:32 2046

原创 bzoj 4444: [Scoi2015]国旗计划 递推

首先离散化,然后破环成链,那么覆盖住所有边防站相当于再链中覆盖一段[l,l+n],那么强制选择第i为战士就相当于强制左边界为a[i],a[i]表示第i个战士覆盖的左边界。       另外可以发现,任意两个答案之间不会相差超过1。       那么可以令f[i]表示左端点f[i]走直到i>=l+n,那么步数就相当于最小覆盖上数。发现这构成了一颗树,因此相当于求树中走到一个点的步数。直接暴力

2016-03-31 19:07:52 1219

原创 bzoj 4317: Atm的树 树分治

一道比较经典的树分治把。。       二分答案,然后在按照点分治后得到的重心树中找距离AC代码如下:#include#include#include#include#define inf 1000000000#define N 30005#define M 1200005using namespace std;int n,k,m,cnt,rt,tot=1,all,p

2016-03-31 18:17:39 1016

原创 bzoj 4349: 最小树形图 朱-刘算法

最裸的最小树形图(←现在才学的弱渣)。       显然只需要打一下一个堡垒,然后剩下的可以最后用最小的代价再打。       然后只要把图建出来跑一下朱-刘算法即可。       简单讲一下朱-刘算法吧(思想还是很简单的),下面只考虑图连通的情况:       首先为每一条边定一条边权最小的入边,并将所有这些入边的和累加入答案。那么如果没有环,显然现在所有的入边就构成了最小树形图

2016-03-31 15:05:34 2056

原创 bzoj 4346: [POI2016]Nadajniki 树形动规

首先一个点最多放两个wifi;不妨考虑用树形动规得到以某个点i的子树中wifi覆盖的最优解,那么转移的时候只需要让这个点到其儿子的路径覆盖wifi即可。有多种情况:       1.在这个点放wifi。那么可以用p[i][1],p[i][2]表示放1、2个wifi的最优解,如果i放了wifi,那么它到儿子的路径显然已经被覆盖,用儿子的对应状态转移一下即可。       2.不放wifi。那

2016-03-31 13:19:21 1516

原创 bzoj 3551: [ONTAK2010]Peaks加强版 最小生成树&主席树

我们如果首先求出了最小生成树,那么在询问的时候去掉所有边权>x的边,那么剩下的和v相连的就是可以走到的山峰。       那么考虑在并查集的时候做一点科(shou)技(jiao),比如现在要合并u和v所在的连通块,边权为t,那么显然u中所有点到v中所有点的路径中的最大边权为t,那么新建一个点p,连p->u和p->v且p的点权为t。那么n-1合并之后得到了一颗有n的叶子节点的树,那么两个点x->

2016-03-30 13:00:08 950 3

原创 bzoj 4454: C Language Practice 最大公约数

最大公约数的O(N)预处理O(1)求法。       首先令m=N^0.5,那么我们可以通过记忆化搜索的形式得到所有的gcd(i,j),其中i,j       那么考虑求两个不超过N的数x,y的gcd;我们一定可以把x分解成三个数a,b,c,每个数都满足要么       假设存在关于某个x的a不满足条件,那么显然有a为合数且a>m。那么假设a的一种分解方式为a=uv(不妨令u>v),由

2016-03-30 08:07:09 1363

原创 bzoj 4408: [FJOI2016]神秘数 主席树

先看一下对于给定的一段如何暴力求最大值,首先将这一段排序,然后如果存在某一个数,这个数比它前面的数的前缀和至少大2,那么答案就是它前面那个数的前缀和+1。       那么假设现在处理了前面较小的一些数之后的答案为ans,然后可以求出比ans小的数的总和t,如果tAC代码如下:#include#include#include#include#define N 100005#d

2016-03-30 07:24:20 2220

原创 bzoj 3198: [Sdoi2013]spring hash&容斥原理

首先可以用容斥,这样就只用统计制定的i列相同的行的对数了(而不用恰好)。       那么可以把这几行对应的列抽出来,然后用hash值(不妨自然溢出)来统计,可以得到hash值相同的行的个数,然后一边更新一边统计答案即可。注意hash值很大需要用hash统计(此hash非彼hash)。       时间复杂度O(2^6*N)。AC代码如下:#include#include#in

2016-03-29 16:48:44 871

原创 bzoj 3594: [Scoi2014]方伯伯的玉米田 动态规划+树状数组

不知道为什么1个log比2个log还要慢。。。(bzoj真是鬼畜评测)      可以发现如果在最优方案中,存在一个拔高区间[l,r]且r       然后可以写出一个N^2K^2的动规,为:       f[i][j]=max{f[x][y]}+1,满足x       那么这就是一个三位偏序了,直接用二维树状数组为O(NKlogNlog(maXNum+M))。       然

2016-03-29 14:53:58 696

原创 bzoj 4381: [POI2015]Odwiedziny 树链剖分

设一个数m,然后将步伐m的,就直接暴力走,这样最多走N/m步,只要能每步O(1)就可以做到询问O(N/m)。       那么令m=N^0.5;然后考虑怎么走,首先要快速求出lca,那么如果用树链剖分,走的时候在重链上面走,然后重链和重链之间用logN查询。这样就是O(log^N+N^0.5),查询lca可以用树链剖分醉倒O(logN)。那么总的时间复杂度为:       O(N^1.5+

2016-03-29 13:31:09 1279

原创 bzoj 4380: [POI2015]Myjnie 动态规划

感谢Claris的题解。       令t[l][r][x]表示l~r家店,最小的价格为x时,对于所有l=x的最大收入,同时令pos[l][r][x]表示最小的价格的店。然后就是O(N^3M)了。AC代码如下:#include#include#include#include#define N 55#define M 4005using namespace std;int

2016-03-28 20:14:42 1620

原创 bzoj 4377: [POI2015]Kurs szybkiego czytania 数学

令f(i)=ai+b,由题意(a,n)==1,那么可以得到f(i)两两不同。同时可以发现对于一个f(i),如果f(i)已经确定,那么i~i+m-1的01串也就确定了,因此我们可以判断f(i)为开头时是否与给定串相同。       然后按照给定的串的每一位,得到f(i)不可能出现的位置;另外f(n-m+1)~f(n-1)也是不可能的。那么把所有不可能的求并,然后补集的大小就是答案。AC代码如

2016-03-28 20:02:07 1128

原创 bzoj 3205: [Apio2013]机器人 斯坦纳树

这道题目应该是比较明显的斯坦纳树吧。       令f[l][r][x][y]表示将编号l~r的机器人合并到(x,y)的最小代价,那么就有转移:      1. f[l][r][x][y]=min{f[l][k][x][y]+f[k+1][r][x][y]}      2. f[l][r][x1][y1]=min{f[l][r][x][y]+1},满足将(x,y)往某一个方向推之后会到

2016-03-28 19:49:34 2105

原创 bzoj 4246: 两个人的星座 计算几何

据说是合宿系列最难的一题。。。(反正我一题都不会也没什么感觉)       考虑任意一对符合条件的三角形(i,j),一定可以在三角形i和j中找到两对点,这两点的连线段所在直线将这对三角形分割到两个不同的半平面中。即存在两条公切线。       那么我们就可以枚举这条公切线了,也就是O(N^2)枚举,这样可以暴力O(N^3)得到答案;注意到如果,枚举一个定点,然后将剩下的点按与定点连线段所在

2016-03-28 19:44:40 1592

原创 bzoj 2141: 排队 分块

这种题目如果分块O(N^1.5logN)水过去好像有点对不起自己。       直接写一个O(Nlog^2N)树套树好像也太暴力了一点。       然后写了一个O(N^1.5)分块。。。(所以你就水了这道题拉??)       考虑O(N^1.5logN),先离散化,然后分成N^0.5块,每一块用树状数组维护身高1-h的小盆友的个数。首先得到初始的答案,每次询问就对于一整块和零散的部

2016-03-26 21:03:32 1083

原创 bzoj 2140: 稳定婚姻 强连通分量

这道题目建图还是很奇妙的。       把一对夫妻抽象为一个点i。那么如果夫妻对i的男方和夫妻对j的女方有关♂(jian)♀系♂(qing),那么就连一条边i->j,那么如果存在一个环就说明不(hui)安(chu)全(gui)。       Tarjan强连通分量跑跑就好了。AC代码如下:#include#include#include#include#define N 4

2016-03-26 20:52:33 596

原创 bzoj 4244: 邮戳拉力赛 动态规划

感觉自己dp这方面还需要加强啊。       显然一个合法的方案已定包含一条0-N+1的上行链(可以拼接得到),剩下的是一些环。       令dp[i][j]表示盖了前i个邮戳,并且从下行站走到上行站的次数-从上行站走到下行站的次数=j时,不计0-i的上行链的时间时的最小耗费。       j可能比较费解。形象一点,由于剩下的是一些环,那么环一定是i的上行站->i的下行站->j的下行

2016-03-26 20:38:24 850

原创 bzoj 4243: 交朋友 bfs

显然两个国家如果能进行会议那么一定要进行会议。考虑怎样的国家可以进行会议,注意到一个点,对于它的出边到达的点(称为后继),如果后继的个数>=2,那么这些后继之间可以两两进行会议。那么不妨将这些点缩成一个点,然后不断缩点直到不能缩为止,这时,对于一个缩起来的点,里面边的数量为包含点的数量*(包含点的数量-1),对于普通的点,对答案的影响即出度。       不妨用并查集来缩点。注意对于一对点(i

2016-03-26 20:30:04 834

原创 bzoj 4242: 水壶 最小生成树&树上倍增

为了降低AC率这道题目我各种花样作死爆OJ,最后还是和标算改得差不多了。。。       显然答案应该为建筑物构成的最小生成树中,两点间的最大路径;那么只要得到这棵最小生成树就可以用倍增在O(QlogN)的时间内得到答案了。因此关键是求最小生成树。       注意到是平面图,因此考虑用bfs求最小生成树。直接以每个建筑为原点拓展显然不行,那么我们可以把每个建筑都加入队列一起拓展,那么对于

2016-03-26 20:21:16 2020 3

原创 uoj171 bzoj 4405: [wc2016]挑战NPC 一般图最大匹配

不得不说建图太巧妙了,我在知道是一般图最大匹配的情况下都不会建图。。。       首先每个筐放三个,这个“三”是很关键的。       把一个筐拆成三个点,然后每一个球向可以放的三个筐都连边;同时三个筐之间互相连边。那么如果一个筐只有       注意bzoj和uoj上面的输出是不一样的。AC代码如下(uoj):#include#include#include#defi

2016-03-25 20:46:44 1359

原创 uoj184 bzoj 4456: [Zjoi2016]旅行者 分治+最短路

当时已经没心情做题(qi liao)了,写了个分块搞(pian)了50分。        实际上分块和分治的思想是差不多的,就直接讲分治吧。。        首先转离线操作,然后对于某一个矩形区间x∈[lx,rx],y∈[ly,ry],然后要求出所有源点和汇点都在其中的询问,且路径不超出所在区间的答案。不妨设rx-lx>ly-ty,那么对x坐标进行分治,即将这个区间分成两块,那么对于某一个

2016-03-25 20:39:12 4128 5

原创 uoj185 bzoj 4455: [Zjoi2016]小星星 树形dp&容斥

考场上对这道题目一点思路都没有。。一直以为状态和顺序有关然后就gg了QAQ。然而这就是能用子集dp的!/(ㄒoㄒ)/~~都想到用容斥了。。但是dp状态搞不出来QAQ。       令f[i][j][S]表示以i所在的子树(不妨令1为根节点)中与图中编号集合为S的点一一对应,且i与j对应的时候的方案数,然后就可以大力转移了。这样是O(N^3*3^N)的,拿的分好像和暴力差不多。(听说可以用f[i

2016-03-25 14:02:31 3226

原创 bzoj 4241: 历史研究 分块

首先分成N^0.5块,然后答案显然是中间一整段的最大值,或者是两端零星的部分。       那么可以得到f[i][j]表示第i块到第j块的答案;然后就需要快速求出零星部分出现的次数,用一个前缀和s[i][j]表示在前i块中j出现的次数。       离散化搞一搞。       好像莫队也是可以的把。AC代码如下:#include#include#include#inclu

2016-03-25 11:21:45 550

原创 bzoj 4239: 巴士走读 类最短路

首先发现答案满足二分性质(并不是要去二分QAQ),所以可以排个序然后扫一遍;而且答案只和最后一辆车直接相关,因此需要得到赶上每一辆车i的最晚出发时间g[i]。       那么要先得到每一个点i,到达点i的最晚出发时间f[i],然后就可以用g[]和f[]互相更新,最后得到所有右端点=n的g[]排序之后更新答案即可。AC代码如下:#include#include#include#i

2016-03-25 09:56:51 1245

原创 bzoj 3944: Sum 杜教筛

本来以为这种东西只能O(N)线性筛,但是大千世界,无(sang)奇(xin)不(bing)有(kuang),确实存在更快的算法。       省选的时候rzz讲这种东西在国内OI称为杜教筛,用来求数论函数的前缀和,课件中有一般形式。       首先考虑对μ函数的前缀和(欧拉函数同理):       令f(x)=Σ(d|x) μ(d),μ的前缀和记为s(x),令g(x)为f的前缀和,那

2016-03-24 20:45:40 6727 3

原创 bzoj 3065: 带插入区间K小值 替罪羊树套主席树

省选的时候听来一个分块做法,就是按照询问Q每Q^0.5分一块然后块与块之间暴力重构。       或者用权值线段树套替罪羊树,具体可以见clj《重量平衡树和后缀平衡树在信息学中的应用》中一道例题。       我用的是替罪羊树套主席树,具体用替罪羊树保存一个区间[l,r]中的一颗记录颜色的主席树,然后查询的时候就提取出logN个区间在主席树上二分;插入的时候如果不平衡就暴力重构。

2016-03-24 20:17:38 2136

原创 ZJOI2016一试 酱油记

Day0:到了学车,然后领了胸(gou)牌,就会宾馆了。。看电(xiao)视(shuo)颓,手机不能下App好不兹瓷啊。       Day1:上午rzz(StilWell?)讲数学,,就推(cai)出了第一道。。然后听懂了一点点就开始碎觉了。。听到杂题的时候就又复活辣~\(≧▽≦)/~。                   下午感觉画风明显不对啊。。怎么变成dp了。。然后还有树分

2016-03-24 18:51:09 3498

原创 NOIP2015 口胡题解

现在才想起来写个解题报告。。。o(╯□╰)oDay1:       T1:模拟题直接n^2乱搞。O(N^2)       T2:方法一:直接tarjan强连通分量。由于题目中图的特殊性质所以一个强连通分量就是一个环然后除了大小为1的强连通分量中最小的那个就是答案。               方法二:这是我考场上的做法。当时怕爆栈没敢写tarjan(Day2考到一半

2016-03-19 17:02:05 1685

原创 bzoj 4240: 有趣的家庭菜园 树状数组

(随手写了一发rank1什么鬼。。)       因为4239有点繁琐,就先跳过去了。。。然后看完这道题目就懵逼了。。o(╯□╰)o       但是仔细想想会发现对于一棵草,它的移动是不会影响到比它更高的草的,因此我们可以从小到大移动草,并且贪心地移动到较小的一边,换句话说令f(i,j,k)表示i~j中比k大的数的个数,那么对于某一棵草(x,y)(位置为x高度为y)的答案为min{f(1

2016-03-19 16:56:45 1394

原创 bzoj 4238: 电压 dfs

这道题目就是求能否将某一条边的两边染成同色,使得剩下的图可以黑白染色,问这样的边一共有几条。       感觉和陈老师在cf上面的某道题差不多?(然而我并不会拿到题目)。假设现在有一条边符合条件,那么它一定需要在所有的奇环上面,同时不再任何一个偶环上面。因此使用dfs即可,考虑一条边,由于是无向图所以一定是返回到祖先节点,那么就构成了一个环,然后用深度来判断是奇环还是偶环即可。

2016-03-19 12:55:23 813

原创 bzoj 4247: 挂饰 动态规划

背包斯波题。。可以发现容量就是-N~N。。然后就没有然后了。O(N^2)。AC代码如下:#include#includeusing namespace std;int n,m,f[4005];int main(){ scanf("%d",&n); m=n<<1; int i,j,x,y; for (i=0; i<=m; i++) f[i]=-2100000000; f[n]=

2016-03-18 20:58:48 441

原创 bzoj 3620: 似乎在梦中见过的样子 kmp暴力

这道题目感觉上好像是可以用SA过掉的。。但是看一下N15000然后Statue里面一个个都6000+ms,翻了一下题解发现是kmp暴力。       打了一半发现不会然后回去看题目,发现位置相同但是结构不懂的子串只算一次!!!这大概就是为什么不能用SA的原因吧。。不过这样kmp就好写多了。      首先枚举头结点i,同kmp构造S[i,n]的失配函数,然后我们发现对于一个右端点j能更新答

2016-03-18 19:56:44 2323

原创 bzoj 4237: 稻草人 CDQ分治

可能严格来讲不算CDQ分治把。。我也不太清楚>_       按照y坐标来分治,然后首先处理上下两块(下面的y坐标小)的答案。       然后对于某一段,首先按照x坐标进行排序,考虑上面的一块对下面一块产生的答案。考虑上面一块中的某一个点i,以它为右上角的矩形的左下角的x坐标是有范围的限制的(左下角在下面一块中)。显然左下角的x坐标不能       于是直接将上面一块的点维护一个y坐

2016-03-18 15:40:09 2377 1

空空如也

空空如也

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

TA关注的人

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