2021 Hubei Provincial Collegiate Programming Contest/2021湖北省赛 题解

按解决顺序排列

F

二分答案ans,放最小的前ans个bi(变成必须放完)

因为bi=2^k,所以小的放了可能会拆散大的空间,大的把小的地方占了的话小的可以塞其他地方,所以先放大的

然后暴力能放则放,最多log次指针回到开头

所以一次求解O(nlogn),总复杂度log^2

A

模拟,暴力枚举暴力异或

注意X串要多留k-1位

I

把限制Pa!=b变成叉掉点(a,b),画一下发现问题等于求多少个内部没有叉的合法矩形 (a~b,L~R)

经典问题(疑似),枚举R,维护每个点(x,R)左边的最大长度,那么一对a0,b0对应 min L[x] (x in (a0,b0)) 个 (a0~b0,某L,R) 的矩形,单调栈维护,在弹掉时可以求出跨过某x的方案

D

枚举r,倒着枚举l,依次把a[l]在权值数轴上点亮

然后经典问题维护连续区间个数,个数=点-边,边就是相邻两个都点亮了的,个数<=2合法

(tips:可以做到O(nlogn)……)

H

题意:每次把当前图的x->y->z->...->x且权值和<=3的环的权值变为0,然后持续操作直到不能变为止,求最短路

一开始会把三元环给边0,然后 三元环点->x->(y)->三元环点 的点变0,如此反复

可以发现权值变为0等于缩点,缩得的团内的边都是0,团外边位1,现在要模拟缩点的过程

记点x的入边对应团集合为In[x],出为Out[x],那么 团内点->x->(y)->团内点 的判定条件为 In[x]&Out[y]!=0,枚举x,y(若没有y则会枚举y=团内点,也可以判到),bitset优化判断即可

一共缩n次,每次枚举m条边,check复杂度n/ω,所以总复杂度O(n^2m/ω)

E

神题,我懂得欣赏

https://www.cnblogs.com/gmh77/p/18550020

C

可以发现树1是一条向左的链+每个点两个儿子,除第一层外每层两种点/颜色,一种可以向下扩展,一种不能

因为M>=3,树2的儿子数>=2,深度不超过logn,所以用到的颜色数不超过2logn+几

f[i,j]表示树2的点i颜色为j时的子树方案,合并子树就行

K

设值域为A

按位置根号分块,对一块维护值0~A经过该块后的结果

初始为0->0 1->1 2->2 ...,假设加入ai=2,发现变成2->0 1,3->1 0,4->2 5->3 ... 这样

意思就是,ai=2会把序列前2项“折叠”到后面并合并,并且这个合并效果可以叠加,实际的结构是一个并查集顶点的序列,一次折叠会让一些并查集合并


直接实现暴力折叠正确性没问题,但每次操作最多O(A),所以复杂度不行

考虑将折叠复杂度和折叠所减少的点个数挂钩:

①当折叠个数小于序列长度一半时,暴力折叠
②当折叠个数不小于序列长度一半时,把后面的元素向前折叠,然后O(1)翻转序列;若折叠长度很大,会直接翻转然后再平移(把最小值变成>0)

这样一次个数减少对应O(1)复杂度,一个块的总复杂度是O(A)的,可以通过


具体实现:维护序列头尾指针(头最小尾最大,按序+1),头元素的值sum(...->sum,头元素变成啥)

加入操作ai时,先用sum消ai(整体平移),若ai有余则进行翻转
ai<=(len-1)/2时暴力,ai∈((len-1)/2,len-1]时向前折叠并翻转(交换头尾指针),ai>=len-1时翻转,sum←A-(len-1)(平移,修改头的值)

J

先把点1移到原点,设另外两个点为(x1,y1),(x2,y2)

神奇结论(?):把(x1,y1),(x2,y2)设为复数v1=x1+y1i,v2=x2+y2i,g为gcd(v1,v2),那么v1/g和v2/g就是所求的新三角形

复数除法\(\frac{a+bi}{c+di}=\frac{ac+bd}{c^2+d^2}+\frac{bc-ad}{c^2+d^2}i\),整除定义为商的两个系数都是整数,gcd定义为模长最大的能整除v1,v2的复数

好像是基本操作,但是不会

考虑用辗转相除法求gcd,把取整除法(div,不是整除)定义为求让余数的模长最小的商,取模定义为v1-(v1/v2)*v2;这样不断模下去就可以让余数模长不断变小,直到变为0,那就是gcd(v1,0)=v1
(如果不让余数模长最小,可能会模长变大然后循环)

问题是怎么求取整除法,设\(x=\frac{ac+bd}{c^2+d^2},\;y=\frac{bc-ad}{c^2+d^2}\),取整结果为 \(x',y'\),那么余数实际就是 \((x-x')*v_2+(y-y')i*v_2\) ,让|x-x'|,|y-y'|各自最小就行,所以只要对xy随便取整一下然后±1抖动一下,让差值最小,这样得到的余数的模长就最小了

G

对每对(i,选0/1),(j,选0/1)的选法哈希判断是否冲突,连边跑2-sat

代码比较长(

B

注意到R<=1000,并且每个给定点之间距离至少为2

假设圆之间有交点,可以观察(?)到若有解则至少存在一个交点是合法解
(大概是不管怎么交,都找不到一个圆能把所有交点排除在外……)

所以对每个位置(x,y)的圆枚举[x-4,x+4]范围内的圆,然后求交,再对有交的交点在[x-4,x+4]中暴力check

听起来非常暴力,但实际第一步枚举只有O(R)的圆在内,之后有交的最多12个,所以第二部分枚举也是O(R),总复杂度O(nR)
实际因为范围是个圆所以远到不了R,估计是根号R之类的


若前面没有找到交点,那么任选一个圆,从圆心向(0,0)移2单位长度,得到的点如果在大圆外则无解(会包含整个大圆),否则就是解

posted @ 2024-11-16 22:50  gmh77  阅读(2)  评论(0编辑  收藏  举报