树不要皮,必死无疑;人不要脸,天下无|

Tx_Lcy

园龄:2年8个月粉丝:6关注:6

题目乱做笔记

CF1592F1

*2600,会也不会,看题解的。

发现了一个性质:操作二和操作三没甚卵用,然后依然不会。

考虑把矩阵修改变成单点修改,这样会好做 inf 倍。

考虑把全白 当前矩阵转化成当前矩阵 全白。

然后,然后就想不下去了,开了题解。

题解的神仙思路:设 B 的值为 1W 的值为 0,当然你换一换也是一样的。设 pi,j 等于 ai,j ai,j+1 ai+1,j ai+1,j+1,发现把 a 变成全 0 相当于把 p 变成全 0

然后就好做了,发现对于一个 px,y,如果它的四个节点被翻转了偶数次,不会影响它的取值。

所以,一次操作 1 相当于翻转一个 px,y,对于操作 2,相当于翻转 px1,y1,px1,m,pn,y1,pn,m

不难发现进行 2 次操作 2 必定是不优的,因为可以用六次操作 1 代替之。

然后就做完了,判一下是否进行了操作 4 即可。

CF1592F2

感觉有点阴间,先 skip。

CF1516E

*2500,考虑设 fi,j 表示长度为 i 的序列,最少交换 j 次可以还原成 1...i 的排列。

转移显然,fi,j=fi1,j+fi1,j1(i1)

不难发现可以消耗步数,那么最多交换 j 次的答案就是 ansj=i=1j[imod2=jmod2]×fn,j

时间复杂度 O(nk),需要优化。

优化 1:盲猜项数不会很多,直接拉插,没写过,应该是对的。

优化 2:考虑二项式反演,设 gi,j 表示 pii,且恰好需要 j 次还原的情况,不难得到:fi,j=k=0i(ik)×gk,j
c
反演回来,得到 gi,j=k=0i(1)ik×(ik)×fk,j

那么答案就是:ansj=i=1min(n,2j)×(ni)×k=1j[kmod2=imod2]×gi,k

时间复杂度 O(k3)

CF1499E

*2400,傻逼题,直接 DP 即可。

CF1348E

*2400,一道很秒的题。

考虑答案上界:我不管莓的种类全都放进个篮子里,可以放 ai+bik 个篮子。

考虑答案下界:我分别把每种莓放进篮子里,不管同一颗树可以不管种类的限制,可以放 aik+bik 个篮子。

不难发现上下界最多只差 1,若相等,直接输出,若不相等,考虑这个 1 能不能加。

这个加的 1 显然是通过同一颗树加的,所以我们需要搞掉一些莓,设 fi,j 表示前 i 棵树,搞掉了 modk=j 的第一种莓是否可行,这里可以直接 modk 的原因是 jk 的部分显然可以自己放进篮子。

如果第一种草莓可以通过同一颗树移走 aimodk 个,且 kbimodk 个,这样才能凑齐一个篮子。

CF1109D

*2400,傻逼数数题,这种难度的题是怎么放到 Div1 D 的啊。

CF1307E

*2500,有点阴间的题。

显然的,每种颜色的奶牛最多只会出现两只,一只在左边,一只在右边。

显然的,每只奶牛若放在左边,必然有一个固定的睡觉位置。

我们考虑枚举这个固定的睡觉位置,设枚举的位置为 i,我们要求的方案即为:左边的奶牛睡觉位置都 i,且存在一只奶牛在 i 睡觉,右边的奶牛睡觉位置都 >i 的最优方案和方案数。

这个可以直接计数,只是分讨有点阴间。

CF1603C

随机开的一道 *2300,从晚上 9:00 想到晚上 9:30,第二天数学课又想了一会,完全不会做,只会 O(n2),以为后面的步骤需要阴间数据结构。

结果查看题解,数论分块优化 DP?我草完全想不到。

首先考虑如何计算一段区间 [l,r] 的贡献。首先最后一个数肯定不变,然后向左推。

设当前位置为 x,如果 axax+1,那么不管它。如果不合法了,我们可以算出当前这个数需要分成几个部分,多分显然不优,然后我们需要让这些数尽可能平均,所以可以直接算出分成那些数,然后累加贡献即可。

然后考虑 DP。设 fi,j 表示第 i 个数减到了 j 的方案数(为啥是方案数,因为我们要累加每个点的贡献)。

