codeforces/atcoder乱搞记录+杂题记录

打算如果有空的话就开两个CF的题玩一下
或者atc,或者牛客,或者???
并不保证都有代码。。也就是部分可能是口胡
尽量保证口胡的题都是可以的。。

我怎么啥都不会
atc的题一如既往地把孩子做傻了

计数器:36

uoj549

先考虑 a i a_i ai比较小的时候怎么做
很明显转移为 f i = m i n ( f j + s i x o r s j ) f_i=min(f_j+s_ixors_j) fi=min(fj+sixorsj)
其中s为异或前缀和
我们可以维护一个桶 t [ i ] t[i] t[i],表示 s j = i s_j=i sj=i时的最小值
即可做到 O ( n a k ) O(nak) O(nak)
可以发现,现在的复杂度是,我们可以O(1)修改,O(a)查询
故考虑分块以平衡复杂度
我们把桶改为 t [ i ] [ j ] t[i][j] t[i][j]表示前 8 8 8位为 i i i,匹配后八位为 j j j时候的最小值
这样的话,修改就是枚举 j j j,询问就是枚举 i i i,成功平衡了复杂度,可以通过

1470B

显然把平方数去掉之后,相同的数就是等价的
对于w=1,可以发现,个数是偶数的都会变成1,然后就没有了

1470D

如果不连通显然是NO,否则一定是YES
方案的话,不妨黑白染色,白色是选了,黑色是没选
随便找一个还没有上色的点为白,然后周围全染黑,再将黑点外的还没染色的点染为白即可
正确性的话
显然不存在一个黑点,使得他周围全是黑点
这说明图一定是连通的
同时,显然不可能有两个相邻的点为白
因为显然为白的点一定会把对方染黑
可知解符合条件

AGC039C

倒着往前推,发现操作就是每一次把第一位的数位取反,然后丢到后面去
因此,将串表示为 a a ′ a a ′ a a ′ . . . a aa'aa'aa'...a aaaaaa...a那么答案就是 a a ′ aa' aa的长度,一般地,就是 a a a的长度 ∗ 2 *2 2
暴力枚举a的长度,然后数位dp一下就可以了
重复的部分可以后面再减

AGC038C

对于序列来说,依然可以用线段树维护当前端点为右端点,每一个左端点的答案
复杂度是 n l o g 2 n nlog^2n nlog2n
但这题还有更为优秀的做法
先推一发式子 ∑ i = 1 n ∑ j = 1 n l c m ( a i , a j ) = ∑ d = 1 1 d ∑ d ∣ A d i ∑ d ∣ A j a i a j ∑ d d ′ ∣ ( a i , a j ) μ ( d ′ ) = ∑ d = 1 1 d ∑ d ′ μ ( d ) ∑ d d ′ ∣ A i ∑ d d ′ ∣ A j A i A j \sum_{i=1}^n\sum_{j=1}^nlcm(a_i,a_j)=\sum_{d=1}\frac{1}{d}\sum_{d|Ad_i}\sum_{d|A_j}a_ia_j\sum_{dd'|(a_i,a_j)}\mu(d') \\=\sum_{d=1}\frac{1}{d}\sum_{d'}\mu(d)\sum_{dd'|A_i}\sum_{dd'|A_j}A_iA_j i=1nj=1nlcm(ai,aj)=d=1d1dAdidAjaiajdd(ai,aj)μ(d)=d=1d1dμ(d)ddAiddAjAiAj
先预处理 d d ′ dd' dd的卷积,然后暴力枚举 d d ′ dd' dd即可统计答案
复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

AGC017D

树上删边博弈裸题…
结论就是每个点的SG值是儿子+1的异或和
找了一篇证明
https://www.cnblogs.com/chenhuan001/p/5768381.html

AGC017C

显然可以把每一种数字看作一条线段
然后最后没有覆盖的地方就是答案

AGC014E

考虑如果我们每一次选的点都在根的不同子树内显然是最优的
把重心当作根就好了

AGC032E

结论题
有一个结论就是,最优解一定可以分为两段,使得前面的一段配对为小于M,后面一段配对为大于M
暴力枚举断点可以得到一个O(n^2)的做法
但可以发现,随着断点的移动,两边的最大值都在变大,因此找到第一个符合条件的断点即可
过程用一个二分优化

AGC032D

显然操作就是把数字往前移或者往后移到任意一个地方
考虑暴力枚举一段上升数字是不移动的,那么就相当于给数列分段
中间每一个数字选A或B显然可以决策出来
于是DP, f i , j f_{i,j} fi,j表示前 i i i个数,上一个不移动的数是 j j j即可

AGC014D

有一个很显然的做法,每一次找一条覆盖数为1的边,把它与覆盖其的红边删掉
直接树剖即可
这里有一个小技巧,就是线段树不用具体存放覆盖其的红边(这样空间复杂度为 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)),转为存放异或和
因为我们每一次要找的一定是只有一条边覆盖的,这样的话异或和等于该边编号
然后异或的话删除一条边的影响也非常方便

