NOI Online 2020 #1
序列
一个长度为 n 的整数序列 a1…n,判断能否通过若干次操作把它变成序列 bi。
有 m 种可选的操作,第 i 种操作可使用三元组 (ti,ui,vi) 描述:
- 若 ti=1,则她可以使 aui 与 avi 都加一或都减一;
- 若 ti=2,则她可以使 aui 减一、avi 加一,或是 aui 加一、avi 减一,因此当 ui=vi 时,这种操作相当于没有操作。
每种操作可以无限次进行
对于测试点 1∼5:n=2,m=1,ai,bi≤99,u1=v1,t1=1。
对于测试点 6∼10:n=2,m=1,ai,bi≤99,u1=v1,t1=2。
对于测试点 11∼12:n=2,ai,bi≤99,ui=vi。
对于测试点 13∼16:ti=2。
对于测试点 17:n,m≤20。
对于测试点 18:n,m≤103。
对于所有测试点:1≤T≤10,1≤n,m≤105,1≤ai,bi≤109,ti∈{1,2},1≤ui,vi≤n。
从部分分入手先看只有操作 2,操作 2 的特点就是一加一减,那么我们考虑把所有能联通的点缩点成为一个连通块,那么我们就发现对于同 1 个连通块,联通块内的每个点都可以任意变化,但前提是总和不变,因此对此类操作仅仅只需判断 a,b 相对应的连通块内,点集之和是否相等。
再看只有操作一,操作一是同加同减,很显然还是同一个连通块内的奇偶性不变,并且每个元素还能任意变化,还有集合中若划分为两集合,是集合对应操作,那么差值是不变的,因此只需判断奇偶是否相同即可,可是这个是有前提的,我们必须要划分出两个集合去判断。
直接推广到两操作混合。
序列通过操作已经分成若干集合,那么我们其实可以考虑二分图,连通块之间是否相等我们直接考虑对应元素做差,最主要的还是操作 2,因为二分图是最好能判断差值是否相等,若形不成那么就判断奇偶性是否相等。
1操作考虑并查集维护连通性,二操作考虑连边判断
O(T(n+m)α(n))
α(n)≈4
冒泡排序
给定一个 1∼n 的排列 pi,接下来有 m 次操作,操作共两种:
- 交换操作:给定 x,将当前排列中的第 x 个数与第 x+1 个数交换位置。
- 询问操作:给定 k,请你求出当前排列经过 k 轮冒泡排序后的逆序对个数。
对一个长度为 n 的排列 pi 进行一轮冒泡排序的伪代码如下:
1 2 3
| for i = 1 to n-1: if p[i] > p[i + 1]: swap(p[i], p[i + 1])
|
2≤n,m≤2×105,ti∈{1,2},1≤x<n,0≤k<231。
众所周知冒泡排序是 O(n2),其本质就是单次交换逆序对减少 1,那么我们就发现对于一次操作所有元素 i,在 <i 与其匹配的逆序对个数减小 1,因此查询操作是很简单的,就是对于逆序对相同的位置,他们肯定是在逆序对轮下他们是不动的,然后剩下的都 −1,若记录 <i 与其匹配的逆序对个数为 x,那么总的减少的就是 n−x。
直接使用树状数组维护即可,好疑惑他为何要求一个前缀和?
考虑交换,交换根据实际意义逆序对的增减,放在树状数组上就好了。
最小环
打表找规律发现,无论 k 为即,当原序列从小到大排序玩 i 向 i+2 连边是最优的,在发现,对于一个 k 距离长度,本质不同的环只有 gcd(n,k),那么环长应该是 gcd(n,k)n。
我们直接枚举环上每个新环的点,答案此时必然是最优的。
NOI Online 2020 #3
水壶
贪心求解即可。
问题转化为连续 k+1 个数的和的最大值。
记前缀和 Si=∑j=1iaj,则 ans=max{Si−Si−k−1∣k+1≤i≤n}
复杂度 O(n)
魔法值
给定 n 节点无向图 G(V,E),初始点权为 fi,每回合第 i 个点的点权为上一回合所有相邻节点的点权的异或值。
给定 q 此询问,问第 x 回合 1 号点的点权。
形式操作:
fx,j=fv1,j−1⊕fv2,j−1⊕⋯⊕fvk,j−1
其中 j≥1,v1,v2,⋯,vk 是所有与 x 号城市直接相连的城市,⊕ 为异或运算。
- 对于 20% 的数据,满足 ai≤100。
O(qm) 暴力
不会。
- 对于 100% 的数据,满足 1≤n,q≤100,1≤m≤2n(n−1),1≤ai<232,0≤fi<232。
考虑二进制拆分,提前预处理。
O(n3qlogn)→O(n2qlogn)
优秀子序列
给定长度为 n 的非负整数序列 A,求满组一下要求的子序列的贡献之和(子序列)不要求连续。
- 对于任意 i,j∈[1,m],i=j,满足 Bi&Bj=0。
- 贡献是 ϕ(1+∑i=1mBi。
n≤106,ai≤2×105
分析
先考虑子序列中任意两个不同的数按位与等于0,说明相加不可能产生进位。
即 1+∑i=1mBi≤218
设 d=⌊log2max{Ai}⌋
那么预处理 218 的欧拉函数。
…
__END__