打算如果有空的话就开两个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
aa′aa′aa′...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=1∑nj=1∑nlcm(ai,aj)=d=1∑d1d∣Adi∑d∣Aj∑aiajdd′∣(ai,aj)∑μ(d′)=d=1∑d1d′∑μ(d)dd′∣Ai∑dd′∣Aj∑AiAj
先预处理
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=1∑ncibi<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+p−x=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,aj−1,aj−2...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=i−1构造下降
然后就把现在拥有的方案做背包就可以了
方案就是选择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,l−1]满足某个关系
显然就是每一个数字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
(x1−x2)%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位
每次暴力重构就可以了