自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 bzoj 4539: [Hnoi2016]树

开始读错题了,以后一定要好好读题!!!称原来给的大小为n的树为模板树,最后得到的树为答案树,把一次操作增加的节点看成一块,然后构成的树称为大树。答案树上两点的距离=两点分别走到所在块的根,在大树上走到两个块的lca,撤销进入块lca后两个点共同走过的路径。第一步的答案就是找到点到它所在块的根在原树中的距离第二步,把大树上两点之间的边权定义为答案树上这两个块的根的距离,然后倍增lca

2016-04-30 11:39:42 666

原创 bzoj 4547: Hdu5171 小奇的集合

读题,发现就是每次找两个最大的数,加入a+b,矩乘优化一下就好。然而,wa*inf,原因如下:1.读错题,答案求的是集合内所有数的和,我写成了所有加入的数的和2.忘记负数取模的问题3.不一定,A#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#defi

2016-04-29 08:38:32 464

原创 bzoj 3609: [Heoi2014]人人尽说江南好

对于必胜方,游戏的最优策略是每次找最大的两个可以合并的数合并,但是如果出现(m-1)  2 1 1 ……的情况合并 m-1 和 2,这样无论必败方如何操作,这次游戏的总操作次数是一定的,因为这样的终局一定是一些m,然后一堆n%m,或者其他总操作次数和它相等的局面。这个终局的总操作次数相当于比没有m的限制少了这剩下的n/m上取整堆的合并次数,所以操作次数是(n-1)-(ceil(n/m)-1)

2016-04-29 08:34:35 706

原创 bzoj 3823: 定情信物

考虑每个n维超立方体的k维元素的“对角线”向量就是从n维中选出k维,每一维为+1或-1,答案就是C(n,k)*2^k,在预处理出逆元之后可以O(n)。但是由于p可以#include#include#define ll long long#define N 10000000using namespace std;ll rev[N];int p;void get_rev(int n){

2016-04-27 21:42:33 520

原创 bzoj 3755: Pty爬山

称关键点为使其改变目标的点,从一个点出发,到达的关键点是确定的,且如果一条路径上到达某个点为关键点,那么之后的路径和从这个点出发的路径相同,所以我们就要找出每个点出发走到的下一个关键点。首先找到每个点能看到的最高的山峰,维护每个点左面的上凸壳,右边的上凸壳,那么它能看到的最高的山峰就是这两个下凸壳的最后一个点中较高的点,而要寻找的关键点一定在这个点和那个较高的点之间。之后,把所有点按照到达

2016-04-27 21:36:59 580

原创 bzoj 4554: [Tjoi2016&Heoi2016]游戏