还有两外一种做法是从后往前考虑
显然最后删的边是两棵树同时存在的
于是直接把这条边看为最后删去,然后把两个点连起来即可
具体实现的话,就是每一次找一个有两条边连接的点,然后把两个点启发式合并起来

AGC014D

居然遇到了一题我能秒的,真是太感动了
考虑叶子与他的父亲,显然先手会染父亲而不是叶子
而一旦先手染了父亲,后手一定要染叶子
故从下往上,删掉父亲和一个叶子,变为子问题即可

AGC028C

WDNMD,曾经会做的题现在又不会做
把条件放宽,变为可以从两端的 a x a_x ax, b y b_y by任选
考虑一个串的状态分为四个,01,10,11,10分别表示b和a选了没有
然后我们考虑把n个串拼起来
01与01之间可以连接,10与10之间可以连接
但是01和10之间不可以直接连接,需要借助00
同样10与01之间不可以直接连接,需要借助11
于是把a,b混合排序,取前n个
得到每个串的01状态,如果有00或11就合法(显然如果有00就一定会有11),否则就往后找一个凑出来即可
除此之外,只有01或只有10也是合法的

AGC041D

想了半天才想到第二个限制只需要管最大的一个。。
我是真的没有脑子
对于偶数来说
取k=(n-1)/2,第一段取k+1个,第二段取后k个
暴力枚举第k+2个数,设为 x x x
那么我们的限制有:
1.前 k + 1 k+1 k+1个数递增且都小于 x x x
2.后 k k k个数递增且都大于 x x x
3.前 k + 1 k+1 k+1个数比后 k k k个数大
发现大家都有 x x x,于是转化一下,取构造与x的差值
1.x与前 k + 1 k+1 k+1个数的差值递减
2.后 k k k个数与x的差值递增
3.第一段差值的和+第二段差值的和< x x x
因此两段的和显然都小于 x x x
暴力dp即可
具体来说就是 f i , j f_{i,j} fi,j表示选了 i i i个数,和为 j j j的方案数
递增问题,可以考虑每一次加上一个数或者集体 + 1 +1 +1
或者按顺序枚举当前最小的数也可以dp
复杂度 O ( n 2 ) O(n^2) O(n2) O ( n 2 l n n ) O(n^2lnn) O(n2lnn)
奇数同理
还有一个做法,就是通过差分,去除单调性的限制
然后推推式子,可以发现等价于一个满足于 ∑ i = 1 n c i b i \sum\limits_{i=1}^nc_ib_i i=1ncibi<0即可,且c只有 c 1 c_1 c1<0
因此暴力DP出 i + 1 , n i+1,n i+1,n和为j的方案即可,DP的问题即使 b i b_i bi的取值计数,一个完全背包解决即可

AGC40C

这种每一次消掉相邻两个的,有一个性质,就是每一次消掉的奇偶性一定不同
因此,我们可以把题意加强一下
奇数位的A,不可以配对偶数位的B
奇数位的B,不可以配对偶数位的A
奇数位与奇数位之间没有影响,偶数位之间同理
因此,考虑对于其中一个位进行变换
即偶数位里面的B变为A,A变为B
再考虑上述条件
奇数位的A,不可以配对偶数位的A
奇数位的B,不可以配对偶数位的B
再变换回去,A不能配对A,B不能配对B
这样就好做了,只要A,B的个数都不超过n/2即可
考虑容斥,暴力枚举谁大于n/2就可以得到答案了

1463F

先观察一下性质
可以发现,最后选的数字一定是以 p p p为循环节 ( p = x + y ) (p=x+y) (p=x+y)
因为如果在p里面,我们选了 i , j i,j i,j且合法,那么 i + p i+p i+p j j j i , j + p i,j+p i,j+p一定也合法
因为 i + p − x = i + y i+p-x=i+y i+px=i+y
因此,我们只需要暴力状压dp出p的答案即可
至于剩下的 n % p n\%p n%p个元素,可以证明,一定存在一个p的最优解,使得这一段的填法依然为最优解的前缀
证明的话,如果存在有更优且合法的前缀,显然可以把p的前缀替换掉,这样整个方案依然合法
具体实现的话,可以对于每一个位置赋值一个val,表示填了他答案会增加多少
其实val就是前 n % p n\%p n%p个元素比后面的元素大1
然后就做完了

AGC043C

