自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

L_0_Forever_LF的专栏

曾是一个OIer

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

原创 SRM550

A 模拟 B 观察性质,发现每次放子,是在上一个人的基础上走2步,所以横纵坐标和的奇偶性始终不变 且根据(x+y)/2的奇偶性可以判断如果这个位置有棋子,这个棋子是谁放的 而且因为只有可能放在(x,y)的(x+1,y+1)和(x+2,y),所以有子的格子也满足x>=y 在这个基础上,观察能放子的格子(x,y)还满足什么性质: (x-1,y-1)和(x-2,y)中有且仅有1个格子有棋子,

2017-10-31 21:01:34 449

原创 SRM 549

A 看不懂..B 事实上由于wizard可以调换硬币,所以你拿到的k个硬币一定是最小的k个硬币,将硬币排序后相当于求最多能拿多少枚硬币 发现n很小,可以状压,用0表示这个帽子还未翻开,1表示这个帽子翻开了有硬币,2表示翻开了没硬币。 先2^n预处理出所有合法的放硬币情况,再把翻开了的,没翻开的帽子加进去处理出所有合法的三进制状态,转移时先手枚举取哪一个帽子,对取所有帽子的情况取max,对于取

2017-10-31 20:56:41 400

原创 NOI2017 部分题解

D1T1 模拟一个很大的二进制加减法 压位线段树,每个位置压二进制的30位,每次修改涉及1~2个位置,分别修改 对于一个位置i +/-,至多产生1个进/退位,相当于在i+1~inf +/- 1,找到>=i的位置中最小的非1/0位,中间的全部改0/1,这一位+/-1code:#include<set>#include<map>#include<deque>#include<queue>#

2017-10-30 21:41:14 1292

原创 ARC 071

C 每个串每个字符弄一下 D 列出每个小矩形贡献的柿子,化简后发现对x,y分别求和后可以O(1)求解E 每次变换对于A-B一定改变3,(感受一下)若两串A-B的差是3的倍数则可以互相变换code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#includ

2017-10-26 20:16:04 307

原创 AGC 013

A dp B 以1号点为开头任意走走到不能走,再把路径倒过来以1号点为结尾开始再遍历到不能走C 每个蚂蚁编号,相遇时掉头相当于继续走但是交换编号,每个蚂蚁最后的位置是可以知道的,因为编号的相对顺序是不会改变的,所以只要知道1号是哪个蚂蚁就能知道所有的编号在哪里 发现每有1只蚂蚁从l-1顺时针走到0,1号的位置就+1,从0走到l-1,1号的位置就-1 code:#include<set>

2017-10-26 16:22:14 527

原创 ARC 072

C 相邻前缀不相同就是没有0 只有+-+-+-和-+-+-+两种情况,枚举 每个位置加减会改变后面所有前缀和,所以这个位置只要修改到符合符号就行了D (打表)发现|X-Y|&lt;=1时先手必败E 记从1开始走到i时刻前距离终点di,发现witch就是把di+1变成0~di的一个数 维护一个最大的now表示i这个时刻后,距离终点0~now都一定能到达终点,i=n时now=0,然...

2017-10-25 14:49:22 338

原创 ARC 073

