自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不来也不去的一只失忆蝴蝶

曾迷途才怕追不上满街赶路人

  • 博客(836)
  • 收藏
  • 关注

原创 merge

题目大意将两个排列随意归并,求能得到多少本质不同的序列。DP直接转移会算重。 手玩+感受一下发现容斥系数是卡特兰数。 详见代码。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=2000

2017-08-20 15:01:05 358

原创 [bzoj4934]kangroo

题目大意有一个园子,里面有n个草丛排成一排,标号1~n,有一个袋鼠,从s出发,每次跳一步跳到一个其他的草丛,经过 每个草丛恰好一次,最终到达t。显然他会跳跃n-1次为了不被人类发现,袋鼠每次跳跃的方向必须与前一次不同, 具体地,如果他现在在now,他是从prev跳跃一次到达now的,然后他跳跃一次到达next,那么如果prev<nowprev<now,就必 须有now<nextnow<next

2017-08-17 22:28:15 970 1

原创 Sequence

题目大意有两个序列a和b。 每次询问将一个区间a值排名在[x,y]的中找一个b值第k小。做法用主席树将排名的x和y变成具体的值。 接下来可以根据b整体二分,其余部分可以拆区间+扫描线+数据结构完成。#pragma GCC optimize(2)#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)usi

2017-08-17 19:20:58 441

原创 Create

题目大意一个序列,有很多询问,每个询问要问区间>=x的数的个数。 现有若干修改操作,区间赋值,每次修改后请你将所有询问得到的答案和输出。颜色段均摊分析颜色段! 可以用set维护颜色段。 然后只需要考虑一个区间全部由x变成y产生代价。 先把询问按x排序做可持久化线段树,然后就很好做。#pragma GCC optimize(2)#include<cstdio>#include<algori

2017-08-17 19:16:09 495

原创 [bzoj4936]Match

题目大意给你一个小写字母字符串。 请构造一个合法括号序,使得匹配的括号在原串中字母相同。 要求字典序最小,且要求判断无解。暴力我们考虑如何判断无解。 你考虑一个栈,顺序扫这个字符串。 假如当前字符和栈顶字符相同消除栈顶字符,否则将这个字符加进栈中。 这可以得到一个合法解,且我们可以证明任意解可以变成这个合法解。 这就是无解判断。 字典序最小的暴力也很简单。一些性质我们设f(l,r)=0

2017-08-16 17:37:33 763 3

原创 神奇的玩具

题意一副无向图,第i条边连接ai和bi。现在你需要选择恰好k个点,对于第i条边,你必须让ai和bi至少一个被选择,如果ai被选择,付出pi的代价,否则付出qi的代价(pi<=qi),求最小代价。搜索可以发现pi是必然代价,qi-pi就是附加代价。 于是产不产生代价只与ai是否没有被选,这方便我们加上最优性剪枝。 一个不选会导致一堆必选。 判掉度数为0和自环,我们可以发现T(n)<=T(n-1)

2017-08-15 19:56:56 404

原创 区间第k小

题目大意给你一个序列元素均在[0,n)内,并给定常数w。 每次在线询问区间第k小,要求忽略区间出现次数>w的数。根号算法我们不妨考虑如何离线。 可以使用莫队+线段树做到 n根号n log n,非常菜鸡。 可以发现我们只有n次询问却有n根号n次插入删除,如果我们使用线段树是很亏的。 考虑经典套路即平衡复杂度: kth是有办法O(1)-O(√n)的,具体做法是维护值域分块,以及一个桶。 值域

2017-08-13 22:43:11 909

原创 决战

