自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 uoj#46. 【清华集训2014】玄学

难得的1A。。。今天上午 Lych大讲了归并,分块,推和可并推,马上练了这题。题意很简单对于一个数列有操作使x~y区间内的数*a+b,多次询问有x~y操作时z的值(对m取模),很显然*a+b的操作满足结合律且多次*a+b可合并为一个*c+d,不满足区间减法(m不为质数)。对于询问一段操作,可以考虑对时间建线段树,l~r的时间内对数列的修改是O(r-l)段,于是归并,然后就好了。。。

2016-07-06 16:40:31 914

原创 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 821

原创 bzoj4379: [POI2015]Modernizacja autostrady

好长啊题目。。。大概就是把一棵树分成两棵再拼成一棵后的最大最小直径。应该可以想到树形DP,保存每个节点为根的子树的直径和出去该子树后的直径。为此我们需要维护每个节点向下的前三长的链(每个儿子只记一次),向上最长的链,儿子中前二长的直径,然后可以求出在哪里断开。最后把两棵树的直径找粗来,并起来即可。说起来好像很简单,然而我做了一周。。真是太弱了。。。代码比较丑2333#inclu

2016-06-21 15:42:49 785

原创 uoj#58. 【WC2013】糖果公园

寒假里lbn大爷讲离线算法时就讲过了。。。然而现在才明白该怎么做。这题就是树上带修莫队,带修莫队就是再加一维时间,然后分块size=n^(2/3),时间复杂度O(n^1.67)。树上莫队可以先求出括号序列,若x为y祖先,则两点间的路径为l[x]~l[y],否则就是r[x]~l[y]+lca。没了。。#include#include#include#include#include#

2016-06-13 12:35:34 1035

原创 bzoj2333: [SCOI2011]棘手的操作

学习了可并堆,感觉不难,写起来比二叉堆都容易,但是不好理解。。。这道题好像可并堆会被卡,但是还是练习一下吧。。这题就是要实现一些可并堆,用一个大堆储存可并堆顶的值,左偏树或斜对就可以做啦~\(≧▽≦)/~//DEVc++编码方式真是神奇#include#include#define N 300005using namespace std;int n,Q,x,y,ALL,ro

2016-06-11 07:57:27 613

原创 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 888

原创 bzoj2960: 跨平面

题意:给定平面图,球队呕吐的最小树形图。平面转对偶可以将每条边分成两条,然后暴力找一圈。最小树形图使用朱刘算法,然而我也不太懂。。#include#include#include#include#include#define N 3005#define M 30005#define ll long longusing namespace std;int n,m,st[

2016-05-30 12:44:42 742 2

原创 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 809

原创 bzoj2958: 序列染色

一眼想到是DP,然而不会。用DP[i][j][k]表示第i位为k,状态为j的方案数,O(1)转移即可。Orz lych#include#include#define N 1000005#define P 1000000007using namespace std;int n,k,dp[N][3][2],W[N],B[N],t;char c[N];int Mo(int x,int

2016-05-26 15:52:43 787

原创 bzoj2957: 楼房重建

容易想到把楼房高度转化为斜率,然后就是求x1,x2,x3...使x1#include#include#define N 100005using namespace std;int n,m,x,y,see[N*4];double Max[N*4];int Get(int k,int l,int r,double x){ if (l==r) return Max[k]>x; in

2016-05-26 15:49:09 565

原创 bzoj2956: 模积和

显然分块搞搞。。原式=(Σn%i)*(Σm%i)-Σ(n%i)*(m%i)其中Σ(n%i)*(m%i)=Σn*m-i*(n/i*m+m/i*n)+i*i*(n/i)*(m/i),分块搞搞即可,时间复杂度O(sqrt(n))。#include#include#define ll long long#define MO 19940417#define si 3323403usin

2016-05-26 15:45:45 722

原创 bzoj4569: [Scoi2016]萌萌哒

一个简单的想法是对每一位用并查集,但是显然会TLE,因为同样的位可以被合并多次。考虑ST表的思路,维护logn个并查集,暴力修改。如果上一层已合并,就不用到下层了,这样最多合并nlogn次,时间复杂度正常。#include#include#include#define N 100005#define MO 1000000007using namespace std;int

2016-05-25 09:57:09 580

