
bzoj
文章平均质量分 68
Miao_zc
膜Hz
展开
-
bzoj4964: 加长的咒语
求区间最长括号序列子串。很有意思的括号,但是我有些细节没处理好,导致代码长,算法复杂。。 如果有更好的算法我也很想知道啊>.考虑一个括号序列A=(B1)(B2)(B3)…,其中与某个括号匹配的相对的括号唯一。证明显然。有一个显然的算法:用栈判断一个字符串是否为括号序列。考虑拓展这个结论:对任意括号串的某个括号序列子串,某个括号匹配的相对的括号唯一。证明显然。既然这样就随原创 2017-08-11 10:51:41 · 783 阅读 · 0 评论 -
bzoj2338: [HNOI2011]数矩形
这是一道SB题,然而我是大SB。。。发现N注意精度问题,中点请将坐标*2,面积请用叉积。连cmath都不用!P.S.:某同(da)学(ye)说可以留一个矩形,其他点坐标相同,可以卡到n^4然而去(bing)重(mei)就(you)行(chong)了(he)。#include#include#include#include#define ll long longusing原创 2016-08-05 17:06:31 · 575 阅读 · 0 评论 -
bzoj4035: [HAOI2015]T3
发现翻转相当于增加一个白格对于一个白格子,它的SG值只与它还能跳的次数有关,如长度10,SG[4]=SG[5]。于是不同的状态只有sqrt(n)个。只要求出还能跳k步的位置的SG就能得到答案。暴力DP即可,貌似O(n)能过#include#include#include#include#define N 100005using namespace std;int n,k,s原创 2016-08-03 21:07:30 · 1056 阅读 · 0 评论 -
bzoj4650: [Noi2016]优秀的拆分
此题有95分暴力。。。发现AABB的统计相当于对AA的统计。于是可以计算出每个点左侧为AA的方案数。枚举|A|,将字符串分成长度为|A|的小段,当AA中点在小段中的情况可以利用SA+rmq,O(1)求。于是就能在O(n/1+n/2+...+n/n)=O(nlogn)内求解。#include#include#include#define N 80005using namespace原创 2016-08-03 21:01:31 · 930 阅读 · 0 评论 -
bzoj3159: 决战
这道题真是让我对LCT有了新的认识啊!题意大概就是实现一颗树,支持路径翻转!然后我一脸懵逼地想到了splay,然后不会。其实只要一个LCT就可以了,额外开一颗splay记录prefer路径上的值,然后翻转就是MakeRoot+splay+reverLCt+reverSplay,然后就好了。。。LCt真是神奇啊。。。#include#include#define N 50005原创 2016-07-19 20:11:11 · 1117 阅读 · 0 评论 -
bzoj3813: 奇数国
该村子在财产上的求和运算等同于我们的乘法运算该村子在财产上的求和运算等同于我们的乘法运算该村子在财产上的求和运算等同于我们的乘法运算一开始直接把它忽略了。。。导致题意都没看懂,直接看题解一句话题意,听说是最简单的一道。。。考虑phi(x)=x*∏(pi-1)/pi,维护区间和,区间每个质数是否存在(long long),即可得到答案。#include#include原创 2016-07-19 09:22:53 · 718 阅读 · 0 评论 -
bzoj4381: [POI2015]Odwiedziny
点这里→这道题暴力跑最多n/m个点(m为步长),当m较小时飞慢。考虑DP[i][j]表示从i以j步长跳到根的和,询问可达到O(1+lca)。这样对m>sqrt(n)的暴力,另外up函数是利用树剖把x往上跳y下,同一个方向跳复杂度O(logn)。#include#include#include#define N 50005using namespace std;int n,原创 2016-07-03 10:49:59 · 897 阅读 · 0 评论 -
bzoj3440: 传球游戏
这不傻逼题吗!一开始连题目都被读懂。。。第1类人,顺着传来的方向传给下一个人。第2类人,逆着传来的方向传给上一个人。第3类人,顺着传来的方向传给下面第二个人。第4类人,逆着传来的方向传给上面第二个人。现不知是从哪个人开始传,及开始传的方向,求有哪些人无论如何,最多只能碰到一次球然后很容易想到拆点,然后找环,可是不止有这种情况,可以从1号顺时针走到2号顺时针再走到1号原创 2016-07-12 15:40:36 · 1043 阅读 · 1 评论 -
bzoj2333: [SCOI2011]棘手的操作
学习了可并堆,感觉不难,写起来比二叉堆都容易,但是不好理解。。。这道题好像可并堆会被卡,但是还是练习一下吧。。这题就是要实现一些可并堆,用一个大堆储存可并堆顶的值,左偏树或斜对就可以做啦~\(≧▽≦)/~//DEVc++编码方式真是神奇#include#include#define N 300005using namespace std;int n,Q,x,y,ALL,ro原创 2016-06-11 07:57:27 · 661 阅读 · 0 评论 -
bzoj4592: [Shoi2015]脑洞治疗仪
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞。对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn)。#include#include#include#define N 800005using namespace std;int n,m,p,x,y,l,r;int sum[N],L[N],R[N],tg[N原创 2016-05-18 20:13:47 · 817 阅读 · 0 评论 -
bzoj3575: [Hnoi2014]道路堵塞
一开始看错题啦!某一条边不走的最短路相当于1--沿最短路-->x-->……-->y--沿最短路-->n,于是定义T{l,r},表示从起点到最短路上序号r有一条长度为l的非最短路。然后用堆维护即可。(慎用memset。。)TLE。。。#include#include#include#include#include#define N 100005using namespace st原创 2016-05-17 20:07:16 · 1287 阅读 · 0 评论 -
bzoj2962: 序列操作
这是一道区间修改的线段树,其中区间加比较难,但手推一下也可以推出来,然而我慢的飞起。。。#include#include#include#define P 19940417#define N 160005#define ll long long#define MO(x) ((x)%P)using namespace std;int n,q,a[N],x,y,z,b[21],tg原创 2016-05-31 08:19:29 · 942 阅读 · 0 评论 -
bzoj3573: [Hnoi2014]米特运输
看懂了题目就A了一半。。。大意是这样的,给一棵以1为根的树,求最少修改几个点的容量后,使得除根节点外所有节点为父亲容量/父亲的儿子个数。因为1个节点确定,所有节点都确定了,不妨对每个点求出它不修改时根节点的容量,Hash一下就可以了。(貌似自然溢出会WA,可能我写炸了吧)#include#include#include#define ll long long#define N原创 2016-05-17 07:33:29 · 719 阅读 · 0 评论 -
bzoj3572: [Hnoi2014]世界树
这道题是叫做虚树的东西,可以发现每次的关键点个数较少,每次用O(n)的DP显然TLE。可以将所有关键点及关键点lca间连上虚边,对这O(m)个点DP,链上的点可以分成两段,分别计算贡献即可,细节蛮多,树链剖分比倍增快。#include#include#include#include#define N 300005#define inf 1000000000using namespa原创 2016-05-16 19:25:24 · 527 阅读 · 0 评论 -
bzoj3571: [Hnoi2014]画框
这道题可以类似最小乘积生成树的最小乘积二分图完美匹配。本题中二分图完美匹配的个数可以达到n^n,将每个匹配看成点(ΣA,ΣB),易得Ans在左下角的凸壳上。使用分治,先求出最左的和最下的点L,R,寻找mid使mid为直线LR下方最靠近原点的点,然后分治L~mid,mid~R,直到L,mid,R共线。至于如何求mid,将边权改变即可(窝还不太懂。。)SPFA比KM慢好多。。#in原创 2016-05-16 19:19:37 · 604 阅读 · 0 评论 -
bzoj2157: 旅游
树链剖分。把边权转成深度大的点权,支持单点赋值,路径取反,路径求和,路径最值,用线段树即可完成。因为第一种操作是对边的编号修改,一开始没注意WA了。。#include#include#define N 100000#define inf 1000000000using namespace std;int n,m,x,y,z,w[N],L[N];int first[N],to原创 2016-04-18 08:48:45 · 426 阅读 · 0 评论 -
bzoj3316: JC loves Mkk
首先看到环,考虑变成链上询问。由于题目要求平均值最大,所以无法直接使用线段树维护。先二分平均值,问题就能转化为能否找到L~R的一列数和大于等于零。这个很像单调队列,只要对奇偶分别维护单调队列就可以了。#include#include#define N 200005#define ll long longusing namespace std;ll n,m,L,R,a[N],q[2][原创 2016-08-23 12:00:46 · 585 阅读 · 0 评论 -
bzoj4574: [Zjoi2016]线段树
好久没写题解了。。。这道题拖了好久,终于把常数卡进去了。首先发现数据随机,肯定不是正常算法,不妨离散。考虑DP,用dp[q][i][j]k]表示q轮后i~j最后变成k的情况。比较难转移。参考大神的blog:用dp[q][i][j][k]表示表示q轮后i~j最后变成每个数都小于等于k的情况,这样可以转移。//不要问我怎么转,好久以前推得式子然后每个值k只影响一段i~j的dp值原创 2016-10-10 21:00:33 · 721 阅读 · 0 评论 -
bzoj2154: Crash的数字表格
依题意:Ans=∑ni=1∑mj=1Lcm(i,j)=∑ni=1∑mj=1id∗jd∗dAns=\sum_{i=1}^{n}\sum_{j=1}^{m}Lcm(i,j)=\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i}{d}*\frac{j}{d}*d⇒Ans=∑min(n,m)d=1d∗∑⌊nd⌋i=1∑⌊md⌋j=1i∗j|gcd(i,j)=1\Rightarrow An原创 2016-03-15 19:56:02 · 659 阅读 · 0 评论 -
bzoj3242: [Noi2013]快餐店
——来自一个失去梦想的咸鱼miaom考虑海蜇基环树的一般套路,在确定快餐店位置的情况下,最优解中环上必有一条边是废的。思考枚举这条边,我们需要在最快的时间求剩余部分的直径。当前答案就是直径/2,证明非常简单,就离快餐店最远的点一定是直径端点。这个东西可以通过双指针单调队列维护,达到O(n)复杂度。然后我就失去了梦想,直接线段树水过了。线段树做法如下:先搞出那个环,重复一遍变成序列问题,询问原创 2017-07-04 21:09:18 · 655 阅读 · 0 评论 -
bzoj4827: [Hnoi2017]礼物
看到要求∑(xi − y i+k -c )2的最小值。首先将xi − y i+k看作整体,得到一个关于c的二次函数nc^2+pc+q=0。发现q的形式将y数组翻转类似一个卷积,然后又发现其中每个值小于998244353,然后一个NTT上去就能求出精确的最小值了。O(nlogn)#include#include#define P 998244353#define N 200005#def原创 2017-04-18 20:34:49 · 956 阅读 · 0 评论 -
bzoj4767: 两双手
注意一个条件,ax*by!=bx*ay,所以每个点所需的每只手的次数是固定的,于是就可以转换为网格图(注意这里|坐标|注意有一些无解的可能需要特判。//发现bzoj上使用cerr会返回RE 2333#include#include#include#define P 1000000007#define ll long longusing namespace std;int Ex,原创 2017-03-11 08:59:59 · 966 阅读 · 1 评论 -
bzoj1875: [SDOI2009]HH去散步
又一道矩阵乘法加速的题目。看到N ≤ 20,M ≤ 60,t ≤ 2^30的数据范围,很容易想到用矩阵乘法。本题不能立刻走回头路,所以可以以边为状态,把无向边拆成2条有向边a[i]表示目前在第i条边终点,b[i][j]表示第i条边是否接着j,先把起点为A的a[1]=1,然后a*b^t。统计终点为B的a[i]值。别忘%。。。#include#include#define S 200usin原创 2016-03-14 17:41:03 · 714 阅读 · 0 评论 -
bzoj3512: DZY Loves Math IV
杜教筛是什么?赶紧写一题。 令S(n,m)=∑i=1mφ(ni)对于|μ(n)|=1S(n,m)=∑i=1mφ(i)∑e|dφ(de)φ(nd)−−−d=(i,n)S(n,m)=∑i=1mφ(i)∑d|(i,n)φ(nd)=∑d|nφ(nd)∑i=1m/dφ(di)S(n,m)=∑d|nφ(nd)S(d,md)对于μ(n)=0,设k|n,|μ(n/k)|=1,k最大S(n,m)=∑i=1mkφ(n原创 2017-01-20 15:02:13 · 1224 阅读 · 0 评论 -
bzoj3926: [Zjoi2015]诸神眷顾的幻想乡
太阳花田的结构比较特殊,只与一个空地相邻的空地数量不超过20个。这是一棵只有20个叶子的树,容易想到对每个叶子节点dfs一遍,然后拉板子。。原创 2017-02-20 10:09:26 · 1058 阅读 · 0 评论 -
bzoj3216: 话旧2
大家好,我是SB这道题是在看3215时找不到题面点进来的(然而并没有一眼看出这两题的差别)。一开始想了一会,感觉就是一个组合数,然后最小值==0就有点像Catalan数,于是打开geogebra画图,得到了一个:Ans=Get(Y-X,Z)-Get(Y+X+1,Z-1),反正证(gan)出(jue)他是对的,就狂WA。。。后来找的了→ ,发现自己傻了。。然后用lucas定理原创 2016-12-22 16:58:06 · 1001 阅读 · 0 评论 -
bzoj3218: a + b Problem
题目名称是吸引我点进来的。首先这是一个最小割模型,对点i,连S->i:b[i],i->T:w[i],i->i':p[i],i'->j(奇怪):inf,这样就有了一个TLE的算法。怎么办呢?然后vfk强行将n^2的边减少到nlogn。。。原创 2016-12-14 20:57:20 · 646 阅读 · 0 评论 -
bzoj4379: [POI2015]Modernizacja autostrady
好长啊题目。。。大概就是把一棵树分成两棵再拼成一棵后的最大最小直径。应该可以想到树形DP,保存每个节点为根的子树的直径和出去该子树后的直径。为此我们需要维护每个节点向下的前三长的链(每个儿子只记一次),向上最长的链,儿子中前二长的直径,然后可以求出在哪里断开。最后把两棵树的直径找粗来,并起来即可。说起来好像很简单,然而我做了一周。。真是太弱了。。。代码比较丑2333#inclu原创 2016-06-21 15:42:49 · 847 阅读 · 0 评论 -
bzoj1194: [HNOI2006]潘多拉的盒子
一看这道题自动机就好慌,但是多想想并不难。S由于自动机的输出可以是无限的,因此不放压缩状态,用(x,y)表示在第一个自动机x点,第二个自动机y点可行,然后跑bfs,找是否存在(x,y)使x可以输出而y不行,若有则不符合。#include #include#include#define N 105using namespace std;int S,a[N],b[N],f[N][原创 2016-12-09 09:39:28 · 627 阅读 · 0 评论 -
bzoj1178: [Apio2009]CONVENTION会议中心
这题有点强,一句话题意:求字典序最小的线段覆盖(这里的字典序指选择的线段的编号排序后的字典序)。如果不要求字典序只需要对左(右)端点排序,然后贪心取即可。一开始我想到的是DP,但是字典序存在了不可避免的后效性,看了题解之后,才有了思路。先离散,要使字典序最小优先选序号小的,然后判断选取某一个之后最优解是否改变。接下来就是怎么O(logn)求区间内线段覆盖。(具体做法搜索ppt。。。原创 2016-12-08 16:46:19 · 1407 阅读 · 0 评论 -
bzoj1195: [HNOI2006]最短母串
一开始以为这是字符串好题,一看n范围,n!就炸了。考虑dp,dp[i][j] i表示每个子串有没有出现,j表示最后的串。看了lych的博客之后,自己还是naive!首先有可能出现一个串没有用,要预处理掉,另外字典序最小需要存更多的东西。复杂度O(2^n*n*n*跑得过)。#include#include#include#define N 13using namespace s原创 2016-12-07 15:31:11 · 702 阅读 · 0 评论 -
bzoj3672: [Noi2014]购票
为什么我这么慢!!!这道题大概有两种思路,树分治和线段树。树分治:使用类似cdq的方式,1:找重心,分裂,2:work(根所在的树)3:用重心到根的点的答案更新重心的子树,4:work(重心的子树)。更新的时候维护一个下凸壳,在下凸壳上二分即可。(我写了这个)线段树:同样需要维护下凸壳,考虑在dfs时动态维护当前节点到根路径上的区间下凸壳,这个用线段树在每个节前维护一个支持回撤的单调栈原创 2016-12-12 15:15:26 · 685 阅读 · 1 评论 -
bzoj1588: [HNOI2002]营业额统计
切水。法一:用平衡树维护,nlogn,网上大多数题解都是这个法二:权值线段树,我写的是这个,nlog1e9法三:离线+离散化+权值线段树,没什么好说的,nlogn法四:离线排序+链表,从后往前扫一遍即可,nlogn+n,常数比较小#include#include#define N 1000005#define inf 200000000using namespace s原创 2016-12-01 14:24:24 · 547 阅读 · 0 评论 -
bzoj3745: [Coci2015]Norma
这道题维护了一大堆前缀和,真是。。。。因为MOD又调了好久。。。。。考虑分治思想,对于l,r,mid可以枚举左端点,右端点在mid右侧的情况,利用单调性和前缀和达到O(nlogn)。细节看代码:(Pr开头的都是前缀和)#include#include#define N 500005#define ll long long#define MOD 1000000000using原创 2016-04-21 08:21:50 · 1545 阅读 · 0 评论 -
bzoj3462: DZY Loves Math II
第一眼看题没看懂。。后来发现pi可以等于pi+1。。。题目可化为给定S=p1+p2+...+pk,求p1*x1+p2*x2+..+pk*xk=n的方案数(x1,x2,x3,...>0)。因为S不妨把xi分为ai=xi/S,bi=xi%S。枚举m,p1*b1+p2*b2+...+pk*bk=n-m*S。这个可以用多重背包的方式预处理,剩下的可用插板法得到,时间复杂度O(sqrt(S)+S原创 2016-05-23 08:16:28 · 1615 阅读 · 0 评论 -
bzoj2959: 长跑
又看了一下LCT,复杂度还是不懂,怎么样均摊O(longn)???感觉一写残就退化了。。。于是回顾了一下板子,总算是过了。。原树上的父亲大概是没有记吧。。不知道为什么find改成这样会T。。TATint find(int x){ acc(x);splay(x); while(c[x][0])x=c[x][0]; return x;}#include#include#i原创 2016-05-27 15:50:35 · 864 阅读 · 0 评论 -
bzoj2523: [Ctsc2001]聪明的学生
原谅我逻辑能力差。。首先看到题目的提示:稍经分析和推理,你将得出以下结论:总是头上贴着最大的那个数的人最先猜出自己头上的数。然而怎么证?!对于A,如果B,C数字相同,他可以立刻得知它头上的是B+C。否则有两种可能:B+C或|B-C|。不妨设A>B>C,A=B+C,经过n次询问,A可以猜出。那么对于A,A+C,C,经过n+1次询问,B认为如果他是A-C,A应当在n次询问时得出答案,因原创 2016-04-08 11:58:17 · 1152 阅读 · 0 评论 -
bzoj2671: Calc
设k=gcd(a,b),a=x*k,b=y*k。 x*k+y*k=(x+y)*k整除x*y*k*k。 因为gcd(x,y)=1,gcd(x+y,x)=gcd(x+y,y)=1,所以x+y整除k。 Ans=∑⌊n√−1⌋y=1∑y−1x=1[gcd(x,y)=1]⌊ny∗(x+y)⌋\ Ans=\sum_{y=1}^{\left \lfloor \sqrt{n}-1 \right \rfloo原创 2016-03-15 15:19:28 · 718 阅读 · 0 评论 -
bzoj1411: [ZJOI2009]硬币游戏
一开始写的m^2暴力,写完了才发现n这道题百度上居然只有2个题解。。。膜完题解,这规律能找到也是厉害对于样例,进行数学归纳,发现2^k变换之后,第i个位置的硬币情况只与它左右的第k+1个硬币有关。如k=0,第3位硬币情况只与2和4位硬币有关。因为t可以拆成若干个2^k的和,于是对每个2^k进行O(n)的变换,总复杂度O(nlogt)。注意开long long。#in原创 2016-02-26 20:45:58 · 1704 阅读 · 1 评论 -
bzoj4238: 电压
依题意:对电阻X,若可以选择使X不流过电流,当且仅当所有奇环都包含X且所有偶环都不包含X。利用Dfs搜索树,如果点a搜到的边的端点b已经走过,说明点b为a的祖先,利用深度差可求得环上点的个数。#include#include#define N 100005#define M 400005using namespace std;int n,m,l=1,Ans,tot[2],原创 2016-03-25 18:11:13 · 639 阅读 · 0 评论