题目大意给你一个3*n网格图。 你有m个士兵,每个士兵会对3*3的范围内进行攻击,攻击矩阵初始给定。 有多少种放置士兵的方法,使得士兵互不攻击。DP很显然能dp 这个dp还很显然能NTT优化 但是常数大显然不一定跑得过暴力 于是我们就暴力吧(雾#pragma GCC optimize(2)#include<cstdio>#include<algorithm>#define fo(i,

2017-08-13 22:27:26 451

原创 质数

题目大意设f(i)表示i的不同质因子数量。 求∑ni=12f(i)\sum_{i=1}^n2^{f(i)} n<=10^12推式子我知道你可能会推出一个看起来是n5/6n^{5/6}实际是n2/3n^{2/3}的方法,但肯定还是不能过的,大概能跑10^11这个级别。 首先把式子变成 ∑ni=1∑d|i[(d,i/d)=1]\sum_{i=1}^n\sum_{d|i}[(d,i/d)=1]

2017-08-13 22:23:46 362

原创 NOI2017银色记

NOI前模拟赛总体做的还好吧。。状态还行。学军中学集训不得不说这里的训练和我们很不一样,而且机房安排和训练安排都有毒,每天过着不知所措的生活。 模拟赛都不错(有时会翻车) NOI前两天基本都在放松了,没咋做题。DAY 0晚上也不知道干啥就去找sqc颓东方。 然后回来被鄙视。 就睡觉了。DAY 1上午开幕式,校长讲话居然最有趣。 dzd一个D一个D挣亿。 下午鄙视,一样5min做完,和去年

2017-07-24 22:33:49 4105 10

原创 NOI2016铜色记

前言没错这确实是2017年7月写的……NOI前每场模拟赛基本都被学长们虐的死去活来,每场只改一题。 反正才初三随便浪。南山中学集训这里的题都好简单。 第一天全校写动态点分挂。 第二天我提前离场扬言AK最后FST。 信心赛! 期间有翻车,就是我买了省内流量下载this is war of mine然后扣了200元话费。。 轻松的颓废,死了两把twom,too difficult(一局我能玩

2017-07-24 21:45:19 1568 2

原创 排序列表

题目大意有若干个区间,C(m)表示所有包含m这个点的区间编号排序后的序列。 求本质不同的非空字典序第k小的序列。做法先离散化,因为本质不同不会超过2n个序列。 接下来顺序扫,并维护每个位置的hash值。 遇到之前出现过的hash值就叉掉。 然后接下来枚举按字典序枚举,每次看看往字典序末尾加入i会有多少种可能。 对于k,如果它不在答案序列中,不能选择它区间所包含的m。 对于k,如果它在答案

2017-07-11 14:23:06 422

原创 装箱

题目大意n个箱子,每个都有三个属性(a,b,c),可以任意调换属性顺序。 一段区间的价值定义为任意调换后max(a)*max(b)*max(c)的最小值。 求所有区间价值和。结论把所有箱子的三个属性按降序排列,一定最优。 考虑找到了全局最大值mx,把mx调到第一维,接下来第一维答案一定是mx,而其他箱子也一定会将自己的最大值调到第一维,第二维也同理。瞎做对三维维护单调栈。 维护线段树,位置l

2017-07-11 14:16:34 378

原创 [美团 CodeM 复赛]神秘代号

题目大意n个点n条边的联通无向图,每个点i有一个[0,p)的数xi,p是个质数。 每条边(u,v)都有一条方程形如a∗xu+b∗xv≡c(mod p)a*xu+b*xv\equiv c(mod\ p) 保证x有解且有唯一解,求出x。解方程假定一个位置的值是x,然后从这个位置bfs通过边上的方程用x表示出其余每个点的值。 因为一定有环所以可以在某条边上解方程得到x。#include<cstdio

2017-07-11 13:58:40 927

原创 [美团 CodeM 复赛]城市网络

题目描述有一个树状的城市网络(即 nnn 个城市由 n−1n-1n−1 条道路连接的连通图),首都为 111 号城市,每个城市售卖价值为 aia_ia​i​​ 的珠宝。你是一个珠宝商,现在安排有 qqq 次行程,每次行程为从 uuu 号城市前往 vvv 号城市(走最短路径),保证 vvv 在 uuu 前往首都的最短路径上。在每次行程开始时,你手上有价值为 ccc 的珠宝(每次行程可能不同),并且每经

2017-07-10 11:02:07 802

原创 [美团 CodeM 复赛]配对游戏

题目描述有 nnn 个人排成一排,一开始全部面向前方,然后随机朝左或是朝右转。然后我们不断审查这个队列,每次选择两个面对面的相邻的人,将他们从队列中取出。例如(> 表示向右,< 表示向左):队列 >>><<< 的消除过程为,>>><<< 到 >><< 到 >< 到空队列(每次去除一对)。队列 >><><<<> 的消除过程为,>><><<<> 到 >><<<> 到 ><<> 到 <>(每次去除一对)

2017-07-10 10:58:36 711

原创 小R打怪兽

题目描述推式子首先我们设Bi=max(A−Di,1)B_i=max(A-D_i,1) ∑mi=1∑Xj≤Hj≤Yj[∑nj=1[⌈HjBj⌉≤i]≥k]\sum_{i=1}^m\sum_{X_j\leq H_j \leq Y_j}[\sum_{j=1}^n[\lceil\frac{H_j}{B_j}\rceil\leq i]\geq k] 这让我们很不好搞,但是我们可以容斥,枚举若干个,然后要求

2017-07-10 10:32:17 390

原创 动物园

题目大意两个字符串a和b,从a中选取一个非空子串,从b中选取一个非空子串,然后拼起来变成回文串,求这个回文串最大长度。SAM先做一遍manacher处理出从某个串某个位置出发最长回文串。 先把b反过来。 然后你注意到这个回文串一定可以表示成c+S+c,其中S是一个回文串,然后c是a或b中选出的子串。 我的做法是把a和b一起丢去做广义SAM,然后计算每个节点是否同时出现在两个串中,并维护righ

2017-07-10 10:03:00 651

原创 [bzoj4173]数学

题目大意懒得写推导[n mod k+m mod k≥k]=[n−⌊nk⌋k+m−⌊mk⌋k>=k][n\ mod\ k+m\ mod\ k\geq k]=[n-\lfloor\frac{n}{k}\rfloor k+m-\lfloor\frac{m}{k}\rfloor k>=k] 于是等价于 [⌊n+mk⌋−⌊nk⌋−⌊mk⌋>=1][\lfloor\frac{n+m}{k}\rfloor-\

2017-07-10 09:52:47 416

原创 [bzoj4919]大根堆

题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。 你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i&gt;v_j。 请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树。解法(不)容易看出这是一个变种LIS。 如果只有一条链就...

2017-07-09 21:13:17 1590 2

原创 [bzoj3060]Tour de Byteotia

题目大意给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上。贪心把两边编号都>k的边先加入。 再把剩余的边加入,若形成环就删去新加边。 闭上眼睛感受当然最优。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int

2017-07-07 16:58:43 549

原创 流浪

题目描述DP考虑每个位置的贡献。 枚举一个位置,然后做dp,我们需要处理从(0,0)走k步到这个位置的方案数(中途不到达这个位置),以及从这个位置开始走k步到某个位置的方案数(中途不到达这个位置),以及从这个位置开始走k步中途不到达自己的方案数。 然后再做dp,从(0,0)走j步到达这个位置且中间恰好经过它k次的方案数。#pragma GCC optimize (2)#include<cstd

2017-07-07 16:56:11 361

原创 果树

题目大意问一棵树上有多少条路径不包含同色点。 一种颜色最多20个点。瞎做对于同色点提取出来两两形成一个约束。 这样约束只有n*20个。 因为最坏情况是每种颜色都出现20次。 那么n/20*20^2=n*20。 接下来变成了owaski的那道A,可以在本博客内搜索。#include<cstdio>#include<algorithm>#include<cmath>#define fo(

2017-07-07 16:52:36 375

原创 容器

题目描述DP用括号表示一段区间。 设f[i,j,k]表示做到第i个位置,目前未被匹配的左括号有j个,还有k只跳蚤没有左括号。 转移可以直接枚举这个位置放多少右括号以及下一个位置放多少左括号,乘上对应组合数。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i

2017-07-07 16:49:15 377

原创 Fiend

题目大意满足li<=pi<=ri的排列p,问逆序对是奇数的多还是逆序对是偶数的多或者是否一样多?解法可以构造一个矩阵,ai,li~ri是1,然后就是问它行列式的符号或判断行列式是否为0。 模拟高斯消元,每次消到第i行时,让第i行变成第i列上有1且r最小的,这样可以保证任意时刻1都是一段区间。 可以用可并堆、平衡树或线段树来快速支持合并。#include<cstdio>#include<algo

2017-07-07 16:43:43 564

原创 Fable

题目大意对一个序列做k轮冒泡排序,输出最终序列。做法尝试计算每一个数的位移。 计算一个数前进的位数t等于在它前面比它大的数个数与k取min。 同样前面最大的t个数都会后退一格。 于是splay模拟这个过程统计每个位置的位移即可。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(

2017-07-07 16:36:15 701

原创 容斥的原理及广义应用

容斥原理想起容斥原理,大家都不陌生。 相信很多地方都会举这样类似一个最简单的例子让大家理解容斥: 现在赛场上有n个人,都参加过WC、CTSC和APIO。 拿过至少一个比赛的金牌的有多少人? 我们可以简单计算拿过WC金牌的人数+拿过CTSC的金牌的人数+拿过APIO的金牌的人数。 但是这样会记重,比如jasonvictoryan,他既拿过WC的金牌又拿过APIO的金牌,又比如czllgzmz

2017-07-07 16:30:35 8354 3

原创 景中人

题目大意n个二维点。 用下边界贴着y=0的面积不超过S的矩阵,最少用多少个覆盖所有点?DP同样的x坐标只保留y最大的,然后对y离散化。 容易发现矩形之间只会有相含关系或相离关系,相交是没有意义的。 然后大力区间dp,f[i,j,k]表示[i,j]区间覆盖所有y坐标>k的最小矩形数。 随便转移。n^4。#include<cstdio>#include<algorithm>#define f

2017-07-01 17:26:50 577

原创 杨柳

题目描述费用流容易发现不能移到另一个棋子上这个限制无用。 然后随便费用流。#include<cstdio>#include<algorithm>#include<iostream>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=500+10,maxm=1000000+10,inf=10000000

2017-07-01 17:23:23 516

原创 呵呵

题目大意n个点,i和j之间有wi*wj条边。 图中任一生成树的贡献记为每个点的度数积。 求所有生成树贡献和。prufer序富榄题解#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;type

2017-07-01 17:20:50 307

原创 哈哈

题目大意DP容易发现满足那两个条件就是说不存在低谷。 设g[i,j,0/1]表示[i,j]是最后一次操作的,其中是递增还是递减的最大得分,由于相邻两项差1可以直接得到长度。 设f[i,j]表示操作掉[i,j]的最大得分,有两种转移。 f[i,j]=f[i,k]+f[k+1,j]f[i,j]=f[i,k]+f[k+1,j] f[i,j]=g[i,k,0]+g[k+1,j,1]+v[2∗w[k]

2017-07-01 17:07:32 348 1

原创 归并排序

题目大意给一个长度为2的次幂的排列做归并排序,在区间长度为2时比较器会变成随机返回值。 多次操作,每次要么交换两个位置,要么询问归并排序后第x个位置等于排序前第y个位置的概率。做法容易发现,如果x#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=

2017-06-28 20:57:30 449

原创 摧毁图状树

题目大意Q次询问,每次给一个k。 将树用尽量少的长度不超过k的祖先后代链覆盖,使得每个点至少覆盖一次。贪心对偶成选择尽量多的点,使得任意长度不超过k的祖先后代链上至多一个点被选择。 这样转化则贪心很显然。尽量选深度大的点。 如果有t个叶子,选取的点至多为t+(n-t)/k。 因为叶子一定会被选择,同样删去所有被选择的点后,每个联通块大小不会小于k(否则一定在原来的树中存在长度不超过k的祖先后

2017-06-28 19:24:21 716

原创 [bzoj4849]Mole Tunnels

题目描述鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃。一共有m只鼹鼠,第i只鼹鼠住在第pi个洞内,一天早晨,前k只 鼹鼠醒来了,而后n-k只鼹鼠均在睡觉,前k只鼹鼠就开始觅食,最终他们都会到达某一个洞,使得所有洞的ci均大 于等于该洞内醒着的鼹鼠个数,而且要求鼹鼠行动路径总长度最

2017-06-26 16:47:09 742

原创 [JZOJ100020]B

题目大意有多少n*n的01矩阵每行每列恰有2个1。推式子设a(n)表示答案。 每次新加一行一列,你找到一行,把最后一行和它换,并在最后一列这行的位置写上1。 然后再找一行,在最后一列这写1,并找到之前一个位置的1把它翻到只有一个1的那行。 这样是n*(n-1)*a(n-1)。 你发现有种情况翻不上去,于是你枚举哪里翻不上,然后去掉那两列,这样是n*(n-1)^2*a(n-2)。#includ

2017-06-26 16:43:33 409

原创 [JZOJ100019]A

题目大意求一颗树有多少条不同的路径,使得路径长度>1且不存在j!=k满足j是k倍数。瞎做有n log n个限制某两个点不能出现在一条路径中。 可以转化成某个区间的起点不能以某个区间为终点。 然后扫描线用线段树维护。 这个是既包含插入又包含删除的覆盖问题。 因为操作具体对称性所以可以标记可持久化。#include<cstdio>#include<algorithm>#include<cma

2017-06-26 16:08:40 436

原创 [hihocoder1527]快速乘法

题目描述在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数)。众所周知,计算机进行乘法运算是非常慢的,所以我们需要用一些加法、减法和左移的组合来实现乘一个常数这个操作。具体来讲, 我们要把 x × a 替换成:(x<<a0)op1(x<<a1)op2(x<<a2)...opn(x<<an)(x<<a0) op1 (x<<a1) op2 (x<<a2) ... opn (x<<an)

2017-06-26 15:58:32 812

原创 [hihocoder1526]序列的值

题目描述给定一个长度为 n 的序列 a[1..n],定义函数 f(b[1..m]) 的值为在 [0,m-1] 内满足如下条件的 i 的数目:b 中前 i 个数异或起来的值小于 b 中前 i +1个数异或起来的值。对于 a[1..n] 的每个子序列 b[1..m],求f(b[1..m])之和。做法显然只需要对每个位置i求出前面多少子序列异或和比再异或它之后小即可,后面部分乘一个2的次幂。 假如a<b

2017-06-26 15:48:20 594

原创 [51nod1355]斐波那契的最小公倍数

题目大意求n个斐波那契数的最小公倍数。做法首先斐波那契数列有性质(fn,fm)=f(n,m)(f_n,f_m)=f_{(n,m)} 具体证明不证了,烂大街的性质了。 构造数列g满足 fn=Πd|ngdf_n=\Pi_{d|n}g_d 可以用莫比乌斯反演求出g gn=Πd|nfμ(nd)dg_n=\Pi_{d|n}f_d^{\mu(\frac{n}{d})} 接下来我们知道求lcm可以转化

2017-06-25 22:33:29 1051

原创 回转寿司

题目描述分块你考虑有一堆人,价格为x的进去了出来会变成啥样。 那么肯定是找到这堆人所持价格的最大值y,如果x>y,出来的还是y,否则x会变成某个人手里的,然后出来的是y。 我们考虑分块,每个块维护一个数堆。 如果x要经过一个块,可以丢进数堆,再取出一个最大值。然后还要给这个块打上一个标记。 但是对于零散的不是很好做,即重构块,我们如何快速得到每个位置经过一系列标记后的值? 注意这个问题具有

2017-06-25 20:44:18 639

空空如也

空空如也

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

TA关注的人

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