自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 [USACO5.5]矩形周长Picture(线段树扫描线)

我没法写出这么详尽的题解,传送门:矩形周长很经典的一个题目,将线段之间的关系处理得很好。算是学到了一种黑科技。其实还可以离散化。(主要是题解写得好)#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#de...

2018-09-29 23:54:34 168

原创 Naptime(环形dp)

题目大意:每天有N个小时,每个小时进入熟睡状态可以获得体力值Ui,每N个小时必须休息B个小时,这B个小时可以随意分成几段,但是每段的第一个小时体力值是不计算的。现在叫你求解N个小时睡B个小时能得到的最大体力值。 分析:先假设前后两天不相连,以第一个小时作为起点。设f(i,j,0/1)表示前i个小时里,睡了j个小时,其中第i个小时正在睡(1),或者没有睡(0)。可以得到状态转移方程:...

2018-09-25 15:16:36 354

原创 【IOI1998】Polygon(区间dp)

设f(l,r,0)表示区间[l,r]操作后的最大值,f(l,r,1)表示区间[l,r]操作后的最小值,简单的区间合并即可。可以把第一条边断掉,然后把这后面的N个点复制一遍,直接做N*2长度的区间dp。答案是max:f(i,i+N-1,0)。#include<cstdio>#include<iostream>#include<algorithm>...

2018-09-25 10:59:24 165

原创 【HNOI2004】L语言(Trie树+搜索)

思路:Tire树存单词,然后每段话在Trie树上搜索。vis[i]=1表示这段话1到i能被识别,搜完后vis[i]=1最大的i就是答案,可以确保i之前的能被识别,否则dfs无法到达i。#include<cstdio>#include<cstring>using namespace std;const int MAXLEN=1000005;int ch[20*...

2018-09-04 21:36:02 242

原创 【USACO08DEC】秘密消息Secret Message(二进制Trie树)

Trie树模板题,唯一的不同在与统计答案,设val[i]表示Trie树上经过i节点的单词数,end[i]表示在i节点结束的单词数。统计时,每走到一个节点就加上end[i];如果Trie树先走到尽头就直接返回答案;如果输入的先走完,那么最后一个节点不加end[i]而是val[i]。特别注意:Trie树先走到尽头时一定要把剩下的输入读完再退出。#include<cstdio>u...

2018-09-04 17:37:29 158

原创 字符串与二进制Trie树的简单模板

字符串的Trie树:Description  给出n个单词组成的字典(可能由相同的单词),请你完成下列任务:  任务1、把n个单词去重后按字典序由小到大后输出。  任务2、给出m个询问,每次询问一个单词是否在字典中存在,如果存在,输出该单词在字典中出现的次数。Input  第一行为n和m。接下来的n行,每行一个单词。中间空一行。在接下来的m行,每行一个单词,表示一个询问。...

2018-09-04 16:47:19 383

原创 【SDOI2010】古代猪文(数论杂烩)

难题,这题要用到很多数论知识但都不深,有专门的知识点我就用红色标出。(PS.洛谷上SDOI2010跟Pig有关的好多黑题,深表同情...)首先搬出问题:                                               由扩展欧拉定理,                                              而根据欧拉函数的定义,...

2018-09-04 10:52:49 215

原创 【SHOI2015】超能粒子炮·改(Lucas定理)

我觉得这题挺难的,题解看来看去都是一步出结论,没什么过程,只有自己搞了。既然过了就尽量写清楚点。这题的模数是个质数且比较小,需应用卢卡斯定理:                                        现在用这个定理对题目所求一步一步地展开: 设答案(暂且不加上最外面的取模): 取模,用上Lucas定理:   把p=2333代入:...

2018-09-03 22:13:15 255

原创 【NOI2002荒岛野人】(扩展欧几里得算法)

题意:给你N组Ci,Pi,Li,求一个最小的M,满足对于任意的一对i,j,都有:无解或者最小正整数解x满足。(也就是有一个先老掉了)。该方程可以转化为:  于是转化为枚举M,每次用扩展欧几里得一一检查是否合法。#include<cstdio>#include<algorithm>using namespace std;typedef long...

2018-09-03 14:32:16 139

原创 【JLOI2014】聪明的燕姿(数论)

