自定义博客皮肤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

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

原创 bzoj2330 糖果 差分约束

简单的查分约束系统。a-b>=c转化为b->a连一条长度为c的边,跑最长路,这样可以保证满足不等号。a=b转化为a>=b且b>=a即可。spfa判正权回路即可。       P·S:一个m打成n查了半天。。汗(⊙﹏⊙)b。AC代码如下:#include#include#include#define ll long long#define N 400005using names

2015-11-28 22:35:42 972

原创 bzoj2565 最长双回文串 manacher

manacher+O(N)扫描。    简单说一下manacher吧,就是O(N)时间求出以每一个点为中心的回文串的长度,hdu上有一道裸题,绝对适合入门。    整体思路和kmp很像,都是通过之前的值推之后的值以保证O(N)的复杂度。    首先在每个字符之间插入'#'(或者其他不会出现的字符),第一个字符前和最后一个字符后都要插入。这样就避免了长度为偶数的回文串难以操作的问题。先在

2015-11-28 11:43:46 807

原创 bzoj2152 聪聪可可 点分治

点分治求路径长度为3的倍数的链的条数,结果用分数表示。    这道题明显是树形dp简单,然而还是写了点分治(练习所用没办法啊)。AC代码如下:#include#include#include#define N 50005using namespace std; int n,m,tot,sum,rt,ans,t[3],fst[N],pnt[N],len[N],nx

2015-11-28 11:42:57 818

原创 poj1741 Tree 点分治

第一次写点分治啊,果然还是黄学长的代码框架好。。。    这绝对是点分治的最经典的题目了。大概写一下自己的理解吧。    首先,对于一棵树,求出其重心并作为根节点。然后链就可以分为两类:经过根节点的和不经过根节点的。对于不经过根节点的,在子树中递归调用即可。由于每次根节点都取树的重心,所以递归一次点的个数至少除以2,递归层数不超过logN层。另一方面,每一层都可以大致看成有O(N)级别个点

2015-11-28 11:37:32 775

原创 后缀自动机 初学

首先膜拜clj的ppt,记录几个要点关于Right集合:    1.定义:一个子串str在母串S中所有出现位置的右端点。如子串str在S中出现位置为[l1,r1),[l2,r2),...,[ln,r3),则str的Right集合为{r1..rn}。会有一些子串的Right集合相同,其中最长的len为MAX(s),最短的为MIN(s)    2.性质1:给定Right(s)和len就可得

2015-11-28 11:35:44 4020

原创 bzoj2049 洞穴勘测 lct

好久不更了。但是学新算法,就算做作业时间再紧张,也要记一下。    初学lct。几个要点提一下      1.同一个联通块是同一棵。不是一个splay或者一条链;      2.根节点有很多。刚开始打还想着用变量rt我是傻了吗;      3.那个access还算好理解。关键是代码里面那个rever是把x变为x所在树(不是splay)的根节点,理解了好久;    差不多就这么多

2015-11-28 11:35:00 509

原创 bzoj1197 花仙子的魔法 动态规划

看了题解才明白,动态规划的转移方程不是像我这样弱的人就能够想出来的!  首先解释一下题意,其实就是求若干个n维球体最多能把n维空间分为多少部分。  首先附上动态规划转移方程f[i][j]=f[i][j-1]+f[i-1][j-1],下面做个解释:首先f[i][j]表示在i维空间中已经有j个i维球体最多能分成多少部分。那么在已经有j-1个i维球体后,再加入一个,那么最多和原来的每个都相交一次

2015-11-28 11:32:16 959

原创 bzoj1218 激光炸弹 二维前缀和

直接暴力做前缀和,再暴力枚举右下节点即可,注意常数。下附AC代码:#include #include #include #include using namespace std;int a[5010][5010]={0};int main(){ int n,r; scanf("%d%d",&n,&r); int i,j,ans=0; for (i=1; i<=n; i

2015-11-28 11:22:00 2507

原创 bzoj1196 公路修建 二分+最大生成树

“花费最多的一条公路的花费尽可能的少”一句话是二分的标志。我们二分花费最多的公路的花费x,然后对于每一条路:如果修建一级公路的费用不大于x,那么就连一条权值为1的边;如果修建二级公路的费用不大于x,就连一条权值为0的边;如果都不能修,就不连边。由于题目中要求所有城市连在一起,而且一级公路要尽可能多,所以我们就跑一遍最大生成树。跑完后,如果发现连不起来或者一级公路的条数小于k,就说明不可行;反之说明

2015-11-28 11:20:41 635

原创 bzoj1143 祭祀 最大匹配

根据题意,如果有两个点A和B,A能到达B或者B能到达A,那么两者就只能选一个。因此,首先做一遍Floyd得到任意两个点对之间能否到达,然后连边。由于最大独立子集=n-最大匹配数,所以跑一遍最大匹配就可以了。P·S:由于bz上只有第一问的数据,所以这道题就先到此为止了。下附AC代码:var point,next:array[0..100000] of longint; a:arr

2015-11-28 11:16:10 841 2

原创 la4255 Guess 差分约束

这道题目我的做法是差分约束,具体地,设s[i]表示1..i的一个前缀和,那么对于输入的a[x][y],    如果a[x][y]='+',说明s[y]比s[x-1]要大,s[y]>s[x-1] s[y]-s[x-1]>=1,所以从x-1到y连一条长度为1的边    如果a[x][y]='-',说明s[y]比s[x-1]要大,s[y]=1,所以从y到x-1连一条长度为1的边    如果a

