自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TSOI_Vergil的博客

琴入目,往事沉浮,染红了双眼。 风已起,琴尘飞扬,迷离了前方。青丝乱,思绪流转,清晰了伊人。纤影如梦,美眸含情,笑靥醉人,素手轻舞。弦断梦醒, 浮尘落地。 琴依旧,曲已终,红消香断。倚花冢,人独醉。

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

原创 写在前面

最近刚刚开通了博客,本人水平有限,如果写的有错误欢迎大家指出,QQ:1104891238,欢迎大家有问题与我讨论

2016-08-15 19:08:52 301

原创 盒子与小球系列题解

盒子与小球,NOI网站题库的一系列题,可在NOI题库中提交。

2016-11-09 17:56:26 3628 1

原创 洛谷 2258

这道题我们一看数据范围第一感觉是状压DP,将每一列的选与不选看成是一个二进制数,但是这道题我们考虑如果知道了每一列选与不选,我们每一行的差值,现在问题就变成了在n列中选r行使其形成的矩阵值最小。我们可以考虑DP,F[i][j][k]表示在i这个状态,选了j行,最后一行选的是第k行,形成矩阵的最小值,转移模仿LIS的转移,我们可以预处理出合法的状态,然后再处理出在这个状态下任意两行相邻后的值,以及这

2016-11-08 21:45:27 441

原创 洛谷 2672

首先我们考虑x=n的情况,这个答案是唯一确定的,那么当x=n-1时,我们就需要删去一家用户,那么我们要保证删掉后减少的疲劳值最小,对于最后一家用户,如果删掉它的话,减少的疲劳值就是pl[i]+(s[i]-s[pre[i]])*2,对于其他用户减少的疲劳值就是pl[i],那么我们考虑x=k是否一定是从x=k+1的最优解删除一家用户得来,如果x=k的最优解不是由x=k+1的最优解删除得到,那么在x=k

2016-11-08 18:44:06 464

原创 NOIP 2014 飞扬的小鸟

一个DP题,我们考虑一个状态,F[i][j]表示到i这个横坐标,当前高度为j所需的最少点击次数。那么我们有F[i][j]的方程为F[i][j]=min{F[i-1][j+y[i]],F[i-1][j-k*x[i]]+k},这样做的复杂度是O(n*m*k)的,我们考虑优化,这个状态是不可能再优化的了,那我们考虑优化转移,我们发现其实k的枚举是有很多重复的,我们可以将转移方程改写为F[i][j]=mi

2016-11-07 17:47:26 488

原创 浅谈区间问题

区间问题:给你若干个区间,问最多有多少个不相交的区间。    这是一道经典问题,我们可以贪心求解,我们将区间按右端点升序排序,那么最左边的区间一定要选,因为它的右端点位置最靠左,如果我们不选它而选了一个别的,答案的数量没有增加,而且还占用了比之前靠右的一段地方,这样是不划算的,因此最左边的区间一定要选,那么我们再将与最左边区间冲突的区间全部删除,剩余的区间中我们还是要选右端点最靠左的,这样我们

2016-11-05 16:18:34 612

原创 NOIP 2011 Day1T3 Mayan游戏

这道题耗了我整整一个下午,被读入坑了,然后还被各种坑,首先不知道为什么在栈中使用memcpy会崩掉,然后数组越界......     这题就是一个搜索,考验代码能力和基本的模拟,一个非常有效的剪枝是我们对于向左移动,我们只搜左边没有方块的,因为如果它的左边有方块的话,它俩一定会在搜它左边的块的右边时交换过,剩下的就是模拟方块清除和方块下落的过程,对于方块清除操作,我们可以全部扫一遍,用一个标记

2016-11-03 19:09:19 459

原创 洛谷 1650

我们考虑其实齐王的出马顺序对最终的答案是没有影响的,因为我们确定的是田忌的马与齐王的马的最佳匹配,考虑到这一点后,我们不妨假设齐王出马是按速度值从大到小出,那么我们有2种选择,一种是用当前最快的马赢或打平,一种是用当前最慢的马输掉,留着更快的马赢得比赛。那假设我们将田忌的马也按照速度值从大到小排序,那我们选的马一定是当前速度最快的或者最慢的,这样我们可以设计一个DP,F[i][j]表示齐王出了i匹

2016-11-03 14:20:43 414

原创 NOIP[2013] 华容道

