BZOJ
文章平均质量分 61
Tag_king
这个作者很懒,什么都没留下…
展开
-
[BZOJ1191]HNOI2006 Hero |二分图匹配
看完题就会做。。裸的二分图匹配。。直接上匈牙利。。将问题向锦囊连边。。还有并查集做法。匈牙利:#include#include#includeusing namespace std;int i,j,n,m,to[1005][5],pre[1005],u[1005];bool find(int x){ for (int i=1;i<=2;i++) if (!u[to[x]原创 2015-04-18 09:47:50 · 655 阅读 · 0 评论 -
[BZOJ1412]ZJOI2009狼和羊的故事|最小割
源向羊连边,汇向狼连边,羊向狼和空地连边,狼向空地和羊连边,空地向狼、羊和空地连边,答案就是最小割(最大流)。。#include#include#include#define N 105#define inf 9999999using namespace std;struct edge{ int e,f,next;}ed[10*N*N];int n,m,i,j,nd,x,ne原创 2015-04-18 10:04:36 · 372 阅读 · 0 评论 -
[BZOJ1798]AHOI2009 维护序列|线段树|splay
水题,线段树就可以搞定,我又去写splay作死了。。注意的是这里的模数比较大,要开long long,另外要注意标记下放的优先,在打乘法标记的时候加法标记也要乘,要先下放乘法标记。。#include#include#include#define ll long long#define maxn 100005using namespace std;int i,n,m,nd=0,roo原创 2015-04-18 10:51:52 · 588 阅读 · 0 评论 -
[BZOJ1911]APIO2010特别行动队|斜率优化DP
DP比较显然,直接上斜率优化就好了。。斜率优化笔记#include#include#include#include#include#define ll long long#define q1 que[head]#define q2 que[head+1]#define t1 que[tail]#define t2 que[tail-1]#define maxn 1000原创 2015-04-18 11:06:49 · 496 阅读 · 0 评论 -
[BZOJ1968]AHOI2005 约数研究
看到这题想到线性筛,估计是可以做的。。不过有更简单的方法,考虑每个数对答案的贡献,显然就是能够整除它的数的数量,所以贡献就是n/i,秒变傻逼题。。#includeint ans=0,n;int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) ans+=n/i; printf("%d",ans);}原创 2015-04-18 11:15:14 · 438 阅读 · 0 评论 -
[BZOJ1912]APIO2010巡逻|树的直径
这题看完大概的做法也想到了。。就是找出两条最长的路径连成环嘛。。但是不能简单的这样考虑,因为找次长的时候并不是不能走最长的路径上的边,只是走了第一次就等于白走了,也就是不仅没有产生新的贡献反而抵消了第一次的贡献。。根据这个思路,K=1的时候直接找出一条最长路径len,答案即为2*(n-1)-len+1,K=2时,据前面的分析,把所有最长路径上的边权改为-1(双向!!),然后再求最长,答案即为2*(原创 2015-04-18 11:11:15 · 767 阅读 · 0 评论 -
[BZOJ1927]SDOI2010星际竞速|费用流
还是比较显然的费用流,不过一开始建图想错了。。把每个点i拆成i1,i2,若i到j有权值为q的边那就i1向j2连费用q流量1的边,源向每个i1连流量1费用0的边,向每个i2连流量1费用为瞬时移动到这个点的能量的费用的边,每个i2向汇连流量1,费用0的边,最小费用流就是答案。。可以用类似最小路径覆盖的思路去理解,连向汇的边是保证每个点都经过一次,源连向i2的边表示直接瞬移过去,i1连向j2的边表示从图原创 2015-04-18 11:12:22 · 767 阅读 · 0 评论 -
[BZOJ1503]NOI2004 郁闷的出纳员|splay
这题方法应该有很多,什么树状数组线段树都能搞。。用splay的话就是维护工资序列咯,但是每次修改都逐个修改的话肯定会T掉,注意到修改是整体修改,所以只要维护一个相对的修改值,然后修改的时候要考虑上这个相对值。。增加工资显然不会使员工离开,所以只要在减少工资的时候check一下就好了。。删除的时候要注意维护size。。#include#include#includeusing name原创 2015-04-18 10:18:08 · 540 阅读 · 0 评论 -
[BZOJ1833]ZJOI2010 数字计数|数位DP
数位DP太坑爹了(我太弱了),细节好多好多,特别要注意0的地方。。先预处理f[i][j][k]表示第i位为j的串数字k出现的次数,然后YY一下后面的cal。。做数位DP的时候千万要冷静,考虑全面。。#include#include#define ll long longusing namespace std;ll a,b,f[15][15][15],sa[15],sb[15],m[15原创 2015-04-18 10:57:23 · 453 阅读 · 0 评论 -
[BZOJ1934]SHOI2007 Vote|最小割
一开始就觉得是最小割转最大流做,,没想出怎么建图。。其实也挺显然,将S向所有1的人连边,所有0的人像T连边,有边的连起双向边,对于一条S到T的路径S,u,v,T,割掉S-u表示u违背自己,代价为1,割掉u-v表示朋友冲突,代价为1,割掉v-T表示v违背自己,代价为1,所以就是最小割。。#include#include#define N 305#define M 100005#defin原创 2015-04-18 11:13:43 · 824 阅读 · 0 评论 -
[BZOJ2002]HNOI2010弹飞绵羊|LCT
貌似有很多做法。。LCT打的第一题就是这个,年代久远了。。从后往前走的话这肯定是一颗树嘛。。查询就是查深度嘛。。修改就是断开一条边连到另一颗树上去嘛。。以前的巨丑无比的代码:#include#include#includeusing namespace std;const int maxn=200005,MAX=999999999;int c[maxn][3],pre[m原创 2015-04-18 11:24:49 · 463 阅读 · 0 评论 -
[BZOJ2006]NOI2010超级钢琴|DP|堆|RMQ
NOI题果然难得多,不会做啊。。后来看题解有说是要主席树啥的,,理解不了。。看懂了一个RMQ+堆的。。考虑一个序列的起点i,终点的范围是可以计算的,然后维护一下前缀和sum,起点的sum一定,那么终点的sum最大是答案最优,找这个最大可以用ST算法搞定。。对于一个四元组(s,l,r,m)表示起点为s,终点在[l,r]内,最优解在终点为m取到,然后以四元组的最优解大小为key对每一个点为起点的四元组原创 2015-04-18 11:38:50 · 483 阅读 · 0 评论 -
[BZOJ2038]2009集训队 小Z的袜子|莫队算法
闻名已久的莫队算法,很巧妙,就是通过调整询问顺序来优化时间复杂度。把整个序列分成√n块,每块√n个数。设我们已知i到j的可选方案数,并有一个记录了i到j各个颜色数量的数组,那么我们显然可以在O(1)的时间内得到(i±1,j±1)的答案。。令from(i)为询问i的左端点所在的块,将询问按from(i)为第一关键字,r[i]为第二关键字升序排序,先暴力出第一个询问的答案,然后暴力转移到后面的询问。在原创 2015-04-18 11:40:41 · 506 阅读 · 0 评论 -
[BZOJ1303]CQOI2009中位数图|乘法原理|前缀和
一开始没看到是1-n的排列,死活不会做。。既然b只有一个位置就好办嘛。。把小于b的数置为-1,大于b的数置为1,b置为0,然后处理出前缀和。。再分别处理出从b往前和往后的序列中和为k的数量,然后乘法原理乱搞一下。。注意这里和会有负数,要处理一下,然后和为0要特殊处理。。#include#include#include#define maxn 100005#define ll long原创 2015-04-18 09:57:30 · 549 阅读 · 0 评论 -
[BZOJ1507]NOI2003 Editor|splay
Splay/块状链表裸题。。不过范围有点大,具体操作像维护数列样搞就是,输出的时候中序遍历一下那个区间的子树。。要注意的是读入的时候,最快的方法还是一个一个getchar,还有一个坑的地方就是scanf(“\n”)的时候会把下一行开头的空格读掉。。splay:#include#include#include#include#define maxn 2100005using nam原创 2015-04-18 10:30:43 · 445 阅读 · 0 评论 -
[BZOJ1588]HNOI2002营业额统计|splay
splay入门题。。将n个数依次插入,查询第i个数之前的数中它的前缀和后缀,选择delta小的更新答案即可。。注意无前(后)缀或者有相等的情况。。很久以前的代码:#include#include#includeusing namespace std;const int MAX=999999999;int pre[100010],c[100010][3],num[100010],i原创 2015-04-18 10:45:44 · 441 阅读 · 0 评论 -
[BZOJ1878]SDOI2009HH的项链|树状数组
这道题纠结了好久。。只想得到线段树套平衡树的方法。。莫队会T掉。。后来看代码终于想通了,还是要离线搞。。读入之后预处理出每个位置下一个同颜色的位置next[],再将询问按左端点升序排序,用sum[i]表示1-i的颜色数,初始时只记录每种颜色第一个出现的位置。。用一个l指针,表示所有l之前的所有位置的颜色都已用next[]转移到l后了,这样保证颜色不重不漏,依次处理询问,将l不断向右移动,移动时把l原创 2015-04-18 11:04:07 · 441 阅读 · 0 评论 -
[BZOJ1179]APIO2009 ATM |强联通分量|DP
这题和1093差不多,也就是缩环之后spfa/拓扑排序/记忆化搜索搞一下,多注意一点的就是一个点有酒吧的时候它才能向前更新答案。。#include#include#include#define N 1000005#define clr(a) memset(a,0,sizeof(a))using namespace std;struct edge{ int e,next;}e原创 2015-04-18 09:45:19 · 562 阅读 · 0 评论 -
[BZOJ1202]HNOI2005 狡猾的商人|并查集|差分约束
一看题就觉得是差分约束,,不过发现没人用差分做啊。。然后我写了个差分约束发现是可以A掉的。。好高兴。。 更好的解法是并查集,因为相比于差分约束这里的都是相等关系,所以是要更特殊一点的。对于每一组s,t,v,若s和t不在一个并查集,就将它们所在并查集合并,并且把小的挂在大的上面,因为我们要对每个点多维护一个sum表示到根节点的路径长,其实也就是根节点表示的天到它表示的天之间的收入,这个可原创 2015-04-18 09:51:23 · 962 阅读 · 0 评论 -
[BZOJ1207]HNOI2004打鼹鼠|DP|LIS
蛮巧妙的,利用了和最大上升子序列相似的方法。。如果打完i鼹鼠后可以在限定时间内跑到j鼹鼠处(i#include#include#includeusing namespace std;int i,j,n,m,ans=1,x[10005],y[10005],t[10005],f[10005];int main(){ scanf("%d%d\n",&m,&n); scanf("%d%原创 2015-04-18 09:54:17 · 1014 阅读 · 0 评论 -
[BZOJ1257]CQOI2007余数之和|数学
数学题。。n>k部分的直接可以计算(n-k)*k。。考虑1#include#include#define ll long longusing namespace std;ll n,k,a1,q,i,d,len,ans=0;int main(){ cin>>n>>k; i=1; if (n>=k) ans+=(n-k)*k,n=k-1; while(i<=n) { d=原创 2015-04-18 09:54:12 · 373 阅读 · 0 评论 -
[BZOJ1452]JSOI2009 Count|树状数组
数据好小。。直接对每个颜色维护一个二维树状数组,不多说。。#include#include#define N 305#define C 105using namespace std;int n,m,Q,opt,col,x1,y1,x2,y2,i,j,c[C][N][N],a[N][N];int lowbit(int x){return x&-x;}void add(int x,i原创 2015-04-18 10:07:51 · 399 阅读 · 0 评论 -
[BZOJ1800]AHOI2009 FLY
数据这么小,维护一下前缀和,枚举所以可能,根据等弧对等边用前缀和判断一下即可。。#include#include#define N 25using namespace std;int n,ans=0,i,j,k,l,a[N],sum[N];int main(){ scanf("%d",&n); sum[0]=0; for (i=1;i<=n;i++) { s原创 2015-04-18 10:55:39 · 714 阅读 · 0 评论 -
[BZOJ1834]ZJOI2010网络扩容|最大流|费用流
差不多就是模板题嘛。。一开始先跑最大流不用多说,跑完后在残余网络上再建图,给每条原来边建一条流量无穷,费用为这条边扩容费用的边,再新建一个源点向1连流量为k费用0的边,跑费用流即可。。正确性貌似很显然。。#include#include#include#define maxn 1005#define M 30005#define inf 99999999using namespac原创 2015-04-18 11:02:29 · 431 阅读 · 0 评论 -
[BZOJ2005]NOI2010能量采集|数学
数学题。。首先要知道点(x,y)与原点连线上整点的个数为gcd(x,y)(除原点)。我们可以找到最小的(x0,y0)在连线上,显然gcd(x0,y0)=1,那么所有(x0*k,y0*k)(x0*k=2&&k*d#include#include#define ll long longusing namespace std;ll g[100005],f[100005],ans;int i原创 2015-04-18 11:39:07 · 547 阅读 · 0 评论 -
[BZOJ2049]SDOI2008洞穴勘测|LCT|并查集
LCT或者按秩合并的并查集维护一下联通性就行了。。LCT:#include#includeusing namespace std;const int maxn=10005,MAX=999999999;int c[maxn][2],pre[maxn],isroot[maxn],rev[maxn],n,m,u,v,i;char com[10];void mark(int x){i原创 2015-04-18 11:45:18 · 450 阅读 · 0 评论 -
[BZOJ2190]SDOI2008仪仗队|线性筛
答案就是所有满足gcd(x,y)=1的x#include#include#include#define N 40005using namespace std;int i,n,cnt=0,ans=0,phi[N],u[N],p[N];void getphi(){ int i,j; memset(u,0,sizeof(u)); phi[1]=1; fo原创 2015-04-18 11:47:10 · 780 阅读 · 0 评论 -
[BZOJ2243]SDOI2011染色|树链剖分|LCT
裸题嘛。。 先考虑一条线段上如何查询颜色段数,只要对每个线段树节点多维护一个左颜色和右颜色,然后合并的时候sum[x]=sum[lc]+sum[rc]-(左儿子的右颜色==右儿子的左颜色)。。实在太久没写树剖结果码+调试花了两节多晚自习,,各种傻逼错误,什么反向边忘加,标记忘记下传。。。还有就是更新答案的时候,关键的一点是要保证当前的两点(也就是a,b)是没有被更新到的,否则很难搞。。原创 2015-04-19 20:27:12 · 917 阅读 · 0 评论 -
[BZOJ2330]SCOI2011糖果|差分约束
差分约束题。。学了一下差分约束,我觉得还是挺简单的,考虑f[u]-f[v],发现和最短路的松弛操作神似,最短路跑完之后对于一条边(v,u),显然有d[u],不就是上面差分约束的式子吗。。那就转化成最短(长)路做咯,以最短路为例了,对于每个f[u]-f[v],连一条v到u权值为c的边,然后跑最短路,如果有负环那就说明无解,没有的话跑完之后各点的d值就是解。。对于本题,d[a]==d[b],有 d原创 2015-04-19 20:32:51 · 525 阅读 · 0 评论 -
[BZOJ3110]K大数查询|线段树套线段树
妈呀这题好神好神好神。。我发现主席树好像做不了呀。。咋全写的是线段树套线段树呢。。后来还是看黄学长的代码看懂了。。果然我是看黄学长博客长大的。。有两种做法,大部分人是外层权值线段树,内层区间线段树,这个我写了,还是很好写。。lyd给了一种外层区间内层权值的做法,没看懂。。内层区间[l1,r1]在外层权值区间[l,r]下的意义是在[l1,r1]内有多少权值在[l,r]之间的数。。由于一开始是空的,每原创 2015-04-19 20:51:37 · 642 阅读 · 0 评论 -
[BZOJ3172]TJOI2013单词|AC自动机
这题比阿狸的打字机不知道简单多了。。还是弄出fail树来 root到每个串的路径上的点都标记+1,统计i串的danger节点在fail树上的子树上的标记个数就是它出现的次数。。#include#include#include#define N 2000005int n,i,nd=1,next[N],a[N][28],size[N],pos[N],que[N];char s[N];i原创 2015-04-19 20:52:44 · 437 阅读 · 0 评论 -
[BZOJ2007]NOI2010海拔|最小割|平面图转对偶图|最短路
好久以前就想做但是那个时候不会做。。题目说海拔不一定是整数,纯属坑爹嘛。。可以证明如果有小数定不是最优(能贪就多贪嘛)。。然后显然最优的时候一定是走到了1就不会回到0了,也就是要分成两个点集,一个0,一个1,这不就是一最小割嘛。。看一看最大数据,250000+个点,直接跑最大流要挂。。注意到是平面图,而且S,T都在边界上,所以可以转对偶图跑最短路。。这里最要小心的就是rebuild的时候连原创 2015-04-23 14:35:29 · 594 阅读 · 0 评论 -
[BZOJ2733]HNOI2012永无乡|平衡树启发式合并
一看题吓傻了根本不会做啊。。然后又看了几遍题,好像就是维护各个联通块的k大嘛。。一开始纠结了好久,后来想起好像没有断边的操作,那就好搞了。。第一次写splay的启发式合并,用splay维护每个联通块的重要度序列,然后可以弄个并查集,如果连边的时候是两个不同联通块,那就把size小的那个splay按中序遍历一个一个插入到size大的那个splay里去,这就是启发式合并。。询问就按findkth那样搞原创 2015-04-19 20:48:24 · 667 阅读 · 0 评论 -
[BZOJ3889]USACO2015 Jan-Cow|最短路
挺傻逼的一道题,犯了一些傻逼错误,还写了对拍,拍出了别人的错误。。就是把航线上的每个点对暴力建边,然后跑双关键字最短路即可。。inf要开的够大。。#include#include#include#define ll long long#define N 10005#define inf 0x3f3f3f3f3f3f3f3fllusing namespace std;struct原创 2015-04-19 20:56:36 · 502 阅读 · 0 评论 -
[BZOJ1597]Usaco2008Mar 土地购买|斜率优化dp
一看题我是不会做的。。好神。。 后来发现大概不排序没法搞,那就先排个序咯。。又发现如果i的长宽都小于j的长宽,那么买j的时候可以“顺带”买掉i,所以i可以不考虑。。用x来表示长,y来表示宽,先按x升序排序,然后从头往后扫,并维护一个y递减的单调栈,将i压入栈时,如果栈顶元素的y的y,那就将栈顶弹出,因为i的x一定>=栈顶的x,而i的y又大于栈顶的y,那栈顶就被i包含了,可以扔掉,注意这原创 2015-04-23 14:36:41 · 663 阅读 · 0 评论 -
[BZOJ2434]NOI2011阿狸的打字机|AC自动机|fail树|树状数组
这题真是太神了,好多实用的技巧。。首先肯定是要先把每个要输出的串当模式串把自动机给建出来的,如果一个一个串复制出来再一个个插入显然非常慢。。。我们用在自动机上插入模式串的方法来建,初始时在0,新加一个字符就想下爬(或者新建),维护一个父亲指针,删除的时候就可以爬上去,这样就可以O(n)建出来了。。再考虑询问的问题,每次把串拿出来再放进自动机跑一遍显然太慢。。这里需要用到一个叫做fail树的东西原创 2015-04-19 20:38:30 · 736 阅读 · 0 评论 -
[BZOJ2480]SDOI2012 Longge的问题|欧拉函数
不会做数学题啊。。考虑gcd(i,n)=d的i的个数s[d],那么s[d]=gcd(i/d,n/d)为1的i的个数,也就是phi(n/d),那么答案就是所以n的约数的phi之和,根据phi(i)=i*(1-1/p1)*(1-1/p2)*…*(1-1/pk)可以得出一个O(√n)的求欧拉函数算法,然后就可做了。标解貌似是利用欧拉函数的积性什么的。。看不太懂啊。。 放个官方解法的图。。原创 2015-04-19 20:44:36 · 514 阅读 · 0 评论 -
[BZOJ2761]JLOI2011不重复的数字
我也想要这种省选题。。#include#include#includeusing namespace std;map a;int i,n,T,q;int main(){ scanf("%d",&T); while (T--) { scanf("%d",&n); a.clear(); scanf("%d",&q); a[q]=1;printf("%d",q);原创 2015-04-19 20:48:57 · 822 阅读 · 0 评论 -
[BZOJ3224]普通平衡树
模板题嘛。。splay:#include#include#include#define maxn 500005using namespace std;int i,n,opt,x,nd=0,ans,root=0,c[maxn][2],size[maxn],pre[maxn],same[maxn],num[maxn];void update(int x){size[x]=size[原创 2015-04-19 20:53:53 · 446 阅读 · 0 评论 -
[BZOJ1058]ZJOI2007报表统计|平衡树
没啥好说的,码力题,两棵平衡树,一棵维护相邻差值,一棵维护数,插入的时候要记得删去对应差值。。懒得写splay了,正好学一下STL(以前不喜欢写。。)#include#include#include#include#define N 500005#define inf 0x3fffffffusing namespace std;int n,m,i,x,k,a[N],ans=inf原创 2015-04-23 14:33:50 · 481 阅读 · 0 评论