2015-11-28 11:13:40 809

原创 bzoj3208 花神的秒题计划 记忆化搜索&暴力

C操作,直接修改高度S,B操作,开一个bool数组记录能否滑行,暴力维护Q操作,直接记忆化搜索由于S,B,Q的总数下附AC代码:#include #include #include using namespace std; int ans,dp[1000][1000],a[1000][1000],f[1000][1000],dx[5],dy[5];char

2015-11-28 11:08:24 631

原创 bzoj1912 巡逻 树的直径

当k=1时,显然只要求出树的直径(最长链)的长度l,答案即为2*(n-1)-l+1,也就是在最长链的两个端点处建立一条新的路。    当k=2时,如果直接dp,可能会有重复的部分,因此首先,我们将最长链经过的边权值都赋成-1,再进行dp。这样,如果我们选择的两条链中有一条是最长链,重复的部分就不会重复计算。如果都不是,那么我们可以证明重复的那一段一定是最长链中的一部分。简单的证明如下:

2015-11-28 11:03:39 944

原创 bzoj1257 余数之和sum 数论

这道题目如果用暴力是过不了的,所以必须要优化。    对于k mod i,我们将其转换为k-i*[k/i]([a]表示不大于a的最大整数),那么:ans=Σ(i=1,n) (k mod i)=Σ(i=1,n) (k-i*[k/i])=n*k-Σ(i=1,n) (i*[k/i])     我们发现,对于许多i(尤其是当i很大时),[k/i]的值都是相等的,事实上,如果设[k/i]=m,满

2015-11-28 11:02:51 1137

原创 bzoj1854 游戏 最大匹配/并查集

这道题目我第一眼看到认为是最大匹配。即如果用Ai,Bi表示标号为i的两个属性,那么,左边的点为1..10000(最大属性值),又边的点为1..n。对于每个i,从i到Ai,Bi个连一条边,然后从左边依次做最大匹配,直到第一次匹配不成功为止,输出匹配数。    但是看了数据范围N=1..1000000,那岂不是要有2000000条边!最大匹配的算法是O(MN)的(M为边数,N为点数),没有不超时的

2015-11-28 11:00:37 1085

原创 bzoj1055 玩具取名 记忆化搜索

这道题目可以用动态规划解决,为了方便起见用了记忆化搜索。在代码中,我把所有的字符全都转换成了数字便于后面的操作。不知道哪里写逗了结果跑得这么慢。。    程序中用f[u][v][k]表示u..v这一段能否用编号为k的字母表示。-1表示尚未计算,0表示不行,1表示可以。具体的转移方程见代码。下附AC代码:const n=4; ans:array[1..4] of char=('W

2015-11-28 10:58:43 689

原创 NOIP2015·期中考 写心与回顾

写在前面:    此时距离noip提高组结束已经一周了。本来打算考完那天晚上就写的。结果那天网络出了点问题上不了博客o(╯□╰)o。好了现在期中考也考完了。算了两个一起写吧。只是随笔,语言逻辑也许会不太正常。算了,反正是写给自己看的唉。    雨点杂乱地打在旁边的窗户上,一条条毫无规律的雨痕无精打采地交错着。恰如我此时的心境,灰暗紊乱,可是却又不能算跌入谷底。我无力地靠在椅子上,涣

2015-11-27 21:22:19 1811

原创 bzoj2761 不重复数字 快排/哈希去重

本题较为简单。算法很多,下面给出两种算法。一、hash。注意负数。我的程序中没有用链表,可能会被极少一部分数据卡,但是只要rp不要太差AC还是较妥的。代码:const mo=211003;var h:array[0..mo,0..30] of longint; p:array[0..mo] of longint; i,t,x,n,kk:longint;functio

2015-11-27 21:17:49 1014

原创 bzoj1053 反素数ant 搜索

首先,说明一个知识点:    设N=a1^p1*a2^p2*...*an^pn(ai为质数),则N的约束个数为(p1+1)*(p2+1)*...*(pn+1)    简单证明:利用乘法原理,对于每一个ai^pi,我们有:1,ai,ai^2,...,ai^pi共(pi+1)种方案。因此总的方案数共有(p1+1)*(p2+1)*...*(pn+1)种方案。    例如12=2^2*2,约数

2015-11-27 21:14:32 704 3

原创 bzoj1044 木棍分割 二分+贪心&dp优化

对于第一问:    直接二分+贪心即可。贪心策略:能加进来的加进来,否则就从当前一根起重新再砍一截。对于第二问:    (1)简单dp。设f[j][i]表示到第i个点,截取j个木棍且满足要求的方案数。同时,用sum[i]表示到i为止的木棍做长度,则    f[j][i]={f[j-1][k]}(0   (2)空间优化。由于n    (3)时间优化。根据(1)的转

2015-11-27 21:11:07 871

原创 bzoj1048 分割矩阵 记忆化搜索

这道题目由于范围比较小,可以用f[a][b][c][d][k]表示左上角为(a,b),右下角为(c,d),要分为k个矩形的方差总和。由于直接状态转移比较复杂,可以用记忆化搜索的形式,简洁明了。    为了简便运算,顺便用一下二维前缀和。注意边界问题。下附AC代码:#include #include #include using namespace std; doubl

2015-11-27 18:04:45 1071

空空如也

空空如也

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

TA关注的人

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