C 模拟D 注意到w1<=wi<=w1+3 当w1<=300时,直接做背包 当w1>300时,我们就算每次都取最小的w,最多比每次取最大的w多取一个物品,那么我们可以枚举能取到的物品总数,把w1这个基数减掉,重量变成0~3,做背包 (好吧直接枚举比这样优美很多E 将所有球拿出来按权排序,将一组球(x,y)(x< y)视为一个线段x-y 那么一个集合至少要包含每个线段的一个端点且不能两个

2017-10-24 21:45:49 386

原创 AGC 014

A 发现当三个数都一样时答案是无穷,否则直接模拟就好了,步数不会太多(可以证明最多log次)B 模型转化,在mod 2意义下,x到y+1,和 根到x+1根到y+1是等效的,所以每个点出现次数都是偶数则有解,否则某些点的父边会是奇数,无解C 一开始走完k步后,可以开k步走k步,相当于图中没有障碍了,所以bfs一下一开始k步能到哪些点,然后枚举这些点看他们至少操作多少次到达边界D 当最终的树上有

2017-10-24 11:49:20 319

原创 CODE FESTIVAL 2017 qual C

A 枚举 B dp C 因为可以添加x,所以我们可以忽略原串中的x,若剩下的串不回文则不合法,否则可以知道最终的回文串的中心是哪个字符,从两边向中间枚举非x的字符,添加x使他们的位置对应code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#inclu

2017-10-24 08:36:27 365

原创 SRM 548

A 二分加贪心 code:class KingdomAndTrees { public: int n; bool judge(const int x,vector<int>heights) { int las=0; for(int i=0;i<n;i++) { int now=heights

2017-10-23 11:47:44 338

原创 SRM500

A 最大概率输的一定是最多人投的那个,模拟code: …好像被我自己不小心删掉了…….B 看不懂aC 枚举2,4,8,9的个数后可以知道所有数的个数,预处理1+10+100+..1000..的和后直接算贡献code:class ProductAndSum { public: ll s[maxn]; int u2,u3,u5,u7,u; ll pw(ll x,in

2017-10-20 14:29:39 360

原创 ARC 074

感觉这场ARC的题目挺适合中国选手…所以好像很多人AK..D 用堆预处理出1~i,i~3N保留N个数的最小和最大和 枚举剩下的2N个数的第N个数E f[r][g][b]表示r,g,b为三种颜色最后出现的位置,i=max(r,g,b),1~i以内的限制都满足,1~i的填色数code:#include<set>#include<map>#include<deque>#include<queu

2017-10-19 21:03:24 296

原创 BZOJ1566: [NOI2009]管道取珠

拆平方,问题转化成A,B相同的取出序列有序对(A,B)有多少种 f[i][j][k]表示一共取了i个,A在上方取了j个,B在上方取了k个,A=B的方案数code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bi

2017-10-19 16:47:14 298

原创 BZOJ1449: [JSOI2009]球队收益

列出一个收益的柿子,拆边跑费用流

2017-10-19 16:17:46 222

原创 BZOJ1194: [HNOI2006]潘多拉的盒子

先判互相的包含关系,因为n<=50,直接bfs,(x,y)表示在A上走到x,B上走到y,若走到的x是输出源而y不是则B不包含y 判完包含关系后缩环拓扑序dpcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<

2017-10-19 16:03:16 352

原创 BZOJ1304: [CQOI2009]叶子的染色

可以证明根向任意方向移动一格,答案不变,所以根取哪个点都行 然后treedpcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector

2017-10-19 15:21:27 343

原创 AGC 015

A 求一下最后和的范围l~r,之间的数都可取到 B 每层楼,如果是往上走的,他到下面的楼层都一定至少2次,到上面的1次,往下走的同理C 每个联通块两两之间只有一条路径,所以每个联通块是树的结构,n块由n-1条邻边连接 那么每条两边都是黑色块的邻边,能且一定能合并两个联通块,减少1个联通块,给定矩形内的黑色联通块数量就是黑色块的数量减去连边都是黑色块的邻边数量code:#include<se

2017-10-19 15:06:08 347

原创 BZOJ4032: [HEOI2015]最短不公共子串

建出A串B串的SAM第一个询问可以直接暴力在SAM上跑所有子串.. 第二个询问…好像也可以暴力跑所有子串.. 第三个询问,用状态(i,j,t)表示当前在A串的i位置,B串SAM的j节点,子序列长度为t,每次枚举26个字母转移,把新状态塞进堆里 第四个询问,f[i][j]表示当前子序列结尾在A串是i,B串是j,最短长度code:#include<set>#include<map>#inclu

2017-10-18 22:17:28 409

原创 ARC 075

C 01背包 D 每次攻击,相当于对全体造成B的伤害,选一个怪兽造成A-B的伤害,二分次数x (二分的上界不要定高了不然会爆longlongQWQE 让b[i]=a[i]-k,相当于问b有多少个连续子序列和>=0 (1:枚举右端点,维护每个左端点的答案,可以手写splay每次看<=一个数的左端点有多少个 或 离线树状数组 (2:也可以维护b的前缀和转为二维偏序)code:#includ

2017-10-18 11:09:10 283

原创 BZOJ2119: 股市的预测

找有多少个形如ABA的串,B的长度给定 可枚举A的长度L,按L分块,每块内确立一个位置为关键点,那么两端的A都会覆盖且仅覆盖一个关键点 枚举左端被覆盖的关键点i,右端相对应匹配的位置是j=i+L+m,i和j向左,向右分别匹配最长公共后缀和前缀l、r(和L取min防止覆盖其他关键点造成重复) 建立正反串的SA,rmq求l、r,若l+r>=L,则l+r-L+1就是这两点的贡献code:#inclu

2017-10-18 07:16:26 386

原创 AGC 016

A 枚举最后整个串是哪个字符,O(n)扫一遍找至少需要操作多少次code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#in

2017-10-17 21:49:30 312

原创 ARC 076

C 排列 D 按x排序后贪心建最小生成树E 我们将两个点都在边界的点对称为重要的点对,因为没有重复的点,所以只有重要的点对可以把矩形分成两部分 可以发现,只要重要的点对之间合法,所有点对就一定合法(先将不重要的点对连上再连重要的),从任意点出发顺时针(或逆时针)扫过去维护一个栈,若当前点属于第x个点对,栈顶不是x就把x放进去否则pop出栈顶,扫完看栈是不是空的code:#include<set

2017-10-16 21:20:53 319

原创 ARC 077

C 模拟 D 只有2个数是相同的,假设他们的位置是u,v,对于长度k的子序列,重复的情况有Ck−1u−1+n−vC_{u-1+n-v}^{k-1}种,减掉E 考虑把值定为i对n-1次变化花费的减少量之和 对于一次变化l->r, 若l< r,当i∈(l+1,r),能减少i-(l+1)的花费; 若l>r,当i∈(l+1,m)时,能减少i-(l+1)的花费, 当i∈(1,r)时,能减少m-

2017-10-16 21:03:52 321

原创 AGC 017

A dpcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdli

2017-10-14 11:29:59 640

原创 ARC078

C、D略E 玩交互,中途发现看错2次题意…. 这种猜数的交互一般都要二分,所以需要利用他的Y和N二分 先用1e9判N是不是10的若干次方,再用10^k询问找到N的位数,接着可以逐位二分了 注意确定到最后一位的时候要在后面加个0,否则不管最后一位填0~9,答案都会是Y(手测都没发现这个…结果交上去一直不过样例…code:#include<set>#include<map>#include<

2017-10-12 10:58:03 326

原创 AGC 018

A 发现组合出的数一定比最大的ai小,且一定是gcd的倍数(可以构造出gcd)code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vecto

2017-10-11 16:11:47 312

原创 ARC079

C 略D 发现对n个数全部操作一次后所有数会-1 尝试构造一组n=50的解, 当K<50时,令a[50-k+1]~a[50]=50,a[1]~a[50-k]=50-k-1,这样操作完k次后所有数都符合要求且a[1]~a[50-k]=50-1, 若K>=50,让所有a加上K/50,这样构造的方法能使得我们一定对n个数全部操作50/K次,然后就变成了K<50的情况code:#include<se

2017-10-10 08:37:38 304

原创 CODE FESTIVAL 2017 qual B

AB省略C - 3 Steps 若u可以走3条边到v,则可以连边(u,v),发现就是将(u,v)间的距离由3变成1,同时所有经过u,v的路径长度减少了2,但奇偶性都没有改变,可以推得,最后u将会和所有它能走奇数距离到达的点连边 如果原图有奇环,u能够通过奇环调整,使得它与所有点连边 如果不存在奇环即是一个二分图,不同颜色的点对之间都会有边code:#include#incl

2017-10-09 19:29:27 403

原创 ARC080 F - Prime Flip

发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变 我们定义bi为ai和ai-1的正反关系,即ai=ai-1时bi=0,否则bi=1,每次取反l~r,b[l]和b[r+1]会发生改变 容易发现b[i]=1的位置一定是偶数个,我们将他们取出来 因为每次取反一定会改变两个b[i],所以我们将这些位置两两配对消去 两个位置i,j,有三种配对 |i-j|是奇素数,可以直接消去,最少花费1

2017-10-08 11:42:43 481

原创 ARC080 E - Young Maids

要求串q的字典序最小,那我们倒着,考虑最后插入q开头的字符在p串中的位置x,y(x< y),发现x一定是奇数下标的最小值,y一定是x之后,偶数下标最小值 同时这次操作后,会将区间分为(l,x-1),(x+1,y-1),(y+1,r) 维护个堆,每次取出第一位最小的,将它分裂,找分裂区间的最小值再塞进去 找最小值可以线段树或rmq 注意当操作区间(l,r)的左端点l是偶数时,上文的奇偶会取反c

2017-10-08 11:30:22 511

原创 ARC081 F - Flip and Rectangles

观察一个2*2的小矩形,发现不管对他的行列怎么翻转,黑白色块的奇偶性不变 所以一个黑色块数量为奇数的2*2小矩形不可能被弄成同色 所以如果一个矩形含这样的小矩形,它不可能被弄成同色 反之,由于奇偶性不变,对于一个不含这样小矩形的矩形,它一定能被弄成同色,我们可以构造,过程如下 将这个矩形的第一行和第一列(除去(1,1))弄成黑色 如果(1,1)当前不是黑色,将第一行翻转,再把第2~n列翻过

2017-10-08 11:14:40 389

原创 ARC081 E - Don't Be a Subsequence

找一个最短的串使得它不是原串的子序列,在最短的前提下字典序最小前面的想到了然而在字典序最小卡了半天yy了各种神奇操作….一脸zz考虑一个串B匹配原串A子序列的过程,在原串中找B[1]第一次出现位置,然后在这个位置之后找B[2]第一次出现位置,在之后….. 于是发现匹配到A串的第i个位置可以作为一个B串的状态,且无后效性,于是可以用f[i]代表匹配到A串的第i个位置,B串的最短长度,nex[now]

2017-10-08 10:52:25 386

原创 AGC 019

A 贪心搞一下就行了吧B 如果翻转的一段串i~j,有s[i]=s[j](两端相等,那么他翻转的效果和i+1~j-1是一样的,所以我们只对s[i]≠s[j]的段i~j翻转,手玩一下发现翻转的结果一定是互不相同的,所以就统计一下有多少对(i,j)满足i< j且s[j]≠s[j],加上原串就是答案 code:#include<set>#include<map>#include<deque>#i

2017-10-06 21:07:10 284

原创 ARC082 F - Sandglass

线段树维护每个开始的a,在当前时刻A沙漏内沙子数量 沙漏倒过来的时候就区间+/-,减操作的话,对0取max,加操作就对X取min 动态开点,打一个区间覆盖标记一个区间加标记code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>

2017-10-03 22:15:52 680

原创 ARC082 E - ConvexScore

对于图中的每个凸包,计算2n−|S|2^{n-|S|} 令集合T=N-S 发现要计算的东西就是T的子集数 设U是T的子集 就是计算(S,U)这个东西的数量 这时我们发现,S∪U这个东西…好像是互不相同的 所以转化为计算不同的S∪U的数量 这个就是全集的有面积的子集 2n2^n去掉共线和空集就行了code:#include<set>#include<map>#include<deq

2017-10-03 22:11:52 449

原创 ARC 083E - Bichrome Tree

每个点是什么颜色其实无所谓,我们关心的是他和他的孩子之间的颜色关系 对于一个点x,他的子树内和他相同颜色的点权的和已经固定了是w[x],此时和他不同颜色的点权和肯定是越小越好的,令f[x]表示这个最小值 就可以dp了,对于x的每个孩子枚举它和x的颜色关系,对他们做一个dp就可以求出f[x]code:#include<set>#include<map>#include<deque>#incl

2017-10-02 21:20:32 906

原创 BZOJ4386: [POI2015]Wycieczki

答案可能爆longlong,矩乘的时候<0直接返回边权只有3种,可以考虑拆点,使新图中只有边权为1的边 新建一个源S连向每个点,就可以求出路径长度为x-1的路径数量,连一条S->S的自环就可以求出<=x-1的数量,然后矩乘,a[x][y]表示x到y的长度<2^k的路径数量(注意去掉长度为0的路径 求答案本来要二分,但可以处理出矩阵的2^0,2^1,2^2..2^k次从高位向低位找有没有k种路径,

2017-10-02 10:31:01 360

原创 BZOJ4385: [POI2015]Wilcze doły

删的数肯定越多越好,所以可以删的区间有n个,枚举答案的右端点,维护一个单调队列,记录当前左端点到当前右端点里的可删区间的最大值,O(n)扫过去就行了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitse

2017-10-02 10:24:35 269

原创 BZOJ4384: [POI2015]Trzy wieże

可以先把只有一种字符的情况算出来 然后考虑没有任意两个字符数目相同的情况 考虑三种字母的前缀和x,y,z,然后差分 则当 X-x=Y-y Y-y=Z-z Z-z=X-x 这三个条件有一个满足时i+1~j的串不能贡献 移项得 (x-y,y-z,z-x)三元组 当三元互不相同时可以产生贡献 对第一维排序,树状数组以第二维为下标,维护前缀后缀的最大值,最大值的第三维,和最大值第三维不同

2017-10-01 11:57:33 350

原创 BZOJ4383: [POI2015]Pustynia

是个很裸的差分约束? 如果有限制x>y 可以连一条边x->y,-1 代表y<=x-1 即 x>y注意到k个数把区间划分成了k个区间,对于每个限制,新建一个点,k个特殊的数向其连边-1,它向k个区间连边0 线段树优化建图 建好图后如果不是DAG说明有负环,无解 否则是个DAG,令f[x]表示x最大能取到的值,dp f值 如果一个固定了值的位置,他的f值< 它的值,也无解code:#inc

2017-10-01 11:51:13 489

空空如也

空空如也

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

TA关注的人

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