显然每一次选最大的,怎么快速维护这东西
可以发现对于一个状态 ( a , b , c ) (a,b,c) (a,b,c),他可以选的充要条件是没有任何一个状态可以到他在选的队列里面
这个与博弈非常相像,也就是如果一个状态是必败态,他的充要条件是没有任何一个状态可以到他是必败态
参见博弈的方法,对于一堆来说,只有从大往小的连边,得到一个DAG
然后求出每一堆的SG
然后最后将三堆合在一起即可

AGC044B

暴力更新每个点的答案
每个点显然最多被更新n次
然后就没有了

AGC044C

又不会做。。以前见过的套路又忘了
对于这种按位搞的,不妨考虑建立字典树
对于这种带进位的,不妨考虑从地位到高位建立字典树
对于 S S S操作,就是儿子1,2交换
对于 R R R操作,就是1,2,0轮换,然后对于新的0儿子递归操作
最后dfs还原即可

ARC108D

乱搞了一会发现不好搞,于是大力分类讨论…
如果 C A B C_{AB} CAB=A
若此时 C A A = A C_{AA}=A CAA=A,答案显然是1,就只有AAAAAAAAAAB
否则分为 C B A = B C_{BA}=B CBA=B
可以发现,除了 A . . . . B B A....BB A....BB构不出来,别的一定可以构造出来
方法就是先把序列里面的A用 C A B C_{AB} CAB生成完,然后 B B B C B A C_{BA} CBA
C B A = A C_{BA}=A CBA=A
则可以发现,只要没有连续的 B B B就可以了
构造方法的话同上
另外的情况同理

1381C

大力口胡
先考虑一个序列能不能把数字不同的排开
显然只要出现次数最多的不超过一半就可以了
这样每一次让最多的和次多的换一下
先按出现次数多的填到 x x x
然后尽量平均地选择y-x个元素,剩下的全部填不存在的数
然后y-x个元素错排开就可以了

AGC049D

稍微分析一下,可以知道序列是碟型的
至于什么是碟型,可以参见碟型谷,此外还有U型谷和V型谷
就是一段下降,一段平,一段上升
然后显然下降和上升的长度不超过根号
然后我就不会了。。
这种单调序列的构造,往往考虑类似整段加的方法
比如构造出下降,就是选择一个j,使得 a j , a j − 1 , a j − 2 . . . 1 a_j,a_{j-1},a_{j-2}...1 aj,aj1,aj2...1依次加上 1 , 2 , 3 , 4... j 1,2,3,4...j 1,2,3,4...j
上升同理
考虑暴力枚举最小的最左点在 i i i,也就是先选 j = i − 1 j=i-1 j=i1构造下降
然后就把现在拥有的方案做背包就可以了
方案就是选择j,就可以加上 j ∗ ( j + 1 ) 2 \frac{j*(j+1)}{2} 2j(j+1)
每次移动 i i i的时候,可以视作为下降的方案加上一个,上升的方案减少一个
无限背包是可以支持撤销的,然后就做完了

Dilworth定理

偏序集能划分成的最少的全序集个数等于最大反链的元素个数
全序集的意义是两两可比
反链的意义是两两不可比
应用的话有
一个图选若干个点互相不能到达,就是最小链覆盖

ARC110D

不妨从n=1的情况说起
∑ i = 0 m C i a = C m + 1 a + 1 \sum_{i=0}^mC_{i}^{a}=C_{m+1}^{a+1} i=0mCia=Cm+1a+1
可以用递推式大力展开证明,也可以理解组合意义
就是对于每一组选择,加多一个选择的点,即枚举的 i i i
同样的道理,对于这一题
我们也在每一组后面加多一个点,也可以理解为分隔符,表示选择的 b i b_i bi的区间大小
因此答案为 C m + n s u m a + n C_{m+n}^{suma+n} Cm+nsuma+n
暴力算就可以了

牛客挑战赛46D

考虑 [ l , r ] [l,r] [l,r]是否合法
转化为 [ 1 , r ] [1,r] [1,r] [ 1 , l − 1 ] [1,l-1] [1,l1]满足某个关系
显然就是每一个数字x,设他在 [ 1 , r ] [1,r] [1,r]出现了 x 1 x1 x1次在 [ 1 , l ] [1,l] [1,l]出现了 x 2 x2 x2
要满足 ( x 1 − x 2 ) % k = 0 (x1-x2)\%k=0 (x1x2)%k=0,也就是两者在膜k意义下同余
因此每一个前缀维护一个桶,表示每一个数字出现在膜k意义下的次数
如果两个桶相同即可
把桶压为hash就可以统计答案了

1396C. Monster Invaders

显然最多在两层里面跳
f i f_i fi表示前i层解决,现在在 i i i的答案
在1和n的时候特殊转移
然后大力讨论就可以了

1396B. Stoned Game