考虑如何计算 i 的贡献,枚举 i+1 减到了哪个,不妨设为 x,那么当前点需要拆成 k=ai+x1x 个小点,贡献就是 k1,然后乘上 i,因为我们对 1,...,i 都有这么多贡献,所以答案需要加上 (k1)×i×fi+1,x

DP 转移随便转移一下就行了,这是简单的。

发现每个 i 的合法状态只有 n 种,数论分块优化 DP 即可。

AGC010C

发现是判断是否合法,不妨找出一些必要条件。

首先,特判 n=2 的情况,然后找出一个度数 >1 的点为根,以这个根为起点 DFS 一遍。

对于以 x 为根的子树,我们发现路径有两种形式:从 x 往上连的/在 x 的两个不同子树内两两匹配的。

我们设往上连了 fx 条路径,两两匹配了 gx 条路径。

容易发现 fx+2×gx=sumxfx+gx=ax。其中 sumx 表示 x 的儿子们一共往上连了 sumx 条边,即 sumx=fv

这是一个一元二次方程,我们可以把它解出来,判一下 fx,gx 是否是非负整数,不是非负整数显然无解。

如果 fx>ax,那么无解。

在以 x 为根的子树内我们最多匹配 max(sumx2,sumxmaxfv) 组,如果 gx 大于了这个数字,那么也无解。

而且根节点 f 值必须为 0,不然无解。

容易发现另外情况均有解。

P6217

简单题,把 lcm(ai,x) 变成 ai×xgcd(ai,x)

分子的维护是简单的。gcd(ai,x) 可以变成两个前缀的形式,我们除一下即可。

考虑离线询问,依次加点,加到第 i 个点的时候处理 1i 的询问。

分离每个只因子的贡献。

发现 200000 内的质数只有 80 多个,而 >200000 的质数的次数显然只能是 1,两个树状数组统计一下即可。

AGC014D

发现先手胜利的充分必要条件是存在一个白点没有黑点与之相邻。

考虑一个三个点的树:(1,2),(1,3)。我们发现先手必胜,因为我可以标记 1 为白点,然后不管后手标记哪个为黑,我标记另一个为白就获胜了。

考虑一条链的情况,我如果将这条链链底的父亲染白,后手只能把链底染黑。如此这般,先手必胜。

盲猜正解就是模拟这个过程。我们遍历每个点,每次把叶子节点和它的父亲删掉。如果遍历完后这个点后这个点还没被删,那么这个点就以及被删成了叶子,判一下父亲是否被删,被删了就先手必胜,没被删就把它们两个都删掉,回溯回去。

结果过了。

AGC015D

a=b 时,输出 1

否则 ab,把 ab 二进制分解,从高往低找到第一个 ab 不同的位置 x,不难发现 x 之前的位都没用。

然后不会了,看题解。

官方题解做法:

易证原问题等价于任选两个数能组成的或值个数。

可以这么构造证明:如果一个数 x 能被表示出来,那么我们找到 x 的最高位。

如果 axb,那么命题显然成立。

接下来只需要考虑 x>b 的情况。

x 的最高位是第 y 位。

首先这些数的最大值一定大于等于 x 的最高位的值。

分两种情况。

如果这些数的第 y 位都是 1,我把这两个数的第 y 位也赋值成 1,不管这一位,继续往后寻找第一个是 1 的位,然后把这个位设成新的 y,再来一次。

如果存在一个数的第 y 位是 0,则这个数一定小于等于 x 异或第 y 位的值,我把一个数设成第 y 位的值,一个数设成 x 异或第 y 位的值,不难发现这两个数一定夹在这些数的最小值和最大值之间,所以显然合法,然后就找到了一组合法方案,直接 break

不难发现我们构造不出来这两个数当且仅当这些数都相同,而若这些数都相同,不可能构造出 x 使得 x>b,所以一定能构造出方案,原命题成立。

首先把上面一坨相同的位去掉,此时一定有 b 的最高位是 1a 的最高位是 0

zb 的二进制最高位对应的值。

则我们把区间 [a,b] 分成两个区间:[a,z)[z,b]

我们此时的或可以分成三种:[a,z) 之间内部运算,[z,b] 之间内部运算,两部分区间交叉运算。

我们先看第一种,显然的,此时可以表示出 [a,z) 的所有元素。

然后看第二种,我们找出 b 最高位后面的第一个 1 的位置,记为 x,设 p 表示把 bx 位及之后都赋值成 1 后的值,则我们可以表示出 [z,p]

