#3 2023.10.23

290. 2022 ICPC Shenyang Regional Contest

D

绷。

C

显然有用的区间只有 2n 个,模拟即可。

I

对于 ai<bi 的,发现先手可以抢排名 mod4 为 1 和 0 的。

对于 aibi 的,是交替拿。

fun fact : 有人平衡树写挂了,+18。我不说是谁 /tx。

L

有用的状态不会太多,直接爆搜。

F

假设 (m+12) 是偶数。

考虑如何做 (1,m) 这个矩形。可以看做要构造几个序列 v,满足 vi=m2(vi+12)=(m+12)。选大的贪心放即可。

A

对于一个区间 [x,y] ,被选中的概率是 p=yxlen。对于两个不交的区间,贡献相当于 pa×pb×|midamidb|。对于两个完全相等的区间,它的贡献是 pa×pb×len3。所以手动把区间劈开即可。

fun fact : 会搞出类似 [x,x] 的奇怪区间。正解是特判掉这种情况。有人不想特判,手动把 [x,x] 修成了 [x,x+ϵ]。精度爆了没草过去。

E

不是边双,等价于有割边。考虑枚举割边集合 E。相当于 E 把图分成了若干个连通块,分别是 a1,..,ak,每个连通块内可以乱连,再搞定 m 条边的限制,贡献为 2m+(k1)2(ai2)

缩完点之后背包转移即可。

H

什么板子题。。

