OI
文章平均质量分 77
njlcazl
这个作者很懒,什么都没留下…
展开
-
【SCOI2010】【三分法】传送带
很早就知道了这题可以三分,但当时我听到的说法是三分套三分,就退缩了- -。今天理解了一下某位神牛的代码,写的很巧妙,也挺好懂的。要注意需要判断三分出来的两个点是否重合,如果重合的话要选择左边一个点。代码:#include#include#includeusing namespace std;const double eps = 1e-12;struct Point{原创 2013-03-22 21:39:42 · 863 阅读 · 0 评论 -
【hust1024】【二分法】【最大流】dance party
首先二分一个答案,然后将男孩和女孩都拆为2个点,源点s向男孩1连一条容量为二分值的边,女孩2向汇点连一条容量为二分值的边,男孩1向男孩2连容量为k的边,男孩1向喜欢的女孩1连容量为1的边,男孩2向不喜欢的女孩2连一条容量为1的边,女孩2向女孩1连一条容量为k的边,若最大流 >= n * 二分值,说明可行。代码:#include#includeusing namespace std;原创 2013-04-22 11:46:05 · 687 阅读 · 0 评论 -
【hdu3046】【最小割】Pleasant sheep and big big wolf
很直观的最小割模型。建图方法:1连源点,2连汇点,容量为inf,格子之间连边,容量为1代码:#include#includeusing namespace std;const int dx[] = {-1,1,0,0};const int dy[] = {0,0,-1,1};const int inf = 0x3f3f3f3f;const int cns = 200 + 1原创 2013-04-22 11:41:10 · 548 阅读 · 0 评论 -
【poj2777】【线段树】Count Color
非常水的线段树了吧,注意到最多只有30种颜色,所以我们可以对线段树的每一个节点用一个数来表示这个节点有哪些颜色,最后直接用位运算统计。需要注意的地方:1、一开始所有的颜色都为12、有可能出现a > b的情况代码:#include#include#define lson l,m,rt << 1#define rson m + 1,r,rt << 1 | 1using na原创 2013-04-23 09:04:08 · 578 阅读 · 0 评论 -
【ZJOI2008】【树形动态规划】骑士
分析图的特点可以发现,该图是由n个点n条边构成,并且可以由多个连通块构成,每个连通块最多只有一个环。所以图上点的情况只有两种:在环上或不在环上对于不在环上的点可以直接使用树形动态规划求解。对于在环上的点,只需要分两种情况:选了第一个点,或者选了最后一个点,取一个最大值就行。动态规划状态:f[i][0],f[i][1]分别表示选了第i个点和不选第i个点的最大武力值。转移方原创 2013-04-14 16:39:31 · 721 阅读 · 0 评论 -
【JSOI2007】【后缀数组】字符加密
后缀数组的水题。将字符串再复制一份到末尾,剖环为链。然后求出sa,那么后缀在前pos个的后缀的末尾字符就是答案。代码:#include#includeusing namespace std;const int maxn = 200000 + 10;int wa[maxn],wb[maxn],ws[maxn],wv[maxn],sa[maxn],r[maxn],rank[ma原创 2013-04-14 10:56:11 · 500 阅读 · 0 评论 -
【poj3580】【splay】SuperMemo
做过维护数列那道题后这道题做起来好多了。主要说一下REVOLVE操作,要求把[l,r]这个区间的数向后循环t次,其实这个操作相当交换[l,r - t]与[r - x + 1,r]这两个区间,不过操作的时候注意要把t先对区间长度取模。其他的操作就比较简单,类似维护数列。代码:#include#include#define keyTree ch[ch[root][1]][0]原创 2013-04-24 08:56:10 · 620 阅读 · 0 评论 -
【SCOI2011】【数论】飞镖
很罕见的不好做的模拟题。情况很多,不容易考虑全面。可以先把问题简化,然后逐步加深,这样有利于思考问题。对这道题来说,可以先考虑不打红心的情况,再考虑打红心的情况。考虑打红心又分为打M,2M,3M,4M的情况,这样就不容易出错。做题一定要细心,考虑全面。代码:#include#includeusing namespace std;long long A1,B1,C1原创 2013-03-29 21:59:47 · 883 阅读 · 0 评论 -
【SDOI2009】【树状数组】HH的项链
题目大意:询问一个序列中区间[a,b]中不同的数有几个,无修改操作。比较容易想到的是使用线段树套平衡树来解决,但是这道题需要有合并的操作,时间复杂度很高,不能接受。我们可以考虑,当一个区间有若干个同色点时,我们只能算一个,所以我们需要找出一个具有代表性的点,于是我们可以想到找区间中某种颜色第一次出现的位置来代表。并且我们可以知道这样的点的共同特点为上一个该颜色的点在查询区间的左侧,这样问题原创 2013-04-04 10:39:13 · 1110 阅读 · 0 评论 -
【SCOI2012】【kruscal变形】滑雪与时间胶囊
看到这道题应该可以抽象出一个模型:在一个有向图上做最小生成树。关于这个问题,有个专业名词叫最小树形图,可以使用朱-刘算法解决,但复杂度为O(nm),对于本题来说无法接受。于是我们考虑无向图的最小生成树,为什么不能在有向图上做最小生成树呢?因为会出现不能覆盖到叶节点的情况,所以可以想到可以如果高度从高到低遍历的话,就可以求出最小树形图了。第一问可以使用tarjan或者bfs求出所有能访问到的原创 2013-03-28 11:18:35 · 733 阅读 · 0 评论 -
【APIO2009】【强连通分量】【DAG】抢掠计划
先将原图缩点,原图变为DAG,然后记忆化搜索找最大价值即可,水题。。。代码:#include#include#includeusing namespace std;const int maxn = 500000 + 10;struct pnode{ int pos; pnode *next; pnode(){} pnode(int pos,pnode *next):po原创 2013-04-10 21:36:31 · 772 阅读 · 0 评论 -
【HAOI2010】【强连通分量】【树形动态规划】软件安装
这道题是一道水题。。。由于软件的依赖关系可能是一个环,所以先将原图缩点。将缩点后的树转化为二叉树后f[i][j]表示以i为跟的子树分配j的空间得到的最大价值,l[i],r[i]表示i的左儿子和右儿子则f[i][j] = max(f[r[i]][j],f[l[i]][k] + f[r[i]][j - k - w[i]] + v[i])使用记忆化实现。代码:#include原创 2013-04-10 09:02:45 · 1132 阅读 · 0 评论 -
Graham-scan模板
先贴一个模板,方便以后复习。#include#include#include#includeusing namespace std;const int maxn = 1000;const double eps = 1e-12;typedef struct{ double x,y;}Point;Point PointSet[maxn],ch[maxn];int n,len原创 2013-03-23 15:00:32 · 591 阅读 · 0 评论 -
【hoj2713】【最小割】Matrix1
题意:一个n*m的网络,每个单元都有一块价值Cij的宝石,问最多能取多少价值的宝石且任意两块宝石不相邻。经典的最大点权独立集问题,一个很巧妙的转化,转化为最小点权覆盖。将网格黑白染色,从源点到每个黑点连一条边,从每个白点到汇点连一条边,容量均为宝石价值。每个黑色与周围四个白点连边,为inf,做一次最小割,即为最小点权覆盖,记为tmp,则ans = ∑Cij - tmp代码:原创 2013-03-24 22:00:14 · 713 阅读 · 0 评论 -
【hdu3473】【划分树】Mininum Sum
题目大意: 给出一个数字序列,每次询问[l,r],要求从[l,r]中找出一个x,最小化∑abs(x - xi),i ∈ [l,r]首先容易得到,题目要求的是找出一段区间中位数,输出∑x - xi,x为中位数去掉绝对值后,我们可以得到ans = x(leftnum - rightnum) + (rightsum -leftsum)leftnum和leftsum分别表示中位数左原创 2013-04-08 17:36:45 · 608 阅读 · 0 评论 -
【ZJOI2007】【斜率优化DP】仓库建设
看到题目,容易写出朴素的规划方程:f[i]表示在第i个点建设一个仓库,前i个货物点运送的最小总费用则f[i]= min(f[j] + w[j][i]) + c[i]其中w[i][j] = p[j+1][1] *(x[i] - x[j+1]) + p[j+2] *(x[i] - x[j+2]) + .... p[i] * (x[i] - x[i])但是n的范围非常大,所以需要优化方程原创 2013-04-04 21:27:54 · 971 阅读 · 0 评论 -
【NOI2005】【概率动态规划】聪聪和可可
这是一道求数学期望的题目,可以使用动态规划求解。首先聪聪要逐步向可可靠近,所以我们按照题目要求预处理出p[i][j]表示i -> j的最短路上与i相邻且标号最小的点,可以使用n次spfa来实现。聪聪下一步所在顶点为p[p[i][j]][j],可可下一步可能在相邻的顶点或者不动,用w[j][i]表示设计状态:f[i][j]表示聪聪在顶点i,可可在顶点j时聪聪抓住可可的平均步数转移原创 2013-04-09 12:35:24 · 747 阅读 · 0 评论 -
【APIO2010】【斜率优化DP】特别行动队
看到这道题会很容易想到是动态规划。然后朴素的方程也很容易写出:用f[i]表示将前i个士兵分组得到的最大战斗力,sum[i]表示前i个士兵战斗力总和f[i] = max{f[i], f[j]+ a * (sum[i] - sum[j]) ^ 2 + b * (sum[i] - sum[j]) + c}但是这样做是O(n^2)的,对于n的范围来数肯定超时。于是我们考虑f[i原创 2013-04-09 21:33:36 · 620 阅读 · 0 评论 -
【APIO2010】【树的直径】巡逻
当k = 1的时候,显然直接求出树的直径后减去路径上权值即可当k = 2的时候,我们可以先dfs出树的直径,然后将路径中的每一条路权值赋为-1,再求一次直径,把两次的直径长度减去,ans = ((n - 1) - len关于树的直径的求法,可以使用树的一个性质:树的直径的长度一定会是某个点的最长距离f[i]与次长距离g[i]之和。于是可以使用一次dfs求出次短路和最短路和的最大值即为原创 2013-04-09 21:40:43 · 834 阅读 · 0 评论 -
【spoj1693】【最小割】Coconuts
经典的“二式取其一式问题”。建模方法:每名守卫i作为一个点,若他投赞成票,连边(s,i,1),否则连边(i,t,1)如果i与j是朋友,则加边(i,j,1),(j,i,1) (容量表示的意义是违反的代价)然后求一次最小割即为答案。这道题我用邻接表无限TLE,改为邻接矩阵后就AC了,原因为插入的常数较大。所以在题目中要根据情况来考虑存储结构。代码:#include#include原创 2013-03-26 20:54:18 · 585 阅读 · 0 评论 -
【zoj2334】【左偏树】Monkey King
题目大意:N个猴子,打了M次架,每次打架的时候双方猴子都会派出自己一方战斗力最高的猴子,打完架后这两只猴子的战斗力都减半。同时,不打不相识嘛,两方猴子打完架后就互相认识变成同伙不会再打架。输出每次打架后通过这次冲突合并的那一伙猴子中战斗力最高的猴子的战斗力值,如果冲突双方在同一伙的话直接输出-1就好。可以使用并查集来维护两个猴子是否互相认识,并且找出它的根节点,同时也是战斗值最原创 2013-04-18 11:00:36 · 675 阅读 · 0 评论 -
【SCOI2007】【最大流】蜥蜴
非常直观的建图方法。对于有蜥蜴的格子,从源点向该点连一条容量为1的边,对于每个石柱拆点u,u'连边u-> u',容量为石柱高度对于任意两个可以到达的石柱u,v,连边u' -> v,容量为inf对于任意一个可以跳出边界的石柱,连边u' -> t,容量为inf做一次最大流即为最多能逃出的蜥蜴数量代码:#include#include#includeusing na原创 2013-04-26 16:58:31 · 757 阅读 · 0 评论 -
【SCOI2007】【最小费用最大流】修车
需要一定思考才能建出模型的费用流。设有n辆车,m个维修人员每辆车看作一个点u,连边s -> u,容量为1,费用为0然后将每个维修人员拆成n个点,连边u-> v,容量为1,费用为k * time[u][v](k表示拆分的n个点中的第k个点),实际意义为第v个维修人员在倒数第k个位置修第u辆车最后对于所有与维修人员相关的点,连边v -> t,容量为1,费用为0做一次原创 2013-04-26 17:13:48 · 579 阅读 · 0 评论 -
OI之路就此终结
每每看到别人博客中上一篇文章还是XXX题解或者XXOI Bless al,下一篇文章就成了XXX完挂,OI再见的时候,总是会唏嘘感叹一下现实的残酷,现在终于轮到自己来做了结了。OI给了我太多美好,唯独这一次给我留下了无奈。以前总是幻想着要成为怎样怎样强的大牛,到头来还是蒟蒻,还是在考场上什么都做不了。但我不后悔搞过OI,因为它给我平淡无奇的高中生涯抹上了鲜艳的一笔,它拓宽了我的世界,让原创 2013-05-25 22:56:42 · 1583 阅读 · 4 评论 -
【ZJOI2008】【link-cut tree】树的统计
这道题写了比较久。。。主要是手残比较多关键的一点是由于题目直接给出了树的每条边,所以建树要用dfs来建,我最开始使用access(x)然后pre[x] = y的方法要WA,不过我感觉这样做是对的。。。当然这种感觉上对的方法不但是错的,而且效率肯定不如dfs其他的就是动态树的基本操作了,没什么好说的。代码:#include#include#includeusing name原创 2013-04-15 20:19:06 · 515 阅读 · 0 评论 -
【hdu3081】【二分法】【最大流】【并查集】Marriage Match II
稍微综合一点的题目。建图方法:对每个女孩喜欢的男孩,连一条容量为1的边若两个女孩a,b是朋友,则对于a连了边的男孩,b也要连边,使用并查集维护然后二分出游戏进行的回合数p,s -> 每个女孩,容量为p;每个男孩 -> t,容量为p若最大流 =n * p说明p是可行的,这样就可以得出最多进行的回合数了。代码:#include#includeusing name原创 2013-05-13 10:21:37 · 587 阅读 · 0 评论 -
【poj3237】【link-cut tree】Tree
题目大意:给你一颗树,要求支持下列3个操作: 1.询问两点之间路径的边中边权最大的; 2.把两点之间的路径的边权全部取反; 3.修改某条边的边权。很明显的动态树模型,首先要把边权转化为点权,并且要在dfs的时候记录每条边的权值在哪个点里面。操作1和3是常规操作。对于操作2,我们对每个节点记录Max和Min,取反就等价于Max = -Min,M原创 2013-05-13 07:55:14 · 758 阅读 · 0 评论 -
【ZJOI2008】【DP】生日聚会
比较简单的DP,关键是设计好状态。使用f[i][j][p1][p2]表示前i个小孩中有j个男孩,且男孩比女孩多p1个,女孩比男孩多p2个的方案数根据当前状态累加之后的状态转移方程:f[i+1][j+1][p1+1][p2-1] =∑f[i][j][p1][p2],f[i+1][j][p1-1][p2+1] =∑f[i][j][p1][p2]由于根据当前状态累加之后的状态原创 2013-05-14 11:27:31 · 955 阅读 · 0 评论 -
【ZJOI2007】【悬线法】棋盘制作
最近学习悬线法,所以就找了这道题练练手。因为棋盘是01交错的,所以我们可以先处理一下棋盘,从而转化为求最大子矩形问题。第一问可以用DP也可以用悬线法,我DP写得比较熟所以用了DP。第二问直接用悬线法求出处理过的棋盘的最大子矩形即可代码:#include#includeusing namespace std;const int maxn = 2000 + 10;int原创 2013-02-15 01:05:35 · 760 阅读 · 0 评论 -
【SCOI2010】【单调队列优化DP】股票交易
很明显的DP,不过省选主要考察的就是DP优化了。朴素的做法如下:状态:用f[i][j]表示前i天中,最后1天收盘时手中还持有j股的股票所能得到的最大收益。转移方程:f[i][j] = max{f[i - 1][j],f[i - W - 1][j - k1] - ap[i] * k1,f[i - W - 1][j + k2] + bp[i] * k2}。其中,k1 以上算原创 2013-02-25 20:15:08 · 1503 阅读 · 1 评论 -
【hdu3487】【splay】Play with Chain
题目大意是一串链子,要求支持两项操作:1、从链子中切下a-b区间,然后整体插入到位置k的数的后面(注意这里的k是对于切下之后的位置k)。2、翻转a-b这个区间的数这道题是典型的splay题目。具体操作就是:先提取出a-b这一段区间,然后记录一下区间位置,并且清除,然后再提取出第k个数,插入即可。第二个操作则是使用lazy标记,不断交换左右子树,实现翻转。代码:#in原创 2013-03-04 21:53:51 · 348 阅读 · 0 评论 -
【hdu2243】【AC自动机】【矩阵乘法】考研路茫茫——单词情结
首先利用补集转化思想,将问题转化为求一个词根都不包含的单词有多少种。可以想到将所有的词根建为AC自动机,然后使用DP求解。由于长度范围很大,可以使用矩阵乘法加速。并且题目中要求的是“长度不超过L的”,所以要求sum= A ^ 1 + A ^ 2 + A ^ 3 + ...... + A ^L所有情况tot = 26 ^ 1 + 26 ^ 2 + 26 ^ 3 + ...原创 2013-05-11 16:55:56 · 812 阅读 · 0 评论 -
【SDOI2008】【link-cut tree】洞穴勘测
题目大意:维护一个森林中两点的连通性情况,有插入一条边和删除一条边两种操作。直接使用link-cut-tree维护森林的连通性即可。注意在找出一条路径后需要维护splay上的翻转标记。还有就是splay旋转的时候不能写把两种情况合在一句写,这样有可能引起死循环!这个Bug我找了很久。以后一定要注意,见注释的那句话。代码:#include#include#include原创 2013-04-14 10:37:50 · 552 阅读 · 0 评论 -
【hdu4010】【link-cut tree】Query on The Trees
题目大意:给出一棵树,有四种操作:1、连接两棵子树2、断开树上的一条边,使其成为两棵子树(Ps:必须以x为跟,断开y的子树)3、给x到y这个路径上的所有节点增加w的权值4、询问从x到y的路径上点权最大的值写这种代码量稍微长一点的我总是要手残。。。第2个操作Ps中的内容我最开始没注意到,调了很久都WA,最后去网上找到标程才发现。所以认真审题真的很重要,有人在考试中为了原创 2013-04-16 10:33:24 · 663 阅读 · 0 评论 -
【hdu3037】【Lucas定理】Saving Beans
经过推导答案为C(n + m,m)但是n和m的范围相当大,所以我们可以使用Lucas定理,它可以用来解决大组合数取模的问题。定理的内容:A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) mod原创 2013-04-27 16:32:06 · 664 阅读 · 0 评论 -
【SCOI2008】【数论】着色方案
看到这种方案数特别多的题目就想推公式。。。最朴素的可以想出15维的方程来递推,但其实C值不同的木板只有5种,而它们的本质都是相同的。这样我们可以设计一个6维的方程f[a][b][c][d][e][last]表示C值为1 ~5的油漆颜色总数,last表示上次选的油漆的C值方程的话就很直观了,使用记忆话搜索实现。代码:#include#includeusing namesp原创 2013-04-27 21:35:13 · 752 阅读 · 0 评论 -
【hdu3062】【2-sat】Party
2-sat的入门题吧,只需要按照题意建图就好。判定是否有解是2-sat的题型之一。#include#includeusing namespace std;const int maxn = 2000 + 10;const int maxm = maxn * maxn;struct Edge{ int pos; int next;}E[maxm];int head[ma原创 2013-05-01 17:02:42 · 553 阅读 · 0 评论 -
【SCOI2012】【二分法】【最大流】奇怪的游戏
这道题初看也许会感觉无法下手,由于每次操作都是相邻的两个,所以可以考虑将棋盘黑白染色,这样我们可以对黑色的格子和白色的格子单独考虑。设黑色格子个数为cnt1,总和为sum1,白色格子个数为cnt2,总和为sum2,最终所有格子都变成了x,则很容易写出下列的关系式: cnt1 * x - sum1 = cnt2 * x - sum2=> x * (cnt1 - c原创 2013-03-28 17:24:41 · 1080 阅读 · 0 评论 -
【BZOJ2653】【二分法】【主席树】middle
题目大意:给出长度为n的一个序列s,回答q个询问:s的左端点在[a,b],右端点在[c,d]的子序列中,最大的中位数,强制在线。将问题转化为判定性问题,先二分出一个数x,然后将区间内大于等于x的数标记为1,小于x的数标记为-1求区间和sum,如果sum>= 0说明中位数可以比当前数大,这样可以通过迭代求出最大的中位数。但是题目中限定了左端点和右端点,不难想到可以通过求最大子序列的方原创 2013-05-05 09:50:31 · 862 阅读 · 0 评论 -
【zoj2112】【线段树套平衡树】Dynamic Rankings
很早以前就想做的一道题。本来想用主席树做的,无奈zoj的开的空间太小,用主席树不优化空间的话会MLE。用树套树的话不算很麻烦,理解起来也很容易。建一颗线段树,然后对线段树的每个节点建立SBT。修改的时候递归对线段树的每个节点都删除平衡树中的那个值,再插入新值。由于平衡树只能求出数的排名,所以查询时二分一个数,查询排名,根据排名迭代出第k大的数。代码:#include#incl原创 2013-05-05 14:31:57 · 705 阅读 · 0 评论