接下来是第三种,不难发现只需要与 z 或运算即可表示出所有可能表示出的数,所以一定是一段连续的区间 [a|z,(z1)|z]

三个区间取并即可。

AGC015C

傻逼题,点数-边数即可。

ARC116E

首先二分答案。

然后考虑 check,对每个点记 w1x,w2x 表示这个点子树内最远未覆盖的节点和最近被覆盖的节点。

如果 w1x+w2xmid,那么 x 被覆盖。

如果 w1x+w2x>midw1x=k,则说明必须要在 x 上设一个节点。

特判根节点即可。

AGC024D

考虑枚举每个点/边作为根,那么最终一定是形如一颗满二叉树剪掉一些子树。

颜色数可以直接求出。

考虑叶子节点数怎么求:取所有层点度数的 max 然后乘起来即可。

P4208

Matrix Tree 板子,注意到最小生成树有以下性质:

1. 最小生成树每条边需要加进去的个数是固定的。

2. 最小生成树每种权值的边不管如何加入,联通性都是相同的。

所以我们可以先求出最小生成树,然后枚举每种权值的边,把除它之外权值的边均加入,求行列式即可。

算一下复杂度:等于给你一个序列 c,满足 ci=n,求 ci3 的最大值,发现不会超过 n3

P3644

首先如果居民的办公室和家都在河的一旁,可以直接忽略。

K=1 的情况是简单的,问题就相当于:给你偶数个点,求 K 个特殊点使每个点到这 K 个点的距离的最小值总和最小,取中位数即可。

K=2 时,设我们选了两座桥 p,q,那么答案为:min(|aip|+|bip|,|aiq|+|biq|)

这个 min 的限制相当烦,要是我们能把这些点分成两部分,一部分都走 p,一部分都走 q,问题就好做了。

f(x)=|aix|+|bix|,画出函数图像,是一个天线函数,由斜率为 2,0,2 的三条直线组成。

我们取中点 m=ai+bi2,则在区间 (,m] 这个函数是单调不上升的,在区间 [m,),这个函数是单调不下降的。

由此我们得出结论:若 |pm||qm|,则选 p 一定不劣于选 q,反之选 q 一定不劣于选 p

而进一步转化这个结论,得出:若 mp+q2,则选 p 一定不劣于选 q,反之选 q 一定不劣于选 p

所以我们按照 ai+bi 从小到大排序,选 p 的一定是一段前缀,选 q 的一定是一段后缀。

枚举前缀后缀的分界点,两边都用 K=1 的方法做就行了,用对顶堆或 Fido_Puppy_Treap 动态维护中位数即可。

AGC050C

首先盲猜合法条件是存在一个前缀使得 B 的个数比 S 的个数多 2

然后考虑设 fi 表示恰好在前缀 i 合法的方案数。

需要容斥,直接来是 O(n2) 的。

但是这个合法条件是假的。

事实上,设 L 表示 snuke 往左能走的房间数,R 表示 snuke 往右能走的房间数,则一次操作可以另 snuke 的行走范围变成 (min(L,R),0)

snuke 一次行走只能把 (L,R) 变成 (L+1,R1)(L1,R+1)

ABC240G

首先把“恰好”改成至多,然后让 nn1 的答案做个差分即可。

好像不太行,考虑直接计数。

把三维分开来考虑。

我们首先枚举第一维走了几步,这个方案数可以直接组合数求出。

然后接下来我们要 O(1) 算出两维的情况下走恰好 i 步的方案数。

把它转化成切比雪夫距离,发现等价于 (x+1,y1),(x+1,y+1),(x1,y1),(x1,y+1),然后两维是独立的,分别计算然后乘起来即可。

ARC027D

蚌不住了,直接暴力能过。

立方体とペンキ

洛谷上只有一个人通过的题,AT 上只过了两页人,而且没有题解。

不过好在想出来了。

考虑怎么样的块会使表面积 4,不难发现是一些柱子的顶部,且周围没有东西跟它碰到。

所以我们可以直接把这些块先除掉。

然后接下来我们会把原数组分成若干区间,这些区间是极大的相等子串。

[l,r] 为其中一个区间,则若 al>al1ar>ar+1,则把整个区间消掉 1 会额外减掉边界两块面积的贡献,若不满足这个,则不会额外减掉贡献。

我们可以用优先队列维护这些区间,然后每次取长度最小的,把区间 [l,r] 消成 max(al1,ar+1),然后会合并一些区间,不难发现合并只会发生 O(n) 次,所以时间复杂度 O(nlogn)