首先有个结论:如果一个数N可以分解为:,其中p为素数,c表示次数。那么N的所有正因数之和为:。对于此题用深搜,枚举p是无法避免的,且p可能为S-1,甚至无法打素数表。但我们可以枚举较小的素数,然后特判另一部分是否是一个质数,可以证明这样不会重复统计答案,因为即使S的分解一样,但分到N的因数上就不一样了。于是我们搜索,可以只枚举那些小于等于根号S的质数,直到能够整除当前值,然...

2018-09-03 09:42:08 249

原创 樱花(素数筛+整数唯一分解)

原题见洛谷。首先可以化成这样的形式:然后对于N!的质因子分解应该不是难事,可以很快得到每个质因子的次数。由于有个平方,右边的次数还要乘2。左边可以完全不管内容,只是把它当作两个数a,b相乘。于是a,b相乘后,每个质因子次数之和,分别等于N!每个质因子的次数乘2,直接扫一遍乘完就行。#include<cstdio>using namespace std;typede...

2018-09-02 22:10:57 184

原创 Prime Distance(素数筛)

原题见洛谷。首先一次预处理出根号R内的所有质数。虽然L,R很大但是它们相差不大,对于每个筛出来的质数,把[L,R]内所有能被它整除的数标记,然后剩下的数从L到R扫一遍就可以统计答案了。注意标记时的细节。#include<cstdio>#include<cmath>#include<iostream>#include<cstring>...

2018-09-02 14:35:10 201

原创 【HNOI2008】越狱(快速幂)

这题容易多想。其实就是一个简单且直观的想法。所有的情况:每个房间都有m种选择,所以n个房间就是m^n种情况。无人越狱的情况:相邻房间不同即可,第一个房间有m种选择,后面的由于不能与相邻的相同,只有m-1种选择,所以方案是m*(m-1)^(n-1)。只需用总方案减去不可行的方案即可。#include<cstdio>#include<cmath>#incl...

2018-09-01 20:25:29 112

原创 【USACO09NOV】灯Lights(DFS+二分)

这题N实在太小了,暴搜都可以得到很可观的分数,为了巩固搜索,就用DFS做了一下。BFS貌似也可做。在搜索前需要把每个点的异或值求出来,这样就不用建边枚举边了。首先每个灯最多被按一次;其次猜测需要按下的次数在10次以下。于是方案1:迭代加深搜索。#include<cstdio>#include<cstring>#include<iostream&gt...

2018-09-01 18:23:26 215

原创 【CEOI2004】锯木厂选址(斜率优化dp)

此题类似于ZJOI2007仓库建设。设f[i][j]表示前i个锯木厂解决完前j棵树时的最小运输费用。算上山脚的,总共有3处锯木厂。方便起见,把山脚处也算一棵树,重量为0,那么总共有N+1棵树。所以答案是f[3][N+1]。设sumw[i]表示前i棵(从山顶开始)树的重量之和,sumx[i]表示第i棵树距山顶树的距离。假设第1~k棵树已由1~i-1号锯木厂解决,那么现在第k+1~j棵树交给第i...

2018-09-01 11:44:47 191

原创 【APIO2010】特别行动队(斜率优化dp)

假设现在枚举到i,设前i个人的战斗力之和为sumx[i]。令第k+1~i个人分在一组,那么有:展开,移项,可以得到:此时可以发现2*a*sumx[i],由于sumx[i]递增,a<0,所以整个是小于零且单调递减的,同时f[i]又要取到最大值。画图可知我们需要维护一个上凸包,如图。#include<cstdio>#include<cstring>#i...

2018-09-01 09:48:48 105

原创 【ZJOI2007】仓库建设(斜率优化dp)

设f[i]表示前i个仓库的货物处理完所需的最小花费。假设第k+1~i个仓库的货物集中在一起,那么只能是都搬到i仓库。那么此时:用给的x转化一下:设sump[i]表示前i个仓库的p之和,可以得到:设,那么整个式子就变成了:移项,可以得到:由于x[i]满足大于0且单调递增,而f[i]要求最小值,所以这里只要单调队列维护一个下凸包即可。#include<...

2018-08-31 23:00:21 133

原创 【HNOI2008】玩具装箱(斜率优化dp)