设最多的一堆有x个,剩下的为cnt个
如果x>cnt,那么先手就必胜了
如果没有,那么先手一定尽量避免这种情况的出现,故合理猜想,肯定是让x-1,而不是cnt-1
故每次先手都会选择一个最大的一堆拿走一个
数据范围只有100,暴力模拟就可以了

翻了一下题解,发现可以进一步分析,先判断掉x>cnt
考虑最后获胜时的状态,假设那一堆还有x个
显然若x!=1,当剩余的石头为x*2时,先手一定会拿这一堆,故最后的一堆肯定只剩一个,判断奇偶性即可

1450E. Capitalism

出现奇环显然无解
按照差分约束来建图
暴力枚举最小值,跑一个最短路就是答案
因为没有奇环,因此相邻两个点的最短路一定是不同的,满足题意
判一下如果有负环也是无解的

1450FThe Struggling Contestant

先按顺序分段,然后考虑能否调整使得段与段之间可以连接
先判无解
设当前分成了k+1段,出现次数最多的出现了cnt次,答案为ans
ans一开始显然为k,然后我们现在要求ans增长最少,使得k=0
考虑我们现在拥有的操作
1.众数有大于两个,k–,此时显然有2cnt<=2(k+1)即cnt<=k+1
2.众数有小于两个,k–,cnt–
3.拆开一个相邻的非众数,k++,ans++
当k=0时,显然有cnt<=2
因此可以得到条件cnt<=k+2时有解,故ans要加上min(0,cnt-(k+2))

牛客练习赛73E 羽毛球

先解出 f i f_i fi表示差为i时的获胜概率
显然就是一个链上高斯消元,和树上的同理即可
然后考虑 a a a的限制
不妨暴力枚举有一人到达 a a a时另外一个是 i i i
然后排列组合算一下就好了,然后和f合并在一起就是答案了

1542E. Two Editorials

暴力枚举一个左端点,维护一个 f i f_i fi表示另外一个点选 i i i对答案的贡献
左端点每移动1步,暴力修改所造成的影响
具体来说,只有原来覆盖i变成i+1,或者i-1要修改
可以发下,总修改次数是 n 2 n^2 n2的,然后就可以了

1139D Steps to One

做法很多,不想写了。。
式子题也不好概括
随便整个别人的凑合一下

1444B. Divide and Sum

可以发现,答案恒为最大的n个减去最小的n个
组合数算一下情况即可

1445E. Team-Building

我是考虑了半天奇环不奇环的干什么
考虑减去不合法的配对
建立dfs树,直接随便黑白染色
如果一条返祖边带来了一个不合法的方案,也就是颜色冲突,看一下形成的环是否由小于等于两个小组组成即可
具体怎么看,可以对于每一个点维护一个向上多少是别的组的人,跳两次即可

1422F. Boring Queries

因为要取膜,因此如果要资瓷合并的话比较困难
考虑主席树直接维护每一个右端点的答案
因为lcm是对每一个指数取max
因此一个数能带来的影响不过是他的因子个数
暴力扫一遍所有因子,看分别能影响到哪里
修改即可

1142D. Sum

可以发现一个结论
就是至多只有一个数组是被部分取走的
部分取走的意思是既没有取完也至少取了一个
朴素的思路是暴力枚举这个数组是谁,求出对于其它数组背包的答案
然后合并
求出其它数组背包的答案显然可以用分治的结构来优化
复杂度 n k l o g n nklogn nklogn

1142C. Graph Transpositions

一开始有一个很傻逼想法
就是直接拆为两个图,一个正图,一个反图
直接记录二元组跑最短路。。
写了之后发现一直过不去。。
后来发现,直接最短路是不行的。。
因为在2操作较小的时候,你可能通过更多的2操作获得了一个更快的到某个点的走法,但这可能使你在后面付出代价,也就是最后的答案不优
看来我还是很菜啊。。
那怎么办呢?
我们可以发现,当二操作用到一定次数,比如说20次之后,一个方案就可以从总步数变为双关键字排序
于是我们先跑出用小于20次二操作的所有最优解,左右再拆为两个图跑大于20次的最短路就可以了

1142B. Identify the Operations

因为题目有一个限制,就是每个数只出现一次,于是就很好做了
其实前几天做的题,不记得了。。

1142AExtreme Subtraction

一开始又有一个很傻逼的想法
就是只要左右两边的最小值加起来比他大就行了。。
不难发现12121这种中间存在桥的情况,于是又凉了。。
看来我还是很菜啊。。
那怎么办呢?
我们可以从左往右扫过去,记录一下现在右边需要减多少到左边,就可以了

1143ELong Permutation

不难发现,影响的不超过序列的后大概20位
每次暴力重构就可以了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值