合并区间的时候需要一些分讨。

Equilateral

发现任意一个合法点对都存在两个点在 45 度斜线上。

于是我们可以枚举这两个点,大约只有 O(n3) 种点对。

然后考虑第三个点有几种可能,发现是一条 45 度斜线的某段区间的和,转切比雪夫距离后前缀和即可。

ARC047B

先曼哈顿距离转切比雪夫距离,然后我们发现以 p 为中心的正方形的边长一定是 max(maxxminx,maxyminy)

然后对有几个边界上有点分类讨论,发现 p 的横坐标一定是 minx+d2,maxxd2 中的一个,纵坐标同理。

于是枚举这 4 个点,O(n) check 即可。

AGC052B

我们把边权转为点权,这样一次操作就是交换相连两个点的点权。

注意到此时我们的点权可以任意排列。

fx 表示最终 x 的点权。

注意到任意一组合法方案都可以规约到 f1=0 的情况(所有数都异或上 f1,边权异或和不变)。

现在我们求出了 f

我们设 dx 表示初始 x 的点权。

同样钦定 d1=0,那么最终答案合法的充要条件是 dig 后与 f 相同。

注意到当 digf 相同时,它们的异或和也相等。

也就是 (d1g)(d2g)...(dng)=f1f2...fn,由于 n 是奇数,所以可以解出 g

然后代回去判断是否合法即可。

ABC193F

看到这个题就感觉非常 flow,事实上确实也是 flow

刚开始想到可以把每个点拆成黑点和白点两个状态,不过这样等于限制两条边只能流一条,是假的。

最大流不行,考虑最小割。

注意到经典模型:使两边颜色相同的边数最大

而如何套用到这题呢?把 (i+j)mod2=1 的格子反色即可。

ABC201F

首先可以让 BiCi 都与 Aimin

然后我们可以把三种操作分成三个部分:先左移,后右移,最后任意移。

容易证明需要左移的点在值域上一定是一段前缀,右移的一定是一段后缀。

而中间留下一段值域连续的任意移动部分,等于求一个最长带权上升子序列(这些点不用移动,其余点需要任意移动)。

直接来是 O(n2logn) 的。

我们考虑把前缀压到一个 DP 状态里去,这样就可以直接转移,用树状数组优化转移即可。

CF1758E

首先考虑如何 check 一组方案是否合法。

我们可以规定操作顺序,显然对最终结果没有影响,所以不妨认为先操作行,再操作列。

那么合法条件就变成了能否操作一些行,使得每列的数都相等。

这个合法条件又等价于矩阵每行的差分数组(modh)意义下相等。

显然,每列的差分数组也必须相等。

既然已经转化到这里,不妨把每列分开考虑,先不考虑第一列。

如果这一列存在一个固定的数,那么这一列也随之确定(列差分数组是确定的)。

如果这一列不存在固定的数,那么就对答案有 ×h 的贡献。

第一列的放置情况要根据行的情况确定。

根据行的差分数组推得每个位置可以任意放还是固定。

然后简单计数一下即可,注意判断无解。

差分数组可以简单用带权并查集维护。

CF1844E

其实与 CF1758E 非常类似。

观察 Great Grids 的性质,以 $$ 表示 ai,j=ai+1,j+1/ 表示 ai,j=ai+1,j1

那么两行的 \/ 数组要么完全相同,要么完全相反。

这等价于每一行的元素相等情况完全相同。

每行分开来,然后并查集判断即可。

CF1824C

考虑最终方案是如何的。

不难发现会存在若干叶子节点在叶子节点上单点修改以满足条件。

另外一些点通过非叶子节点修改满足条件。

gx,i 表示 x 子树内的点都修改为 i 的最小代价。

显然 maxgx,imingx,i1,所以设 fx=mingx,i

那么首先 fx=fv+1

接下来我们可以选择一些子树是的它们的修改不变。

额外维护一个 set 表示 fx 取到最优值 x 子树内可以修改成哪些值。

这样就可以方便求出了。

CF1290C

发现题目中的条件等价于每个点只会被包含在至多两个集合里。

那么一个 si 若为 0,则等价于这两个集合一个选了,另一个就必须选,一个不选,另一个也不能选。

一个 si 若为 1,则相反。

考虑使用扩展域并查集维护这个东西。

我们设“选”为第一层,“不选”为第二层。

那么一个连通块要么全选第一层的点,要么全选第二层的点。

所以维护两个 sizmin 就行了。