建出 PAM,发现 P,Q,P+Q 一定在一条链上。更进一步地,设 P+Q=S 的最小周期是 T,则 S|S||T|1 的贡献(大概是这样吧。

G

草怎么不会这个题。

考虑一个确定的 a。构造一棵树 t3 包含 t2 的所有边和点,并对于每个点 u,额外加上 (u,u,dis1(u,a))。答案就是 bt3 上的最远点的距离。

考虑动态维护 t3 的直径。用线段树维护 dfs 序在 [l,r] 内的直径。把 at1 上移动,相当于 dfs 序上的区间加。注意到加一整个区间并不影响直径端点。做完了。

B

牛逼题。首先答案的上界是 min(2len,nlen+1)。考虑如何取到这个上界。

k2k+k1n 的最大的数。在模 2k 意义下,i2i2i+1 连边。这个图有哈密尔顿路,记为 path。构造一个新的序列 seqseqi=2pathi+(pathi+1mod2)。容易发现 seq 是模 2k+1 意义下的一个环。

seq 的基础上,把模 2k+1 分成若干个环。具体地可以采取 nxtseqi=nxtseqi+1,nxti=nxti XOR 2k XOR 1(iseq) 构造。

然后不断合并环,造出一个 size+kn 的大环,就做完了。

J

好像会了。

大概就是说一次操作对应一个置换,所以把大矩形的行和列重新排列一下,就会变成很多个小矩形小矩形拼成了一个大矩形,每个小矩形对应的横坐标是一个连续段,是原排列上的一个环,纵坐标同理。所以一次行操作就是把和这行有交的小矩形分别循环移位。

考虑一行小矩形。如果它们的宽是 1,则列操作对它们没有任何影响,行操作的贡献是每个小矩形的最小正周期的 lcm。然后就可以把这行删了。列同理。

所以剩下的全是长宽都 2小矩形

然后用题解里的 L 形操作,可以在不影响其他小矩形的情况下,把当前小矩形变成每个可达状态。可达状态由是否有重复元素决定。若有重复元素,贡献是 n!m!cnt!。若无重复元素,在不更改奇偶性的情况下,贡献是 n!m!2cnt!

所以大概的想法是先确定每个小矩形的奇偶性,再进行 L 操作。长宽都是奇数的一定改不了。长宽有一个是奇数的,就把偶数置换环和 0 连边。长宽都是偶数就把行置换环和列置换环连边。最后的方案数是 2

K

咋是几何。在看了。别急。来了来了。

首先显然选的一定是一个凸包(可能有共线)。

那考虑凸包不是一根棍的情况。预处理出 oki,j 表示 ij 的连线是否完全在多边形内部。枚举凸包最左下的点 i,把 oki,x=1 的点拿出来按照极角排序。设 dpx 表示当前凸包终点是 x 的方案数。转移 dpydpx 当且仅当 x 极角序小于 yok(x,y)。注意要保证它不是个棍,所以再加一维 0/1。

再考虑凸包是一根棍,那就把极长的棍拿出来就随便做了。

感觉是个签到几何题啊,怎么过的人这么少(?。

M

wtf。

291. cf1253f Cheap Robot

对每个点求出到它最近的充电桩 pidisi。对于每条边 (u,v,w),连接 (pu,pv,disu+disv+w) 的边。kruskal 重构树即可。

292. cf625e Frog Fights

模拟题。用个堆记录创飞的时间,每次挑最小的即可。

293. cf1286e Fedya the Potter Strikes Back

实际上就是每个前缀的 border。考虑前缀 i 的 border 的起始位置集合 Si。发现 Si+1 是先把 Si 踢掉一些东西,再加一个 i+1。注意到踢掉的东西是 i 的 fail 链上,sj+1si+1 的。开 26 个并查集暴力踢就行了。

294. cf587f Duff is Mad

啥乱题。

考虑一个单次询问 O(|Sk|) 的做法。相当于对 k 的每个节点,问 [l,r] 的终止结点在它的 fail 树祖先链上出现了几次。离线下来 dfs ,用 O(n)O(1) 的单点加区间查分块可以做到 O(q|Sk|)

再考虑对于一个串 k,解决关于 k 的所有询问的 O(n) 的做法:把 Sk 所在的点设为 1,q(i,i,k) 就是 edposi 的子树和。

拼起来就过了。

295. cf896e Welcome home, Chtholly

如果整体做 1 操作,假设是减 x,值域为 m。容易得到两种做法。

第一种是按题意模拟,复杂度是 O(mx),可以让值域减少 x

第二种是假装所有数都减了 x,然后把 x 的东西补回去,相当于平移数轴上的位置。复杂度是 O(x),可以让值域变成 max(mx,x)

所以当 m>x2 的时候可以使用第二种,否则用第一种,相当于用 x 的代价把值域减少了 x

套个分块做完了。

296. cf1801e Gasoline prices

序列上的版本就是维护 logn 个并查集,第 i 个并查集的第 j 个点代表 [j,j+2i)。只会被合并 O(nlogn) 次,就做完了。上树就是把这个并查集搬到树上,没啥意思。可能需要维护一个反着的并查集。

297. The 2022 ICPC Asia Hong Kong Regional Contest

没打过 jiangly 和 larryzhong /ll。

H

绷。

fun fact : 有人英语不好理解不了题面,瞪了 5min 才结合样例理解这个题在干啥 /cy。

K

先排序和去重,答案一定 a1

如果答案等于 a1,要求是 a22a1

否则枚举 a1 有没有取模。取模的话是 a1mod([a12]+1),不取模的话,其他数显然不会取模到 <a1,所以就是把所有 >2a1 的数变成 a1 之后再取 gcd。

fun fact : 有人开场就写了这个题,然后 +3 /cy。

A

大概就是设 fu 表示 u 子树的答案。转移就是 fu=1+max(secmax fv,max fv1)

E

扫描线。枚举 r。扫到当前点如果有限制,相当于 ban 掉一个区间的 l

F

数位长显然不会差 >2。暴力枚举。

L

显然小区间完全吊打大区间。考虑每次扔没被扔的集合里最大的那个。设 len 表示它能接受的最大长度。然后找一个长度 len 的最长区间扔了就行了。

B

注意到黑的只有一个连通块,那就只数白的连通块个数。白的有一个大的连通块。对于其他的白连通块,一定不存在右下的锯齿状物。所以枚举作为白连通块右下角的点,贡献就是这行这列不能删它,下一行下一列把它封住的概率。

C

n<m。特判掉两个奇数和 2n<m 的情况。我的做法比较鬼畜,令 d=min(60,n),嗯随 [m2][0,2d) 的数,构成序列 a,满足 ai,ai XOR (2d1) 都互不相同。把 ai 塞进每列,[d,n) 继续嗯随。然后把这些东西复制一遍再每位异或 1。如果 m 是奇数就再塞一条 00001111。多随几次就过了(。

D

答案相当于 (a,b) 点积 (white,black),所以只有凸包上的点有用。暴力合并凸包,查询的时候三分。现场没人过 /jy。

J

相当于计算 i=0n1max(j=0n1(ij)i×n)

注意到里面这个东西等于 bit2bit(biti?ncbit:cbit)=i×nbit2bitcbit(biti?1:1)。其中 cbit 表示 [0,n1]bit 位是 1 的个数。所以上面那个 max 只取决于后面这坨东西的正负性。

然后发现后面这坨东西的正负连续段不会太多(???),大概只有 log 个,就暴力分治 solve(l,r),每次找出 [l,r] 区间的后面这坨东西的最小值和最大值,如果正负性相等就直接算。

I

做法满天飞的一个题。似乎这个题的各种解法都依赖于求出若干对关键点,然后扫描线求答案。因为关键点对远大于查询,所以扫描线的时候用分块。

题解的做法是把平面分 logV 次块,第 k 次分块的边长是 2k。目标是求出距离在 [2k1,2k) 里的关键点对。加入点的时候暴力扫周围的 3*3 的块更新答案。如果找到了一个 j<i 满足 dis(i,j)<2k1,就把下标 <j 的点全扬了。这样能保证每个块只有 O(1) 个点。

还有一种正解的做法也是把平面分 logV 次块,第 k 次分块的边长是 2k。然后把每对相邻的块按照下标排序,枚举相邻的 O(1) 个点,这样也是对的。考虑每个可能优的点对,当它们在同一块或者相邻块的时候,它们两个中间不会有太多点。实际操作可以枚举 10 个点左右。

然后就是经典的乱搞做法:随机一个角度,然后排序,枚举原序列和排序后序列上的点硬草。感觉很伟大!

G

你妈,看了一天没看懂。傻逼。

298. LG9747 「KDOI-06-S」签到题

发现最后的数一定是整个区间的 OR。再发现一个区间合法,当且仅当存在一个数是区间 OR,并且存在一个和这个数不交的区间 OR 起来是 OR。

枚举每个数作为区间的 OR,二分出 L,R 是会让 OR 变化的端点。再二分出 l,r 满足 OR [l,i)=aiOR (i,R)=ai。这样的 [l,r] 就是机场区间。然后扫描线即可。

299. arc147d Sets Scores

考虑一个变化序列 xi。记 pi 是当 iS1 中,序列变化量是 x 时,in 个集合里的出现次数。再枚举 S1。答案就是 xS1((iS1pi)(iSi(npi)))=xnm=mn1nm

300. arc147e Examination

忽略次数限制,判定一个序列能否合法。相当于把 vai 加一,vbi 减一,然后任意后缀和都要 0

先把一定要换的东西拉出来,考虑加进一个 ai>bi 的数,相当于把 (bi,ai] 这段区间加一。所以从后往前扫,如果遇到前缀和是负数,就挑 bi 最小的区间放。

301. arc147f Again ABC String

考虑把题目抽象成为有三个人在一个长度为 x+y+z+3 的环上走,分别位于坐标 0,x+1,x+y+2。每次可以选一个人往前走 1,要求不能有两人重合的方案数。

f(a,b,c) 表示三对人分别至少重合 a,b,c 次的方案数。注意到如果 a+b+c2 ,则 f(a,b,c)mod2=0。原因是当它们第一次重合后,对下一个状态会产生 2 的贡献。

所以只需要计算 f(0,0,0)f(1,0,0)f(0,1,0)f(0,0,1)f(0,0,0)=3n=1

f(1,0,0) 为例,相当于第一个人的步数减去第二个人的步数在模 x+y+z+3 意义下为 x+1。答案就是 [tx+1]((t+1+1t)nmod(tx+y+z+31))。每一轮可以让步数差加减 1 或者不变。而如果一个情况里,第一个人和第二个人第一次相遇后,如果一直动第三个人,在答案式子里的贡献就是 1。否则如果动了第一个人和第二个人,假设它们最后距离差为 d,那么有 +d 和 -d 两种方案,贡献为 0。

现在问题变成了如何计算 [xn](x+1+1x)mmod(xv1)=[xm+nmodv](x2+x+1)mmod(xv1)。注意到 (x2+x+1)2i=(x2i+1+x2i+1)。使用根号分治,如果 v 不大就暴力转移。否则变成计算 [xm+nmodv](x2+x+1)mmod(xv1),枚举 kmodv=m+n,计算 [xk](x2+x+1)m,这个可以简单用数位 dp 求出。

302. gym104369e New but Nostalgic Problem

先建个 trie,对于点 u,计算 lcpu 的最大集合大小。发现严格小于等 u 的串可以随便选,大于 u 的每个 trie 结点至多有 1 个串经过。dfs 就行了。摇奖手速也太快了吧,吓人。

303. gym104369f Traveling in Cells

k 个线段树一起线段树二分就行了。怎么花老师还写这种题啊。

304. gym104369m Computational Geometry

假装下标是模 n 意义下的。枚举劈开的两个点 i,j,如果把一边劈成棍子了肯定不行,否则就是两个区间内两两 dis 的最大值。随便更新。摇奖手速也太快了吧,吓人。

305. gym104369j X Equals Y

先讲讲我的垃圾做法。相当于构造一个序列 z0,..,zlen1,满足 zi<min(a,b),ziai=n,zibi=m

首先搞定 len=1 的情况。然后是 len3,可以暴力枚举 a,b 塞进哈希表里。

然后是 len=2。限制转化为 z1a+z0=x,z1b+z0=y,len=2,z0<min(a,b)。先把能让序列长度为 2 的 a,b 区间求出来。枚举 z1,可以得到 ab=xyz1。把 a 的区间和 b 的区间取个交,此时条件变成了 xmoda<axyz1。用扩展欧几里得算即可。

似乎题解更高妙。把 a 范围写出来之后就不用 check 了。我是傻逼。

306. gym104369h Canvas

显然 11 没用。那不妨考虑对于一个点 u,连边 u2u1。对于 xi=1,连接 l1i,否则连接 il2。然后缩点,每个入度为 0 的块选一个点变成 1 即可。

307. gym104369g Swapping Operation

考虑把会让前缀和后缀 and 变化的点称为关键点!

枚举分界点 k。如果交换的两个点和两边的关键点不交就屁用没有了!那就枚举交换的是哪两个关键点,或者是哪个关键点,最后可以写成 maxf(1,i1)&f(i+1,k)&aj,j<k,jkeypoint。发现前面两个的个数不多,就暴力枚举!

308. gym104369l Classic Problem

进行一个 B 姓算法的猛日。做完了。

309. cf722f Cyclic Cipher

身败名裂题。

考虑一个区间两两有解就一定有解。区间内两两有解判定是容易的。套个双指针即可。

310. cf513f2 Scaygerboss

二分答案之后建个图,能到的连边,跑个最大匹配即可。

311. cf1119f Niyaz and Small Degrees

身败名裂 ×2

大概是对于一个 k 有一个显然的 dp,大概是一个点选儿子里前 k 个最小的。注意到当 k 增大,只有 degk 的点会受影响。

312. cf1553I Stairs

怎么这玩意 3400 啊。

显然连续段是极长的。每两个极长的连续段之间有一个 >1gap

搞出 gap 集合 S,设 S 会把数列分割成 s1,s2,...,sn,答案就是 TS(1)|S||T|2ti>1(|T|+1)!。分治算即可。

313. xsy5264 冬眠

发现每个不合法三角形存在两条 1 边。尝试数每条 1 边一共在多少个三角形里出现过。发现只跟 n 的奇偶性,1 边两个端点的奇偶性有关。答辩分类讨论题。注意判断一下等边。

314. xsy5265 假期

大力猜想答案是个团。就搞个最大团就行了。

315. xsy5266 刚刚结束

把每个点 XOR HASH,满足每个颜色 XOR 和为 0。发现更改一个点相当于若干子树 XOR。查点容易。

就变成了带时间顺序的矩形 XOR,矩形 XOR 和。注意到修改矩形是 1×n,查询矩形是 n×1 的,所以直接离线 cdq 扫描线。

316. uoj821 【UR #26】石子合并

考虑合并两个序列。把两个序列的非严格前缀最大值拎出来,变成很多很多个区间。发现就相当于这些区间归并,第一关键字是第一个元素的大小,第二关键字是左右。并且合并之后新序列的区间还是这些区间。

所以找出所有区间,对于第一个元素相等的区间有严格的顺序。考虑容斥掉长度的限制,每种区间是个插板,就做完了。

317. uoj823 【UR #26】铁轨回收

我是全场一血!!!!!!!!!111111

困了不想写题解了,可以去看官方题解或者直接咨询 zak 本人或者咨询我

318. arc146d >=<

转成两个限制,分别是

  • 如果 apx,则 aqx
  • 如果 apx+1,则 aqx+1

反向也一样。

然后扔进队列里,所有的限制都满足。

319. arc146e Simple Speed

从小到大 dp 连续段。设 fi,j,0/1/2 表示前 i 种数,有 j 个连续段,左右两边有几 0/1/2 个是 i。随便转移。

posted @   ZSH_ZSH  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示