原创 bzoj4568: [Scoi2016]幸运数字

一句话题意:树上两点间路径子集最大异或和。看了一下线性基发现好强,但我也不太会,先贴代码吧。。#include#include#include#define N 20005#define M 200005#define Mlg 6000005#define ll long longusing namespace std;bool ok[N<<1];int n,m,x,y,

2016-05-24 15:09:43 1154

原创 bzoj4567: [Scoi2016]背单词

题目意思有点难懂,给定n个单词,找到一种排列使代价最小。在x处的一个单词的代价为:1.有一个单词是它的后缀且在它后面n*n,2. 没有单词是它的后缀且在它后面x-前一个是它的后缀的单词的位置(如没有即为零)。很显然可以倒着暴力构造一棵tire,由于1的代价太大,考虑不存在1。即每个后缀填完后才能填自己,同时填完一个单词的子树的最小代价是固定的,只要合理安排儿子的遍历顺序即可。显然应dfs先遍历

2016-05-24 06:59:59 1024

原创 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 1530

原创 bzoj3309: DZY Loves Math

这显然要用莫比乌斯反演:∑i=1a∑j=1bf(gcd(i,j))\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j)) =∑df(d)∑i=1⌊ad⌋∑j=1⌊bd⌋[gcd(i,j)=1]=\sum_{d}f(d)\sum_{i=1}^{\left \lfloor \frac{a}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor

2016-05-20 14:37:38 673

原创 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 732

原创 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 1232

原创 bzoj3573: [Hnoi2014]米特运输

看懂了题目就A了一半。。。大意是这样的,给一棵以1为根的树,求最少修改几个点的容量后,使得除根节点外所有节点为父亲容量/父亲的儿子个数。因为1个节点确定,所有节点都确定了,不妨对每个点求出它不修改时根节点的容量,Hash一下就可以了。(貌似自然溢出会WA,可能我写炸了吧)#include#include#include#define ll long long#define N

2016-05-17 07:33:29 676

原创 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 470

原创 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 553

原创 bzoj4584: [Apio2016]赛艇

根据题意可想到离散化后dp:dp[i][j][k]表示前i个数在区间j内放k个的方案数,开滚动复杂度O(n^3)。然而被bzoj卡常。。。(约1.8s)优化之后变得更慢了。。看了AC代码,发现可以换种思路:#include#include#include#include#define N 505#define ll long long#define MO 1000000007

2016-05-13 18:28:01 1371

原创 bzoj4520: [Cqoi2016]K远点对

KD-tree裸题切切,人生有什么希望找最远点对只要记录最大值,同样,找k远点对只要维护当前前k大值,每次和第k大比较即可。//听说加const会变快?@lych_cys#include#include#include#include#define ll long long#define N 100005#define inf 1000000000using namesp

2016-05-13 06:56:41 847

原创 bzoj4066: 简单题

这是一道KD-tree裸题,空间20M。KD-tree插入点可能会导致树不平衡,使层数过高TLE,因此可以使用替罪羊树暴力重构的思想,同时由于查询较慢,平衡因子可适当减小,具体见代码。另外还有一种每插入若干点暴力重构全树的方法,但好像有点慢?#include#include#include#define N 200005#define B 0.63using namespace

2016-05-12 19:57:17 543

原创 bzoj1941: [Sdoi2010]Hide and Seek

KD-tree!!!终于开始写KD-tree了。。(太弱了。。)KD-tree支持建树、插入一个点均摊O(logn)(替罪羊树实现)、查询距某点k近点O(sqrt(n))。本题只要建树后对每个点求最近点和最远点即可,O(n sqrt(n)+n logn)。(两个qry占了大部分行数。。)#include#include#include#define inf 1000000000

2016-05-12 15:30:53 741

原创 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 1458

原创 bzoj4318: OSU!

期望DP#include#includeusing namespace std;int n;double x,a,b,c;int main(){ scanf("%d",&n); while (--n) { scanf("%lf",&x); c+=((a+b)*3+1)*x; b=(b+a*2+1)*x; a=(a+1)*x; } printf("%.1f\

2016-04-18 09:32:12 417

原创 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 390

原创 bzoj4454: C Language Practice

此题卡常卡空间。。有一种O(n)-O(1)的Gcd:对于一个数n,它可以分解成a*b*c,(a,b,c为质数或小于sqrt(n)),证明略。然后预处理1~n每个数的分解方式和0~sqrt(n)两两的Gcd,询问即可O(1)。真是慢的飞起。。#include#include#include#define N 1005#define S 1000using namespace

2016-04-14 20:18:25 655

原创 bzoj1187: [HNOI2007]神奇游乐园

这是一道插头DP。。。不会的可以看一下《基于连通性状态压缩的动态规划问题》ppt然后就是裸题了?预处理出所有合法的状态,以及每种状态的每个插头匹配的位置,DP时间复杂度O(2^m*n*m)。分9种情况写的也是乱的。。#include#include#include#define inf 1e9using namespace std;int n,m,a,tot,dp[2][

2016-04-14 10:30:58 710

原创 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 1093

原创 bzoj1927: [Sdoi2010]星际竞速

费用流建图。因为从小往大连边,所以不会出现环。因为所有点都要经过,所以可以考虑它从那个点拓展而来。拆点,从源点向出点连容量1,费用为定位时间的边,向入点连容量为1,费用为0的边,从出边向汇点连容量为1,费用为0的边,对于x-->y,从x的入点向y的出点连容量为1,费用为时间的边。这样可以保证最大流的每个点都使用且最多拓展出一个点。然后最小费用流(窝太弱,只会SPFA。。#inclu

2016-04-07 16:10:14 1165

原创 bzoj1926: [Sdoi2010]粟粟的书架

AC:100题这是一道2合一水题。。。看数据范围:对于 50%的数据,满足 R, C≤200,M≤200,000 另有 50%的数据,满足 R=1,C≤500,000,M≤20,000所以对于50%的数据用a[i][j][k]表示比k大的数的个数,b[i][j][k]表示比k大的数的和。O(1000*RC)预处理+O(log 1000)询问水过。另50%的数据考虑主席树,v

2016-04-07 15:57:37 1099

原创 主席树(可持久化线段树)

我真弱。。。连主席树都不会。。。主席树相当于多个线段树,由于相邻两棵线段树的节点的值只有少许不同,因此可以对于和前一棵树一样的子树一个指针指过去,无需操作,这样每棵树O(logn),总复杂度O(nlogn)。以下是区间K大代码:#include#include#include#define N 100005#define M 4000000using namespace st

2016-04-01 20:43:44 661

原创 bzoj4402: Claris的剑

第一眼——DP,然而本质不同。。。若每种剑只取字典序最小的,可表示为:1 +  若干个(2 1)+ 2 + 若干个(3 2)+3 +……+k (+k-1)然后,设剑最大宽度为k,必有序列1……2……3…………k…用组合数将剩下的“锯齿”放入“盒子”,加一个“不作为剑的部分盒子”。然后线性求n!逆元,然后就没有然后了。#include #include#define ll lon

2016-03-28 19:54:26 708

原创 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 556

原创 bzoj3240: [Noi2013]矩阵游戏

看题目名:矩阵乘法。。。有公式:x^a=x^(a%phi(p)+phi(p)) (mod p)因为np,mp互质,可令n=n%phi(p),m=m%(phi(p)).同一行内可构造矩阵A,设F[i][1]*A'=F[i][m]。行末到下一行首可构造矩阵B,F[i][1]*B'=F[i+1][1]。可求得Ans。#include#include#include

2016-03-19 16:45:58 668

原创 bzoj2152: 聪聪可可

这题显然点分治DP?我不会告诉你我还不会点分治)先O(n)求Dfs序,然后倒序dp[i][j]表示i及i的子树中的点到i距离%3为j的方案数。最后对每个点,O(1)计算经过它的路径为3的倍数的方案数,得到Ans。求Ans与n*n的Gcd,约分即可。//一开始写的有点乱,只好各种*2+n 。。。#include #include#define N 80000using name

2016-03-19 16:44:10 443

原创 bzoj4037: [HAOI2015]Str

#include#include#include#define mo 998244353#define ll long longusing namespace std;int n,m,s[1005];char c[1005];struct Matrix{ll M[7][7];}X,k[15][1005],dp[1005],t;Matrix operator*(Matrix a,Ma

2016-03-18 17:00:58 725

原创 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 615

空空如也

空空如也

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

TA关注的人

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