一道能够让人深刻理解“状态“含义的图论题目。首先一个很简单的做法就是暴力BFS,以空格子为起点进行BFS,需要记录的有2个量:空格子的位置和目标棋子的位置,我们考虑这样的复杂度,由于是BFS,每个节点只会被访问一次,不同的节点数有n*m*n*m个,再算上q组询问,复杂度为q*n*m*n*m。可以拿到60分。      其实我们有很多状态都是没有必要的,题目中的q组询问中的地图是不会改变的,于是

2016-11-03 10:17:07 288

原创 洛谷 2115

一道比较神奇的二分,感觉如果题目是要求平均值最小,我们都可以直接二分平均值,然后用01分数规划(大概是这个吧)来搞一搞,将最优性问题变成判定性问题,我们考虑假定我们二分的平均值为mid,我们将2--n-1中所有的产奶量减去k,我们取2--n-1中的最大子段和,令其为x,一定是选择这一段进行破坏,那么破坏完成后,我们看剩余部分的和,因为sum-mid*n-x即为剩余部分的和,如果大于0,则证明这样做

2016-10-31 21:03:00 398

原创 洛谷 1606

如果没有第二问,这道题我们可以很容易的用最短路解决,但是第二问很不好搞,它要我们统计方案数,对于最短路来说,统计不同最短路的条数还是很容易的,但是题目中要求的是摆放不同莲花的方案,我们考虑对于一条最短路,只要它经过的点不同,就被认为是不同的,那如果在不同的最短路中经过的是相同的水块,那其实还是1种方案,那怎么办呢,我们考虑能不能设计一种建图的方式使我们可以除起点和终点外不再经过水块。我们考虑做这个

2016-10-31 07:03:42 355

原创 洛谷 1710

这道题是一道图论题,题目的意思是每次删除一条边,询问当前有多少点与1号节点的最短路的值与未删边之前不同。首先我们一定是求出原图的最短路,由于我们可以默认边权是1,于是我们可以BFS,这样我们就能够得到一张“最短路图”,所谓最短路图就是说对于一条边(u,v),我们只走dis[v]=dis[u]+1的边,这样如果删除的边不是最短路图上的边,对其他点是没有任何影响的,那我们考虑如果删除最短路图上的边,只

2016-10-30 08:30:27 322

原创 洛谷 1199

一道神奇的博弈论的题,因为最后只是用默契值最大的两个武将去比,那么我们考虑如何能让我们得到比较大的值,我们考虑既然无法得到默契值最大的,那我们能否得到默契值第二大的呢,我们是一定能得到的,因为第一次我们可以选一个第二默契值最大的武将,那么电脑破坏了第一大的,然后我们就可以得到第二大的组合了,那么再考虑我们能否赢呢,在我们得到选完2个后,电脑也选完了两个,但是它选的默契值一定比我们选的小,那么我们下

2016-10-29 21:19:59 357

原创 洛谷 1417

这道题应该可以看出是背包问题,转移方程为f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+a[i]-j*b[i]),但是如果我们只是这样转移的话会出现问题,这道题与01背包的不同在于每个物品的价值与它放入的顺序有关,因为它的价值是a[i]-j*b[i],怎么办呢?我们考虑一下是否已经存在一种顺序使按照这种顺序装的话价值最大呢?类比与国王游戏那道题,我们考虑一下,假设当前1号

2016-10-29 19:47:23 325

原创 洛谷 2244

这道题有很巧妙的结论,但还是难以掩盖它是乱搞题的本质-----By APT      这道题看起来无从下手,因为关系很复杂,我先给出做法,再给出证明,首先我们将A赢B的关系表示成A-->B的有向边,我们找到出度最大的点,然后找到没有被它直接指向的点,然后这些点都是可能赢的点,我们将它们标记为能赢,然后放入队列,继续上述操作,最终就能得到答案。      证明:首先由于我们一开始的点

2016-10-29 08:21:14 419

原创 LICS

