自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 BZOJ1492: [NOI2007]货币兑换Cash

先%CDQ… 首先需要分析出一个性质,如果某天决定买入,那么一定花掉当前拥有的所有钱,如果某天决定卖出,那么一定卖掉拥有的所有股票。 于是对dp方程推一推倒一倒啊就是经典的斜率优化了… (其实几个月前做的题我现在懒得推了…>_<…为啥我还要写这篇博客?为啥平衡树维护凸包没人用set写呢!?) set:(边界判起来真麻烦…>_<…不过比手写平衡树要好不少…)#include<set>#inc

2016-04-30 17:06:30 898

原创 BZOJ2946: [Poi2000]公共串

为啥没人写hash或者sa?不明觉厉一脸懵逼………… 于是我也跟风写一发SAM吧…>_<… 把第一个串建SAM,后面的每个放到SAM里跑,匹配到对应的节点,就与当前长度取max(len[p]=max(len[p],tmp)),表示这个串在这个节点能匹配的最大长度,然后每个串取min,意味着取出来的是公共字串(ans[i]=min(ans[i],len[i])),最后所有ans取max,表示所有公

2016-04-30 16:51:46 3569

原创 BZOJ4071: [Apio2015]巴邻旁之桥

首先对于家和公司在同一侧的预处理掉,这样就只剩家和公司不在同一侧的情况了。 if(K==1)ans=∑abs(x-pos)+abs(y-pos);注意到与x,y是否在两侧无关,所以用经典的中位数处理思想sort一遍取中位数贪心即可。 else{ 一个人要走的距离是abs(x-pos)+abs(y-pos),让它最短话句话说就是让中点距pos尽可能近,于是我们将所有区间按中点排序,枚举从

2016-04-29 20:47:44 5439 1

原创 BZOJ4070: [Apio2015]雅加达的摩天楼

暴力建图大概谁都会吧(虽然我一开始建错了[捂脸熊]),所以还是说一下。 从每个起点枚举走的步数,连对应长度的边,跑dij即可(为什么那么多人自信spfa?) 这样最差情况下是n^2条边的…肯定跑不过所有的数据。 注意到当步长>sqrt(n)的时候,建出的边只有sqrt(n)条,所以步长>sqrt(n)的时候解决了,那么步长 < sqrt(n)呢? 也就是说每个点向外的步长 < sqrt(n)

2016-04-29 10:35:14 1392

原创 BZOJ3676: [Apio2014]回文串

比较重要的结论:一个字符串内本质不同的回文串的级别是 O(n)的,因为manacher的时候每次暴力扩展出来的回文串才是新的回文串,最多扩展O(n)次。 所以我们可以对所有本质不同的回文串在后缀数组/后缀自动机上求一下出现了多少次即可… 注意注意注意manacher不要写错…>_<… SA:#include<cmath>#include<cstdio>#include<cstring>

2016-04-28 20:56:55 922

原创 BZOJ3998: [TJOI2015]弦论

听说是后缀自动机裸题? 深度理解一下SAM就会发现,可重复的话,每个np的初始值是1然后自底向上拓扑排序一遍,就得到了每个节点代表的字串出现的次数。不可重复的话,每个节点的val是1即可。 对于tr[i].sum=∑tr[ tr[i].nxt[j] ].sum即可,sum数组搞出来就26分得了233…#include<cstdio>#include<cstring>#include<iost

2016-04-28 15:32:48 768 2

原创 BZOJ4069: [Apio2015]巴厘岛的雕塑

按位贪心,显然较大的位能是0就是0,然后就从高到低枚举每一位。dp判定这一位是否可以填0。 dp[i][j]表示长度为i,分了j段当前位是否可以是0,枚举k转移,如果(s[i]-s[k])这一段这一位是0 && (s[i]-s[j])这一段没有超过原来已经确定的答案的范围,就可以转移。复杂度n^3logn 注意到最后的数据n<=2000好像过不了?但是保证了A==1,那么就dp[i]表示当前位是

2016-04-27 21:56:11 905

原创 BZOJ1911: [Apio2010]特别行动队

斜率优化… 首先n^2的dp很好想… dp[i]=max{dp[j]+a*sqr(s[i]-s[j])+b*(s[i]-s[j])+c;}(0 <= j < i) 将所有只与j有关的项拎出来设为F(j)=dp[j]+sqr(s[j])-b*s[j]; 将所有只与i有关的项拎出来设为一个变量all=a*sqr(s[i])+b*s[i]+c; 对于any的j,k(k < j),若j优于k意味着

2016-04-26 19:59:08 537

原创 BZOJ1179: [Apio2009]Atm

显然的tarjan+拓扑排序dp…犯了个脑抽错死的真惨…#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>//by:MirrorGrayusing namespace std;const int N=1111111;int mo[N],v[N],in[N],vis[

2016-04-26 19:29:09 577

原创 BZOJ1178: [Apio2009]CONVENTION会议中心

题解戳这里: http://gaotianyu1350.gitcafe.io/2015/04/23/BZOJ1178-%E4%BC%9A%E8%AE%AE%E4%B8%AD%E5%BF%83/ 比较好的代码戳这里: http://blog.csdn.net/Fuxey/article/details/50708546 我基本是抄的…>_<…#include<set>#include<cst

2016-04-26 16:42:53 996

原创 BZOJ1143: [CTSC2008]祭祀river

显然要求最小反链长度,转化为最小链覆盖,我好像只会最小路径覆盖?那就floyd一遍好了…>_<…,你问我ctsc原题要输出方案?很抱歉我也不会…有哪位神犇会dilworth定理输出方案求教…#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>//by:MirrorGrayusing namespace

2016-04-26 11:16:11 732

原创 BZOJ2134: 单选错位

首先每一道题之间是没有关系的,只需要求出每道题的概率,求和即可。 考虑第i+1道题做对的概率,你的选择有a[i]种,能对的可能有a[i+1]种,于是总方案数是a[i]*a[i+1],对了的方案有1~min(a[i],a[i+1),所以p=1/(max(a[i],a[i+1),然后就水水啦。#include<cstdio>#include<cstring>#include<iostream>#

2016-04-26 10:02:30 1070

原创 BZOJ4542: [Hnoi2016]大数

省选2016系列…HNOI2016… 省选前挖坑系列… 需要注意p==2||p==5时没有逆元#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long//by:MirrorGrayusing namespace std;cons

2016-04-21 10:09:19 689

原创 BZOJ4318: OSU!

省选前挖坑系列… 公式推了好长…#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>//by:awqloverusing namespace std;const int N=211111;long double dp[N],f[N][3];int main(){ int n;scanf(

2016-04-20 20:33:41 658

原创 BZOJ4521: [Cqoi2016]手机号码

省选2016系列…CQOI d1t3 显然的数位dp,状态也比较好想,dp[i][j][k][a][b][c]表示前i位,是否已经小于原数,当前后两个数是j,k,是否出现4,8,是否已经出现连续的3个。(有点复杂…>_<…) 省选数据是厉害…有三个数据的l都是10000000000,因为我默认他的位数是11位,l-1一下就挂飞了…大家引以为鉴…#include<cstdio>#include<

2016-04-14 21:17:31 1027

原创 BZOJ4500: 矩阵

题意清晰明恋简单易懂。 首先考虑这是一张二分图,设x[i]表示第i行增加的权值,y[i]表示第i列增加的权值,那么就有下面的一些限制关系:x[i]+y[i]==c。 于是我们将行当做左部点,列当做右部点,随便找一个初始点的权值设为随便一个数,dfs一遍判断是否矛盾即可…#include<cstdio>#include<cstring>#include<iostream>#include<a

2016-04-13 23:27:32 1338 1

原创 BZOJ1009: [HNOI2008]GT考试

挖坑系列…#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>//by:MirrorGrayusing namespace std;const int N=22;char s[N];int mod,m,nxt[N],ret[N][N];int MOD(int x){ while(x>=mo

2016-04-12 23:53:51 830

原创 BZOJ4033: [HAOI2015]T1

树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选择了j个黑点的答案,但注意这个答案是整棵树的答案。 我们只需要对于每个儿子背包一遍,在最后更新一下dp[x][j]即可,具体可以看一眼程序。 非常重要的是,这个复杂度是n^2的,需要注意的是,如果我们要保证复杂度,for(int j=size[x];~j;j–)for(int k=size[ver[i]];~k;k–)必须要这么写

2016-04-11 17:49:38 792

原创 BZOJ1483: [HNOI2009]梦幻布丁

链表启发式合并… 启发式合并:选择size较小的暴力每个点拿出来重新插入到较大的数据结构里。 其实,set,map,平衡树,priority_queue,并查集等数据结构都可以启发式合并,假设我们把n个数据结构合并为一个,可以证明总复杂度是o(nlogn*插入复杂度的) 我们来证明一下复杂度吧…以set为例。 考虑size较小的set,它并到较大的set里以后,size至少变为了原来的二倍。

2016-04-11 16:33:03 1328

原创 BZOJ2395: [Balkan 2011]Timeismoney

乘积规划…神犇称其为隐式自适应凸包… 设每棵生成树为坐标系上的一个点,sigma(x[i])为横坐标,sigma(y[i])为纵坐标。则问题转化为求一个点,使得xy=k最小。 注意到这是一个反比例函数。所以显然的,有可能成为最优解的点集是一个凸包。 首先找到x最小的点A与y最小的点B,再找到离AB最远的点C,形成了一个三角形,这个三角形内部的点不可能成为最优答案(最优解的点集是一个凸包),所以

2016-04-11 10:56:57 989

原创 BZOJ2631: tree

裸的lct… 省选前练习模板系列…#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long//by:MirrorGrayusing namespace std;const int N=211111,mod=51061;struct LCT{int l,r,fa

2016-04-09 19:26:13 696

原创 BZOJ3439: Kpm的MC密码

一开始想后缀数组+主席树…仔细想想…既然完全是后缀,那么直接将所有串reverse,塞到trie即可,现在问题就是查询子树里关键点第k大,在trie树上dfs,按照dfs序建一颗主席树即可。 (当模板题水一发就好啦…)#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ls(tr) tr

2016-04-09 17:15:20 825

原创 BZOJ3232: 圈地游戏

膜拜下whx大爷…好神的做法… 首先比值类型的最大值一般要二分答案转判定。现在要你找到一个环使得C*mid-V<0。这十分类似spfa判负环… 所以我们考虑建图找负环,每个网格线的交点向周围四个方向建边,边权怎么办呢?将格子上的数在列方向做前缀和,a[i][j]表示第j列,前i行格子的权值和,b[i][j]是横向的格线上的费用,那么横向格线的边从左向右方向的权值是b[i][j]*mid+a[i]

2016-04-09 08:23:17 1142

原创 BZOJ3124: [Sdoi2013]直径

题意清晰明恋简单易懂… 误打误撞分析出来了一个性质:组成答案的边的集合一定是连续的一条链且没有分叉,根据这个性质我们可以设计一个算法。 先找出来随意一条树的直径,对于树的直径上的每个点求一条不经过这条直径的最长链。 大概是这个样子的,然后我们取最中间的一段输出即可。 (ps:数据特别特别特别水…怎么写都能过的样子?(雾))#include<queue>#include<cstdio>

2016-04-08 20:28:49 1071

原创 BZOJ3037: 创世纪

题目大意:给定一个有向图,每个点出度为1,让你将这些点分为两个集合x和y,使得对于每一个y集合内的点都存在一个x集合内的点指向它,并且使得y集合尽可能大。 原图给的是一些内向基环树,显然要求的是一个最小支配集@poj3659。内向的基环树我们不好处理,考虑将这颗树反向,变成了外向基环树,这样我们可以随便找到环上的一个点以及指向它的点(首先每个联通快一定有环,但其实没有环的话就是正常的树了),不妨设

2016-04-08 09:13:57 1006

原创 BZOJ4027: [HEOI2015]兔子与樱花

第一眼看上去200w的数据好像只能贪心了吧…怎么贪呢…>_<… 首先分析出来一条很显然的性质,如果我们定义一个点的权值d[x]=c[x]+son[x],那么删掉一个点会使得它的父亲的权值d[fa[x]]+=d[x]-1。 因为不管删除哪个点,对答案的贡献都是1,所以对于一个点如果删除它的儿子节点,显然应该让权值从小到大来删除。f[x]表示已经将以x为根的子树中的点贪心的删完之后x的权值,那么f[

2016-04-07 21:47:41 664

原创 BZOJ3237: [Ahoi2013]连通图

考虑cdq分治,solve(l,r)表示把询问区间为(l,r)的边全部删掉的状态,那么递归solve(l,mid)的时候,只需要用并查集将区间在(mid+1,r)且不在(l,mid)出现的部分并起来即可,solve(mid+1,r)时同理。 get到了一个新技能,并查集的恢复,用一个栈记录即可,具体过程简单手动模拟一下就好啦…#include<cstdio>#include<cstring>#

2016-04-07 19:49:46 790

原创 BZOJ4491: 我也不知道题目名字是什么

考虑将原数列差分,那么最长不下降字串意味着最长的大于等于0的字串,然后就是经典思路了。 线段树记录每个区间从最左端开始最长的连续的1是lm,从右端开始最长的连续的1是rm,以及这个区间总的最长连续的1是am,两个区间合并的时候,总的最长的连续的1有左儿子的am,右儿子的am以及左儿子的rm+右儿子的lm更新即可。 注意差分后,如果询问l==r要特判。 有一个小技巧,由于原题要求最长不下降或者最

2016-04-07 10:40:42 1202 1

原创 BZOJ2525: [Poi2011]Dynamite

刚看的时候看错题了…被调侃了一发,以为只能选择1个点… 考虑二分答案,我们只需要判定是否存在个点能够在mid范围内到达所有关键点。 最暴力的judge是从每个点bfs一遍看看mid范围能是否能覆盖到所有的点,这样我们得到了一个n^2logn的优秀算法… 之所以要二分是因为二分完了之后可以贪心嘛…所以考虑树形贪心。一个关键点要么被它的子树内的点管理,要么被它子树外的点管理,于是我们记录两个值,f

2016-04-07 00:08:25 1076

原创 BZOJ3163: [Heoi2013]Eden的新背包问题

感觉这个题已经变成经典题了… 考虑CDQ分治,solve(l,r)表示删掉[l,r]这段区间的物品后的背包数组,那么solve(l,mid)这个背包数组一定包含(mid+1,r)里的所有物品,所以只需将solve(l,r)这个背包更新后传入solve(l,mid)即可。 复杂度:T(n)=2T(n/2)+O(nM)≈O(nlognM) 为了保证复杂度,需要单调队列优化下多重背包…

2016-04-04 14:57:57 1855 2

空空如也

空空如也

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

TA关注的人

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