设f[i]表示前i件玩具装好所花的最小花费。设sumc[i]表示前i件玩具的c之和。假如第k+1~i件玩具放在一起,那么间隔有i-k-1,所需的c为sumc[i]-sumc[k],所以花费为(sumc[i]+i-sumc[k]-k-1-L)^2。所以有状态转移方程:。现在来对这个方程简化:设a[i]=sumc[i]+i,b[i]=sumc[i]+i+L+1。那么方程可化简为:。展开,去...

2018-08-31 20:57:03 161

原创 Cats Transport(斜率优化dp)

原题见洛谷。设f[i][j]表示前i个cs官接走前j只猫,前j只猫等待的最少时间。设cat[i]表示刚好接到接第i只猫的出发时间,那么cat[i]等于t[i]减去h[i]之前所有路的长度。把猫按cat排序,设sumt[i]表示前i只猫的cat[i]的和。现在来分析状态转移方程。假如第i个cs官接走了第k+1~j只猫,那么f[i][j]=f[i-1][k]+(cat[j]-cat...

2018-08-31 17:21:25 302 1

原创 【IOI2002】任务安排2(斜率优化dp)

设sumt[i]表示前i个任务所用时间的和,sumc[i]表示前i个任务1单位时间所需的费用和。设f[i]表示前i个任务完成所需最短时间,这里直接给出状态转移方程:。将f[j]和sumc[j]当做变量分离出来,并且去掉min,可以得到: 。可以发现,如果一般的一次函数为y=kx+b,那么此处的“y”就是f[j],“x”就是sumc[j],“k”就是S+sumt[i],“b”则是...

2018-08-31 15:01:49 305

原创 【NOI2005】瑰丽华尔兹(单调队列优化dp)

首先设计状态方程。二维的(x,y)是不可避免了,但又不足以描述状态,所以设一个f[k][x][y]表示在前k个时间段内,终点为(x,y)格子的最长滑行距离。每个时间段,每个格子有两大类:一,最简单的,不动, 。二,要动,其实不麻烦,只是需要分开讨论,顺便注意边界和障碍物:1,d=1, 。 竖着向上滑。2,d=2,  。竖着向下滑。3,d=3,  。横着向左滑。4,d=4...

2018-08-30 15:13:16 131

原创 【SCOI2010】股票交易(单调队列优化dp)

首先给一个很nice的题解传送门:题解题解讲得很详细,我就大致总结一下。设f[i][j]表示第i天结束时剩j张股票,可以获得的最大收入。一:适用于每一天,直接买入:f[i][j] = -j*api 。0<=j<=asi。二:适用于每一天,不买不卖,由上一天得来: f[i][j] = max(f[i][j], f[i-1][j])。三:适用于i>w,买入: f[...

2018-08-30 10:38:54 130

原创 【HAOI2007】理想的正方形(单调队列)

首先预处理出pre_xmax[i][j],表示第i横行,第j~j+N-1竖列a[i][j]的最大值;预处理出pre_xmin,意义与前边相反。接着处理pre_max[i][j]表示第i横行,第j~j+N-1竖列pre_xmax[i][j]的最大值;预处理出pre_min,意义与前边相反。处理完后,pre_max[i][j]实际上是a[i~i+N-1][j~j+N-1]里的最大值,pre_m...

2018-08-29 23:11:45 93

原创 【POI2005】BAN-Bank Notes(单调队列优化多重背包)

这题如果不需要输出方案会简单一些,虽然我在洛谷上AC了但是我的输出方案并不一定正确,纯粹是数据的问题,希望AC的巨佬能贴出来让大家学习一下(网上实在没有洛谷这个版本的题解)而且这题的重点应该是多重背包的优化。一般的多重背包是这样的:void solve(){ memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=N;...

2018-08-29 17:43:01 457

原创 【SCOI2005】互不侵犯(状压dp)

一般状压dp的问题是求合理的方案,无数量限制。而此题加入了一个K,所以相应地设表示第i行摆k个状态为S的可行方案。此题又没有障碍物之类,所以只需求一次可行的状态, 只需判断相邻是否可攻击到即可。然后在上下行转移时,需要考虑到四个角也不能攻击到,上下行国王的左右间隔至少为1,但是靠左的国王可能在上一行也可能在下一行所以要分别判断。状态转移方程:  。其中S,T需要满足上述关系。#i...

2018-08-29 10:23:08 188

原创 【APIO2007】动物园(状态压缩dp)

首先这题的N和M都非常大,对它们状压是不可能的。因为每个位置只能看到5个,所以不妨对每个位置进行状压,每个位置用一个5位的二进制数表示这个位置所看到的5个格子[i,i+4]的安排方式。那么首先在输入时计算出每个位置每种状态能使多少人高兴,用cnt[i,S]记录。***注意输入的位置并不是在五个格子中间,不同于给的图,而是在五个格子的起点(巨坑...)。接下来推一下状态转移方程。为了方便...

2018-08-28 17:08:33 330

原创 【NOI2001】炮兵阵地(状态压缩dp)

调了小半个上午,终于A了这道毒瘤题。我感觉我眼睛快虾了。这题刁钻在于,每一个炮兵可以影响相邻的两行,所以这题不同于只影响一行的,光是一个f[i,S]已不能方便地表示出状态和转移状态(大佬除外),所以设一个表示当前为第i行,第i行的状态为S,上一行(即i-1行)的状态为T时,能放的最多炮兵数。分析可以得到状态转移方程:其中,T’表示第i-2行的放置状态,cnt(S)表示状态S下放的个...

2018-08-28 14:22:42 199

原创 【USACO06NOV】玉米田Corn Fields(状态压缩dp)

首先这题可以用状态压缩来表示一行的放置情况。为了节省空间和时间可以输入时直接把N和M减去一。设f[i][S]表示第i行放置情况为S时的方案数,那么最后答案就是f[N]可行状态的和。我们枚举每一行,每次做如下的事情:1,得到下一行的所有可行情况, 存入数组。2,以当前行的可行情况去更新下一行的可行情况。3,交换上下行, 下一行作为当前行重复此操作。4,第0行不做下一行,第N行...

2018-08-28 10:02:20 136

原创 【ZJOI2008】骑士(树形dp)

如果没有环,这题就是“没有上司的舞会”。这题还是看了题解的,主要在于可能有一个环。题解的大意是,找环,如果找到环就断开一条边,从边连接的两个节点分别做一次dp;没找到就直接对枚举到的点做一次dp。题解的具体做法是: 1,建无向边。2,1~N号节点扫一遍,每次遇到vis[i]=0做如下操作:  a,以i开始做一次dfs,遍历到的节点vis标为1;如果出现了环,flag=1,记录两个端...

2018-08-27 21:42:51 166

原创 跑步爱天天(欧拉序)

【问题描述】YOUSIKI 在 noip2016 的一道《天天爱跑步》的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰《跑步爱天天》。有一个以1为根的有根树,初始每个点都有个警卫,每个警卫会按深度优先的顺序周期性的巡逻以其初始点为根的子树(详见样例解释),一个时刻走且仅走一条边。YOUSIKI 初始在x点,他要到根结点拜访皮皮妖,他会沿着最短路径走,...

2018-08-27 15:23:36 21254

原创 【NOIP2017提高】宝藏(DFS+状态压缩)

这题让人怀念最初学暴搜时各种玄学剪枝的喜悦。一上来就写了个类似SPFA的BFS,结果一跑样例才发现完全错。接着想dp又没思路,一看数据先暴搜试一试。枚举起点,设dis[i]表示i到起点的距离,f[s]表示状态为s时的最优解,每次做一次dfs。这题居然也没有什么剪枝,就是按照状压常规思路写就过了,可能建边时用边集数组常数会小一点。具体可以看注释。#include<bits/std...

2018-08-26 21:04:24 410

原创 【国家集训队】跳跳棋(LCA+二分答案)

这是一道神题,不看题解永远我永远也不会和LCA扯上关系。不知道为什么会出现在“NOIP 500+”这样的书里...首先,对于递增的三个坐标(x,y,z),有三种走法:1,y向x方向跳,得到(2x-y,x,z)可以发现这是扩大了边界。2,y向z方向跳,得到(x,z,2z-y)可以发现这是扩大了边界。3,设d1=y-x, d2=z-y, 如果d1>d2,z可以跳到x,y中间,得到...

2018-08-26 15:40:16 711

原创 【AHOI2008】紧急集合 / 聚会(LCA)

首先给一个例子: 现在给出询问(2,5,11),答案是节点为2,步数为6。为何是2?设想,如果节点设在5,对于5,可以少走一步;但对于2和11都要多走一步,总体多走了1步。如果节点设在2与11之间,同理,11可以少走,但2和5各自会多走同样的步数,总体还是增加了。我们发现,2是4,5的LCA。再给出询问(8,9,11),答案是节点为2,步数为9。同理,设在2往上或者往下都会导致总步数增...

2018-08-26 09:43:19 340

原创 【AHOI2009】维护序列(线段树)

这题说多了不如看代码,总之,下传乘法时,要更新所有的信息,包括区间和sum、加法标记add、乘法标记time。而下传加法时只需更新区间和、加法标记。还有就是乘法标记下传后要设为1。#include<bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN=200005;int N,root=...

2018-08-25 23:11:02 126

原创 【NOIP2015提高组】运输计划(树链剖分)

这大概是我目前做过的最难的几道图论题之一了。这题除了树剖,还可以用LCA,树上差分,二分答案等方法来做。关键的树剖操作是看的这篇题解,讲得很详细:https://yu123123.blog.luogu.org/solution-p2680#概括一下题意:给你一棵树,和一些路径,现在叫你指定一条树边长为0,使得所有路径中最长的尽可能小。一,先大致确定这条为的边为0哪里。可以想见,所有边不...

2018-08-25 16:41:19 421

原创 【NOIP2013提高】货车运输(最优生成树+LCA)

转化一下问题,求点对间最长路径上最小边,根据最优生成树的性质,如果生成的是最大生成树那么只需树上寻找两点间最小边即可。由于此时的结构是一棵树,所以可以通过倍增的方法记录一段路径上的最小边权。#include<bits/stdc++.h>using namespace std;const int MAXN=10005;const int MAXM=50005;const i...

2018-08-24 10:31:26 88

原创 【JLOI2014】松鼠的新家(树链剖分)

基本就是树剖模板了。感觉树剖的省选题全是模板。对于输入的顺序,前后两个之间做一次区间加一。为了操作方便,每次都是把两个端点算上一起操作,只是这样端点处会多算几次,所以需要输入时统计端点出现了多少次,输出时减去即可,注意第一个和最后一个不用减。#include<bits/stdc++.h>using namespace std;const int MAXN=300005;...

2018-08-23 22:51:04 115

原创 【CQOI2007】涂色(区间dp)

设f[i][j]表示使区间[i~j]满足要求的最小需求。1,c[i]!=c[j],先把i~k解决好,再解决k+1~j,有f[i][j]=min{f[i][k]+f[k+1][j]},i<=k<=j-1。2,c[i]=c[j],此时如果i~j-1解决好了,j的位置总可以在解决i时顺便解决(想一想刷墙的过程,最外边的最先刷,然后在上边进行覆盖);同理,如果i+1~j解决好了,i的位...

2018-08-23 21:46:01 215

原创 【TJOI2007】调整队形(区间dp)

原题见洛谷。分析常规套路:设f[i][j]表示把区间[i~j]变得对称的最小步数。接下来分析状态转移方程。 一:c[i]=c[j]一步也不用,f[i][j]=f[i+1][j-1]。二:c[i]!=c[j]1,把左边的c[i]删掉,只需要[i+1~j]对称即可,方案为f[i+1][j]+1。2,把右边的c[i]删掉,只需要[i~j-1]对称即可,方案为f[i][...

2018-08-23 17:26:34 76

原创 【POI2008】BLO-Blockade(点双连通分量)

原题见洛谷。分析题意:给你一个连通无向图,问分别删去其中每个节点后有多少点对无法到达。首先求出点双连通分量,原图转化为一棵树,并且当一个点是割点时计算它的子树大小,否则没有子树。 1,删去一个点,首先它与N-1个其它点无法连接。2,删去一个点,如果它是割点,它的子树与它上方的所有节点无法互相到达。3,删去一个点,如果它是割点,那么删去后它的子树之间将无法互相到达。至...

2018-08-23 09:57:08 94

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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