AtCoder
L_0_Forever_LF
一个热爱OI的OIer
展开
-
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 366 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 387 阅读 · 0 评论 -
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 阅读 · 0 评论 -
ARC 076
C 排列 D 按x排序后贪心建最小生成树E 我们将两个点都在边界的点对称为重要的点对,因为没有重复的点,所以只有重要的点对可以把矩形分成两部分 可以发现,只要重要的点对之间合法,所有点对就一定合法(先将不重要的点对连上再连重要的),从任意点出发顺时针(或逆时针)扫过去维护一个栈,若当前点属于第x个点对,栈顶不是x就把x放进去否则pop出栈顶,扫完看栈是不是空的code:#include<set原创 2017-10-16 21:20:53 · 319 阅读 · 0 评论 -
ARC 072
C 相邻前缀不相同就是没有0 只有+-+-+-和-+-+-+两种情况,枚举 每个位置加减会改变后面所有前缀和,所以这个位置只要修改到符合符号就行了D (打表)发现|X-Y|<=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 阅读 · 0 评论 -
AGC 012
A 贪心,最小的n个数肯定分在每个组用来垫,然后从小到大考虑,对于每个数肯定尽量让他成为某组最大的,这样后面比他大的数就有更多成为次大的,肯定比让他成为次大的更优,所以答案就是排序后第n+1,n+3,n+5…3n-1项的和B 倒着处理询问,变成每次将距离点v<=d的所有点中无色的点染色,对每个点记录v[x][d]表示离这个点距离<=d的点是否都被染色,复杂度O(nd)O(nd)code:#inc原创 2017-11-02 22:00:27 · 245 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
ARC 070
C 因为可以原地不动,所以二分找到最小的1+2+….k>=n的k,可以从1~k中去掉多出的,k就是答案D dp前缀和后缀和,用bitset优化转移 对于每个数O(n)判前后缀能不能凑出n-x~n-1的数E multiset删一个值会把这个值的全部都删掉,所以要用指针指后删指针。用f[i][x]表示前i个矩形合法,第i个矩形左端点在x的最小花费,有转移 f[i][x]=|x−li|+f[i−原创 2017-11-04 15:48:28 · 419 阅读 · 0 评论 -
ARC 085
E 最小割模板题不会做系列。 其实问题就是每个数选择保留或者不保留各有一个花费,然后有nlogn个关系形如:如果i不保留,j也一定不能保留 正数的和为总价值,减去最小割就是答案code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctim原创 2017-11-16 16:33:04 · 305 阅读 · 0 评论 -
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 阅读 · 0 评论 -
AGC 011
A 单调队列贪心B 贪心,排序后找最大的i,使得sum[i]*2< a[i+1]C 用n个点代表行,n个点代表列,对于边(x,y),在行列的x,y之间连边 对于行的每个联通块分开算,对于行的一个联通块,先算其中孤立的点,然后对于列的某个联通块: 手玩后发现如果这个联通块有奇环,在这个行的联通块里就会只有1个联通块,否则会有两个(二分图,分成S,T两个集合,A为行,B为列 the two c原创 2017-11-07 17:05:08 · 349 阅读 · 0 评论 -
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 阅读 · 0 评论 -
ARC081 F - Flip and Rectangles
观察一个2*2的小矩形,发现不管对他的行列怎么翻转,黑白色块的奇偶性不变 所以一个黑色块数量为奇数的2*2小矩形不可能被弄成同色 所以如果一个矩形含这样的小矩形,它不可能被弄成同色 反之,由于奇偶性不变,对于一个不含这样小矩形的矩形,它一定能被弄成同色,我们可以构造,过程如下 将这个矩形的第一行和第一列(除去(1,1))弄成黑色 如果(1,1)当前不是黑色,将第一行翻转,再把第2~n列翻过原创 2017-10-08 11:14:40 · 389 阅读 · 0 评论 -
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 · 513 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 314 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 305 阅读 · 0 评论 -
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 · 285 阅读 · 0 评论 -
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 阅读 · 0 评论 -
AGC 015
A 求一下最后和的范围l~r,之间的数都可取到 B 每层楼,如果是往上走的,他到下面的楼层都一定至少2次,到上面的1次,往下走的同理C 每个联通块两两之间只有一条路径,所以每个联通块是树的结构,n块由n-1条邻边连接 那么每条两边都是黑色块的邻边,能且一定能合并两个联通块,减少1个联通块,给定矩形内的黑色联通块数量就是黑色块的数量减去连边都是黑色块的邻边数量code:#include<se原创 2017-10-19 15:06:08 · 348 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 681 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
AGC002 F - Leftmost Ball
问题相当于计算有n个颜色0的球,其他n-1种颜色各有m-1个球,一个合法的序列是任意一个前缀中颜色0的球的数量>其他颜色的颜色数量为了方便计数,我们不妨把每个颜色为0的球和一个颜色捆绑,即对于序列中(除了颜色0)出现的第i种颜色,我们将它捆绑到第i个颜色为0的球身上然后可以设出一个dp,f[i][j][k]代表放了i个球,已经放了j个颜色为0的球,其他颜色已经出现了k种的方案数 状...原创 2018-04-17 20:57:33 · 283 阅读 · 0 评论