如果不考虑硬石头的限制,那么就是经典的二分图匹配,对于硬石头的限制,就把同一行/同一列再拆点。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 5010using namespace std;struct yts { int x,

2016-04-26 14:49:32 892

原创 4551: [Tjoi2016&Heoi2016]树

应该是和sdoi发生了同样的一道很好的想法题由于出题人没有想到某种做法变成了水题。这道题显然可以nlog^2n的树链剖分,但是有一种很好的并查集做法:用类似疯狂的馒头这道题的方法,维护father[i]表示离i最近的打了标记的祖先。把所有询问离线下来倒着枚举,如果某个操作是把点从标记变成不标记,那么把它的father变成它的父亲。#include#include#include

2016-04-26 14:07:17 982 2

原创 bzoj 1831: [AHOI2008]逆序对

可以证明在-1的位置填的数是单调不降的。看到数据范围n转移的时候,一个不是-1的位置贡献的逆序对数与它前面的-1的位置具体填了多少有关,所有考虑贡献提前计算,即如果这个位置是-1,把它前面和后面所有不是-1的位置形成的逆序对都计算进去,而不是-1的位置只需要把它和它后面不是-1的位置形成的逆序对计算进去(-1之间不会形成逆序对)。然后,树状数组优化求逆序对即可(但是数据范围好小,直接暴

2016-04-23 18:38:31 556

原创 bzoj 3430: [Usaco2014 Jan]Ski Course Rating

开始别人跟我说这道题时没告诉我对于所有点T的值都是一样的,也没告诉我是奶牛题,于是YY了一种二分答案+可持久化并查集的nlog^3n的做法:把所有边排序,建主席树维护加入的边权之后二分答案,在对应的权值的位置查询它所在的集合大小是否大于等于T然后又想了种nlog^2n的做法:并查集,对每个集合维护一个小根堆记录所有在这个集合内未达到T的点的T-size,然后启发式合

2016-04-23 10:59:12 639

原创 bzoj 2555: SubString

后缀自动机+lct维护fail树注意在copy q节点的信息的时候,right[cpy]=right[q],动态维护其他信息的时候也要注意这一点。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 1200010using na

2016-04-22 09:50:14 547

原创 bzoj 1790: [Ahoi2008]Rectangle 矩形藏宝地

我的这种做法MLE一个点,cheat过去了。把所有点按照x1排序,依次在线段树节点的x2位置加入区间[y1,y2]查询时,查询线段树区间[x2,n]是否存在一个区间包含[y1,y2],在它之前加入的点的x1查询是否存在一个区间包含这个区间:把这些区间去除被别的区间包含的区间,剩下的按照左端点排序,二分找到最大的y1显然,如果这个区间不包含查询的区间,那么其他区间也不可能,维

2016-04-21 21:54:50 765

原创 bzoj 2310: ParkII

带独立插头的插头dp,注意比环的插头dp的区别主要是在只有一个插头并且是独立插头的时候,有可能可以结束线路,剩下的就是2*2特判变成3*3特判。然后就是各种打错变量名,还有一个宝贵的经验就是手写二进制分解其实没有太麻烦。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e

2016-04-21 19:56:27 517

原创 bzoj 4538: [Hnoi2016]网络

查询的是不包含x的链的权值最大值。树链剖分后,每条链变成O(logn)个区间,那么未被这个链包含的也有logn个区间,在这logn个区间上做修改即可。因为有删除操作,每个线段树节点开一个堆维护。#include#include#include#include#include#include#define ll long long#define inf 1e9#define ep

2016-04-21 14:04:26 494

原创 bzoj 4540: [Hnoi2016]序列

题意坑爹,不需要判断两个子串是否相等。然后这道题几乎就是bzoj 4262了。除了线段树做法,还可以用莫队用单调队列预处理出L[i]表示i左边第一个小于a[i]的位置,R[i]表示i右边第一个小于a[i]的位置。fl[i]表示以i为左端点的所有区间的答案,=a[i]*(R[i]-i)+fl[R[i]],因为[i,R[i])位置的贡献都是a[i],[R[i],n]这个区间的答案与fr

2016-04-21 11:04:56 676 1

原创 bzoj 4542: [Hnoi2016]大数

在p!=2且p!=5的情况下,x*10^k%p=0,则x%p=0,所以可以维护后缀和%p的值,然后用莫队求区间内相同的数的对数。p=2 or p=5 最后一位决定%p之后的值,yy一下即可#include#include#include#include#include#include#define ll long long#define inf 1e9#define eps 1e-8#

2016-04-21 09:26:41 373

原创 bzoj 2461: [BeiJing2011]符环

f[i][s1][s2][s3]枚举到前i个字符,前半段左括号-右括号的值是i,后半段未匹配的左括号个数是s2,未匹配的右括号个数是s3.后半段去掉已匹配的括号后一定是这样:)))(((。转移时依次枚举左边添加左括号,左边添加右括号。注意在右面添加右括号时,一种情况是减少一个未匹配的左括号,一种情况是增加一个未匹配的右括号。然后记忆化搜索。#include#include#

2016-04-20 20:35:46 450

原创 bzoj 4373: 算术天才⑨与等差数列

看到这个限制条件非常强,就不难考虑到hash。存在一个性质,只要知道这个区间的最大值,最小值,希望得到的等差序列就唯一确定,需要干的工作仅仅是看原来的序列和这个序列是否相同。首先,用各种特判:k=0很好做,若k!=01.相邻两项的差的gcd是k的倍数->维护差的gcd2.没有相同的项->维护pre的最大值3.区间和等于这个等差序列的和->维护区间sum用线段树维护一下就

2016-04-20 15:52:27 610

原创 bzoj 1913: [Apio2010]signaling 信号覆盖

每个凸四边形对答案的贡献是2,每个凹四边形对答案的贡献是1.凹四边形贡献1是显然的,凸四边形贡献是2的原因是:如果一个点在一个三角形的外接圆内,那么α+β现在考虑如何求凸四边形个数和凹四边形个数,凹四边形比较好求。枚举每个点,设其为p,统计有多少个三角形覆盖了这个点,那么,以这个点为中心的凹四边形就有多少个。考虑补集转化,求有多少三角形不覆盖这个点。将所有剩余点极角

2016-04-20 15:04:40 661

原创 bzoj 4262: Sum

把询问离线下来,查询max和查询min相似,现在只考虑查询max令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案那么询问就是sun[l1,r1,r2]-sum[l1,r1,l1-1]从1到n枚举x,维护区间线段树表示sum[l,r,x],发现从x-1转移到x的过程中,每个数加上了max(a[pos]..a[x])的答案。用单调队列维护一个单调递减的序列,由

2016-04-20 11:28:35 651

原创 bzoj 3832: [Poi2014]Rally

首先建图,S向每个点连边,每个点向T连边,那么问题就变成了求S-T最长路-2拓扑图的每条边都是从拓扑序小的点连到拓扑序大的点经过某条边的最长路是从S沿最长路走到这条边的x,再从y沿最长路走到T所以,扫描整个序列,维护所有pos[e[i].x]维护所有的边,就是在扫描到x的时候,把所有到达x的边删除,查询,把所有从x出发的边加入。我一直在想把最长链拉出来,然后用类似上面的方法维护

2016-04-20 10:13:01 587

原创 bzoj 4537: [Hnoi2016]最小公倍数

一部血泪史:开始我想到分块,但是一直在想直接按照a的权值分块,却发现无论怎么做复杂度都不对。看题解,发现直接把边分块就行。题解:考虑暴力做法,就是把所有想到这个做法,不难想到分块,把边按照a为第一关键字,b为第二关键字排序,分成若干块。每次把前i块的边和第i块的询问按照b的大小排序,按照b的权值从小到大把边加入并查集,注意如果这条边的a权值>这一块的询问的最小a权值,那么不

2016-04-20 08:57:59 1413

原创 bzoj 4446: [Scoi2015]小凸玩密室

#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 200010using namespace std;ll f[N][20],g[N][20],A[N],B[N],dis[N];int fa[N],lson[N],rson[N],dep[N]

2016-04-19 21:47:14 719

原创 bzoj 3956: Count

发现好点对互不跨立,所以只有O(n)个,用单调队列找出这O(n)个然后用主席树维护就可以了。对于a[i]相等的情况的单调队列写错了一些细节。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 300010#define TR 1

2016-04-19 19:06:59 383

原创 bzoj 2809: [Apio2012]dispatching

线段树合并or可并堆or树上主席树我写的线段树合并,注意query递归到最后要return sum/x,就是只剩一个数,但是个数太多。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define N 100010#define TR 3200

2016-04-19 16:19:04 359

原创 bzoj 4524: [Cqoi2016]伪光滑数

看到求第k大,k很小,首先应该想到k路归并。利用可持久化可并堆进行dpg[i][j]表示前i个素数,用了j个质因子可以表示的数的集合g[i][j]=sigma(g[i-1][j-k]*p[i]^k) sigma表示集合的并,乘法用打标记实现。然后k路归并,按照使用了的质因子个数分类。令mx[j]表示取j个质因子的情况下可以取得最大素数用堆维护g[mx[j]][j]的最大值,

2016-04-19 15:33:03 481

原创 bzoj 3073: [Pa2011]Journeys

注意是无向图。线段树优化连边跑最短路。#include#include#include#include#include#define ll long long#define inf 1e9#define eps 1e-8#define md#define N 5000010using namespace std;struct yts { int t,ne; bool l;} e[130

2016-04-18 15:52:35 605

原创 bzoj 2140: 稳定婚姻

查询二分图每一条边是否一定在二分图最大匹配上:首先任意一个最大匹配,然后把两个匹配点缩成一个点,然后用这个图跑强连通分量,如果一个点所在的强连通分量大小大于1,那么说明原图存在一条匹配边-非匹配边-匹配边-非匹配边的环,所以这些边不一定在最大匹配上。#include#include#include#include#include#define ll long long#define

2016-04-18 15:05:24 453

原创 bzoj 2162: 男生女生

二分图最大团=补图最大独立集,因为这道题是人数多为第一关键字,男生多为第二关键字,所以男生的权值设为n+2,女生设为n+1连边S->x flow=n+2x->y+n(xy之间没有边) flow=infx+n->T flow=n+1然后总人数是ans/(n+1),男生是ans%(n+1)发现任选一种,图都是一样的,A个男生向B个女生的每个都有边。容斥,另表示i个男生j个女

2016-04-18 14:54:48 610

原创 bzoj 4111: [Wf2015]Keyboarding

傻逼广搜,我却想不出来.f[i][j][k]表示位置ij,打完第k个字母的最少步骤,然后这个题卡内存,用动态内存或者压着内存开数组.以后如果再看到网格图的题,要想到与每个点连边的只有4个.#include#include#include#include#include#define ll long long#define inf 1e9#define eps 1e-8#

2016-04-18 11:08:36 1161

原创 bzoj 4499: 线性函数

0没有逆元!0没有逆元!0没有逆元!重要的事情说三遍!把query的式子展开就是0没有逆元!0没有逆元!0没有逆元!重要的事情说三遍!把query的式子展开就是首先是一个看上去很对的做法:另d[i]=PI[j=i to n] k[i]那么答案就是用线段树维护d,维护b[i-1]*d[i]的区间和就可以了。最后答案*d[r+1]^(

2016-04-15 09:45:28 709

原创 bzoj 4456: [Zjoi2016]旅行者

分治+最短路离线,分治,每次查询起点终点都在[x1,x2][y1,y2]内的答案。接下来讨论x2-x1>y2-y1的情况,反之类比即可。现在我们要计算的是路径范围在这个矩形之内,且路径经过中轴线的答案。枚举中轴线上的每个点,计算它到矩形内的点的最短路,然后用dis[a]+dis[b]更新询问的答案。之后分治查询两个点在中轴线同一边的答案。这样做为什么是对的?在分治的过程中,

2016-04-14 19:59:08 1113

原创 bzoj 4444: [Scoi2015]国旗计划

破环成链,对于每个点的策略是找最后一个能传递到的旗手,每个点都指向一个特定的点,这样形成了一棵树。如果father[x]传递到的最后一个点是y,那么x传递到的最后一个点在x到y的路径上,所以如果把一条链看成一段决策,那么决策点所在的深度是不减的。所以可以对树进行dfs,维护一个双端队列,每次暴力进出队列,然后ans=dep[y]-dep[x]+1。复杂度O(n)还有一种倍增的写法:

2016-04-14 18:28:42 796

原创 bzoj 4455: [Zjoi2016]小星星

一种暴力做法是f[x][y][S]表示以i为根的子树,x匹配的是y,使用了的集合是S的方案数,然后转移显然,然而我并没有想到。正解非常巧妙。枚举集合S,要求所有点只能和S中的点配对,可以多个点匹配一个点,f[x][y]表示x匹配的是y,以x为根的子树的方案数,转移yy一下就行。然后容斥 如果|S|&1 == n&1 那么ans+=sum 否则 ans-=sum这道题告诉我,遇到枚举

2016-04-14 14:58:36 934

原创 bzoj 4402: Claris的剑

要求本质不同,考虑字典序最小的排法序列是这样的:1(212121……)2(323232……)3(434343……)…… m或者1(212121……)2(323232……)3(434343……)…… m m-1这两种是没有交集的,因为在确定m的值之后,序列长度的奇偶性也就确定了。每个序列相当于 1 2 3…… m (m-1) 在第1到m-1个间隙插入任意个数对(i+1,i

2016-04-14 11:50:50 776

原创 bzoj 4454: C Language Practice O(n)-O(1) gcd

O(n)-O(1) gcd数n的质因数分解最多只有一个数大于sqrt(n),且那个数一定是素数一个数一定可以分解成三个数相乘,每个数于是,我们可以通过O(n)的预处理,以O(1)的效率回答两个数的Gcd计算0~sqrt(n)之间的数两两的gcd,1到n的三个数相乘的分解。然后计算两个数的gcd枚举一个数的这三个因数,设枚举到的数是x如果x否则,x是个质数,只要看另一

2016-04-14 09:35:04 1650

原创 bzoj 4421: [Cerc2015] Digit Division

显然是找前缀为0的断点个数,注意如果全局答案不是0,那么ans=0下面是简单的证明(kouhu)首先,证明只有前缀为0的位置可以成为断点。第一段显然前缀只能为0假设前k段前缀只能为0,那么第k+1段一定满足 (f[k+1]-f[i]*10^(k-i))%m=0,由于f[i]%m=0,所以f[k+1]%m=0;所以只有前缀为0的位置可以成为断点。之后证明任意两个断点之间都是合

2016-04-13 19:50:24 553

原创 bzoj 4448: [Scoi2015]情报传递

首先想到实际上是查询链上开始搜集的日子小于x的点的个数,然后yy了树上莫队做法。其实这就是树上主席树的 裸题。#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define md#define TR 4000010#define N 200010using nam

2016-04-13 19:44:46 573

原创 bzoj 4401: 块的计数 水题

水题,想麻烦了一点点我的思路:显然只有sz|n时才有可能合法,一个数的约数个数时O(logn)的,所以可以暴力dp题解:其实,当且仅当一棵子树的sz[z]是块的大小的倍数,这个子树的根可以成为一个块的根,所以枚举一下答案暴力就行。#include#include#include#include #define ll long long#define inf 1e9#defi

2016-04-13 18:51:25 469

原创 bzoj 3307: 雨天的尾巴

卡常数+卡内存,如果离散化了应该能好很多,但是我犯逗没有这么做首先如果是序列上在一段内加入一个数,那么就是在位置l +1,在位置r -1,然后用权值线段树维护最大值就行。那放在树上呢?dfs+线段树合并,这个做法好像可以解决很多在序列上按照奇奇怪怪方式扫描并维护奇奇怪怪的东西,然后搬到树上的问题。如果不是用线段树的维护,也可以启发式合并这么搞。在x,y打上+1,lca(x,y) f

2016-04-13 16:22:57 476

原创 bzoj 4522: [Cqoi2016]密钥破解

数论模板大集合#include#include#include#include #define ll long long#define inf 1e9#define eps 1e-8#define mdusing namespace std; ll mul(ll a,ll b,ll p){ ll ans=0; while (b) { if (b&1) ans=(ans+a)%p;

2016-04-13 11:31:59 524

空空如也

空空如也

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

TA关注的人

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