注意到每种连通块会被算两次,所以要 /2

特判 si 只被一个集合包含的情况。

CF1495D

先转化一下题目的条件。

我们对于每个 ibfs 一遍求出 depi,j 表示以 i 为起点 j 的深度。

那么题目的条件就是每条边 (u,v) 满足 |depvdepu|=1

我们给每条边定向,限制就变成 depvdepu=1

考虑一棵树怎么算答案。

枚举 i,然后枚举深度,上一个深度向当前深度连边,可以对于每个点简单统计一下上一个深度有几个点能到它,乘法原理即可。

那么对于两棵树呢?

观察一下,发现 i,j 的答案相对于 i 的答案等价于多满足:

  • ij 的路径上满足 depj,faxdepj,x=1

  • 对于不在 ij 路径上的边 (u,v) 满足 depj,vdepj,u=1

考虑分层之后 dp,设 fx,y 表示目前 dp 到第 x 层,第 y 个点后面要接 j 的方案数。

直接转移即可做到 O(n4)

这时候需要一个很厉害的观察:如果 ij 的最短路不止一条,那么答案一定是 0

有了这个性质之后我们就不需要 DP 了,套用一棵树的方法简单计数就行了。

太妙了,时间复杂度 O(n2m)

CF283E

考虑统计不合法三元组的数量。

不难发现不合法三元组等价于三元组内存在一个点的出度是 2

那么我们可以求出最终状态下每个点的出度,不妨设为 di,答案就是 (di2)

至于 di 也很好维护,每个 (l,r) 等价于给二维矩形异或 1,离线扫描线即可。

P2416

题意就是给出一张无向图,有若干关键边,一条边走过后不能再走,Q 次询问是否存在一条 uv 的路径上有关键边。

缩边双,不难发现一个边双内的边都能走过。

然后就做完了。

CF1677D

考虑没有 1 的情况。

发现每个序列对应一个原序列。

至于交换 k 轮?

把原序列求出来之后可以求出最多能交换几轮。

然后打个表,发现长这样:

1 16 54 96 120
1 8 18 24
1 4 6
1 2

设最多能交换 x 轮,则答案为 k!×kxk

「LibreOJ NOI Round #1」北校门外的回忆

考虑 k 是奇数。

(i,i+lowbit(i)) 连边,发现连出来若干条链,并且不交。

k 是偶数则每条链会有一些很短的分叉。

所以每个点暴力跳 log 次后总是会跳到一条很长的链上。

每条链可以开一颗线段树维护,接下来我们只需要定位出某个点在哪条链上以及是第几个就行了。

发现 lowbit 值是有迹可循的,一定是形如 p1,p2,p3,p4,...,pk,p1,p2,p3,...,pk,p1,... 的。

于是我们可以倍增,然后就做完了。

Birthday

首先需要发现答案是 2k 的形式,考虑反证,若答案存在一个 >1 的奇数因子 B,那么在 (x,y)(x+y,xy) 的过程中若想要 x+yxy 都含有 B,必然有 B|x,B|y,也就是 i,B|i,显然不成立。

N 为第一个 n2 的次幂,那么答案至少是 N,考虑构造达到这个下界。

我们先将所有数转化成 2 的次幂的形式,然后再转化成相等。定义函数 work(n,k) 表示我想将 2×2k,3×2kn×2k 都转化成 2 的次幂,那么分类讨论:

  • n2 的次幂,递归到 work(n-1,k)
  • n 不是 2 的次幂,找到 n 的最大 2 的次幂 m,将 (m+i)×2k(mi)×2k 配对,那么会得到 m×2k+1i×2k+1,前者已经合法,仅需递归到 work(n-m,k+1) 解决后者即可,对于剩下的部分 2×2k(2mn1)×2k 递归下去即可。

这个方法的操作次数不太好证明,但至少是 Θ(nlogn) 级别的。

现在所有数都是 2 的次幂,考虑转变成相等,继续分类讨论:

  • 如果存在两个数相等,并且它们都 <N,那么直接合并即可。
  • 如果存在 0,那么让某个数与 0 合并,转化成存在两个数相等的情况。
  • 如果不存在 0,取出两个数 2a2b,不难发现可以用两次操作使它们变成 2a+12b+1

后面部分同样是 Θ(nlogn) 级别的,但是实际使用的次数非常少。

本文作者:Tx_Lcy

本文链接:https://www.cnblogs.com/tx-lcy/p/17151848.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Tx_Lcy  阅读(68)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起