LICS,即最长上升公共子序列,我们都知道LIS和LCS的n2求法,那么将它们两个组合到一起又怎么样呢?首先我们设计状态,f[i][j]表示A考虑到i,B考虑到j,能得到的LICS的最长长度,那么对于a[i]!=b[j]的情况,有f[i][j]=f[i-1][j],这里我们规定是B与A匹配,也就是说当b[j]无法与a[i]相匹配时,我们就看看b[j]能不能和i以前的位置匹配,那对于a[i]=b[j

2016-10-29 07:35:08 749

原创 洛谷 1136

这道题的转化比较巧妙,我们知道每个字符都只有两种可能,即换与不换,那么我们知道j与j、z与z之间的交换是没有意义的,那么我们可以知道如果这个字符换了,那它一定是变成了与它之前不同的那个,于是我们可以设计状态f[i][j][k],表示前i个字符,j个‘j’变成了'z',k个‘z’变成‘j’,能得到的最多jz的数量,只有当j==k时我们可以更新答案,那么如何转移呢,我们可以将每个长度为i的串看成是一个

2016-10-28 21:08:08 328

原创 树形DP之王 balabalabala

题目:给你一棵树,要你求最大匹配和最大匹配的方案数。最大匹配就是选尽量多的边,使这些边的端点不重合。方案数要对1e9+7取模。n这道题大概是我见过的树形DP中最难的,我称之为树P之王,首先,对于最大匹配,我们可以将边上放到点,即dp[i][0]表示不选i下面所连的边,dp[i][1]表示选i下面的边,那么我们可以知道dp[i][0]=西格玛max(dp[son[i]][1],dp[son[i]

2016-10-27 21:51:12 298

原创 UVA 10917

这道题的意思是,起点是1,终点是2,从1走到2,对于一条边(a,b),只有当存在一条从b出发的到2的路径长小于任何从a出发的路径长,我们才能走,问走到2的方案数。首先我们考虑,如果存在一条b出发的路径,那一定是b到2的最短路,而从a出发到2的路径的最小值也是a到2的最短路,那么我们可以以2为起点做一遍最短路,然后我们枚举边,如果对于一条边(u,v),dis[u]>dis[v],我们就在新图中加入u

2016-10-27 07:04:58 254

原创 UVA 11396

这道题看的我一头雾水,看了题解以后理解了半天,我们考虑对于每个点来说,要么它是中心节点,要么它是边缘节点,它不可能既是一个中心节点又是一个边缘节点,因为每个点的度数均为3,如果它是边缘节点,那它已经有一条边连向了中心节点,只剩两条边,不可能再作为中心节点,那多余的边怎么办呢?只能留给其他的中心节点去连,这样的话我们发现每一条边都是连接了中心节点和边缘节点,那如果能爪分解那它一定是二分图,由于题目保

2016-10-26 21:36:02 1031

原创 关于动态规划的一些经验与总结

动态规划是一个考验技巧性的算法,对于动态规划算法,浅谈几点经验。    首先是设计状态,我们肯定是要有一个一维或多维的状态的,那么如何设计它们的意义呢,首先我们可以分析出题目中的一些重要的量,比如当前时间,选了几个,考虑到了哪里,对于这些状态我们是要以一个值来表示这些状态的最优情况,比如f[i][j][k]..=P,i,j,k表示状态,P表示那个值,我们i,j,k,P都是这些重要的量,我们应该

2016-10-26 15:09:37 390

原创 洛谷 1503

这道题我们抽象成基本模型,问题就是给你一个开始全是1的序列,然后有2个操作,1是将一个位置的值 xor 1,2是询问x这个位置最左边的连续1的位置和最右边连续1的位置。我们可以怎么做呢?感觉一般的数据结构不太好弄,即使可以也要套一个二分什么的,那么我们可以考虑分块来做,我们将其分成根号n块,对于每一块,我们维护一个flag[i],flag[i]=1表示第i块全部是1,否则表示存在0,那么对于一次修

2016-10-26 07:32:18 205

原创 洛谷 1072

这道题我们需要自己来推算,首先,我们有gcd(x,b0)*b1=x*b0,将b0除过去,有gcd(x,b0)*(b1/b0)=x,令t=b1/b0,则有gcd(x,b0)*t=x,那么我们可以发现x一定是能表示成kt的形式,那么再整理一下有gcd(kt,b0)*t=kt,消去t,有gcd(kt,b0)=k,同时除以k,有gcd(t,b0/k)=1。再看令一个式子,gcd(x,a0)=a1,我们同时

2016-10-25 22:54:37 379

原创 洛谷 1041

这道题居然是一道搜索题....不过这道搜索题做的也是值得反思,没有从题目的本质入手,一开始打了一个搜索,后来发现更新答案时很不好弄,因为不知道到底什么时候是传染病结束,那么怎么办呢?我参考了题解发现题解是按照一开始全部被传染,然后一点一点减的,这样我们可以每次更新ans,最优的一定会被我们更新。由于每一层只能有一个儿子被切断,我们枚举那个点,然后搜索就好了。#include#include

2016-10-25 19:48:31 351

原创 洛谷 1073

这题开始我想复杂了,用Tarjan缩点然后在DAG上乱搞,后来冷静分析,题目中要我们求的其实就是1--n的路径中能得到的最大差价,令maxx[i]表示在1--n的路径中,i及i后面的点中水晶球价格的最大值,minn[i]表示在1--n的路径中,i及i前面的点中水晶球价格的最小值,这两个量是容易O(n)去维护的,但是问题是如何知道这个点在不在1--n的路径中。我们可以利用反图的思想,先以1为起点在正

2016-10-25 17:54:37 348

原创 关于斐波那契数列的性质及其应用

斐波那契数列是一个递推式很简单的数列,f[i]=f[i-1]+f[i-2],f[0]=0,f[1]=1,但是经常在OI中考到,这里简述它的一些性质。    1:通项公式,自己百度,由这个通项公式我们有一个结论,即分母不超过n的最接近黄金分割比的分数的分子和分母是斐波那契数列相邻两项。    2:在模意义下,斐波那契数列会出现循环,对于循环我们可以打表找出来。    3:对于斐波那契数列

2016-10-25 14:27:07 2936

原创 洛谷 1052

离散化+DP,还是第一次做这种题,这题的DP不难想,令F[i]表示到达i点最少踩的石子数,则F[i]=min(F[j]),i-s#include#include#includeusing namespace std;#define maxn 1005int f[maxn*maxn],n;int s,t,m,d[maxn];int flag[maxn],ans=1005;bool

2016-10-24 19:13:24 451

原创 洛谷 1063

经典环型DP题,对于这种环形DP,我们可以断环为链,即将环复制一遍放在尾部,我们设计状态F[i][j]表示合并了i--j的珠子获得的最大能量,则有F[i][j]=max(F[i][k]+F[k+1][j]+合并的能量),我们考虑转移的顺序,转移的顺序必须能够保证我在做当前转移时,我所需要的量全部都已知,因此我们不能按照左端点递增的顺序转移,因为按照这种顺序转移需要的状态还未完全已知,会丢失最优解,

2016-10-24 10:15:44 359 1

原创 洛谷 1415

这道题比较神奇,第一次做到这样的DP题,我们令dp[i]表示序列1--i中满足序列递增且使最后一个数最小,最后一个数的起始位置,这样的话转移方程为dp[i]=max(j),其中dp[j-1]--j-1这段区间的值小于j--i这段区间的值,有了这个以后我们可以知道最后一个数是什么(暂时不考虑前导0),那么我们可以再用同样的方法,令f[i]表示i--dp[n]-1这段区间里满足序列递增且使第一个数最大

2016-10-23 17:09:43 255

原创 洛谷 2331

这道题还是一道很不错的DP题,我们考虑当m=1时,是不是相当与一个序列操作,我们可以设计一个状态f[i][j],表示考虑到第i行,选了j个矩形的最大值,那么我们考虑转移,当前行只有2种转移的方式,一种是什么也不做,即不选这个格子,还有一种是让这个格子和上面的格子形成一个矩形。那么对于m=2的情况,我们可以再加1维,f[i][j][k]表示第1列考虑到i,第2列考虑到j,选了k个矩形的最大值,那么这

2016-10-23 11:36:58 274

原创 洛谷 1514

这道题我们可以考虑一下,如果我们可以把每个湖能到达的沙漠的区间[l,r]求出,我们是不是可以用贪心来求最小区间覆盖即是答案?那么我们可以怎么求呢?最直观的想法是对每个湖边的点做一遍Dfs,这个复杂度是N立方的,会被卡掉,那么我们如何优化?我们只求满足h[1][i]>=h[1][i-1]且h[1][i]>=h[1][i+1]的L[i]和R[i],因为如果当前点不满足这两个条件的任何一个,我们都可以证

2016-10-23 10:31:46 260

原创 洛谷 1092

经典搜索题,开始的思路是从右向左推,如果发现有字母没有赋值,就给他赋值,如果发现不满足条件就回溯,这样就有80分了,后来将赋值顺序由0--n-1改成了n-1--0,这样就有90分,因为小的数字比较灵活,容易进到更深层,而大的数字发生回溯的概率更高,然后看了别人的题解有发现了一个剪枝,将当前处理的列左边的那些列扫一遍,如果发现有3个数全确定的判断是否合法,如果不合法就回溯,这样就变成了满分。#i

2016-10-23 08:45:22 411

原创 洛谷 1265

这道题比较麻烦的一点是有条件2的限制,不过,我们可以证明条件2是不可能发生的,假设A要修AC,C要修BC,B要修AB,那么我们通过它们的距离关系推出矛盾。没有了条件2的限制,我们还要有条件3,我们考虑如果我们直接用最小生成树的话是否可以,假设我们当前已经组成了K个连通块,那么在连接任意两个连通块时,选择的边一定是连通这两个连通块的最小边,因此我们可以直接用prim。#include#incl

2016-10-22 18:00:08 332

原创 WIKIOI 1001

这道题可以看做是最小生成树的题吧,我们考虑题目要我们找一条路径使得路径上的最大V与最小V比值最小,那么我们考虑如果确定了一个量,问题会变得容易一些,我们可以用并查集来维护路径起点和终点的连通性,首先将边排序,然后对于一个确定的最大V,我们用并查集判断最小的V最大是多少,然后更新答案即可。#include#include#includeusing namespace std;#defin

2016-10-22 10:34:18 510

原创 洛谷 1814

1.我们可以用一个简单的dp算出用i个节点组成二叉树的方案数,令f[i]表示用i个节点组成二叉树的方案数,则f[i]=Σ(f[j]*f[i-1-j]), 因为我们考虑选1个点为根,枚举左子树的节点数,然后根据乘法原理计算。2.我们可以设计一个递归函数打印答案,不难想到具体的框架是【打印左子树-->打印X-->打印右子树】,然后这样递归做下去,令get_tree(m,s)表示打印用m个节点,组成

2016-10-22 09:11:50 218

原创 洛谷 1242

汉诺塔,经典的递归问题,我们考虑每个盘子的初态和末态,对于一个盘子的移动限制就是大的不能放在小的上,那么我们肯定是先选择移动大的,那么如何移动?假设我们将一个大的从A移动到C,那么我们一定是把A上的小的和C上的小的移动到B,否则无法移动,这样我们就找到了一种移动方法,从大到小移动,这样移动一定是最少的,因为每一步的移动都是必要的,缺失一步移动大盘子都无法移动。#include#include

2016-10-22 07:22:37 285

原创 洛谷 1651

这道题是一道考验如何记录状态的DP题,我们令f[i][j]表示考虑了前i个积木,两座塔的差值为j的那个低一些的塔的最高高度,对于每一块积木,我们都有三种选法,即放入第一个塔,放入第二个塔,不使用,这样状态的转移就很显然了,至于为什么是f[i][j]是表示最高高度,我们考虑如果在1到i中存在多种方法时两塔的差值为j,那么我们一定是选择低塔最高的,因为题目要求要最高的高度相等的两塔,如果在后面能够将这

2016-10-21 14:34:40 298

原创 洛谷 2458

浓浓的树P气息,令dp[i][0/1/2],0表示i点有人,1表示i点无人但存在一个i的儿子有人,2表示i和i的儿子都没人,但对于所有i的儿子,都存在一个它的儿子有人,那么我们可以得出转移方程,dp[i][0]=max{dp[son[i]][0],dp[son[i]][1],dp[son[i]][2]}+cost[i],dp[i][1]=min{dp[son[i]][1]}+sum{min(dp[

2016-10-21 11:37:19 328

原创 洛谷 1986

这道题一开始想的就是差分约束,后来由于考虑不当导致WA,我们考虑其实题目给的是m个不等式,即sum[b[i]]-sum[a[i]-1]>=c[i],而我却忽略了剩下的两个重要的不等式,即sum[i]>=su#include#include#includeusing namespace std;#define maxn 100005int n,m,l;int last[maxn],p

2016-10-20 20:11:42 248

原创 洛谷 1016

这道题可以贪心解决,我们的贪心策略是:首先判断是否能到达下一个比当前加油站便宜的加油站,如果可以,那么我们把油量加到刚刚能到那个加油站,如果不行,我们把油加满,然后到下一个加油站重复上述操作。下面证明它的正确性,对于能到一个比它便宜的加油站,我们一定是加油到正好能到那里,因为只要多一点就是浪费,因为我们可以把多的那部分在更便宜的加油站加上,如果我们不能到一个更便宜的加油站,那么我们一定是加满,因为

2016-10-20 07:38:48 328

空空如也

空空如也

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

TA关注的人

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