NOI Online 2020 #1

序列

一个长度为 nn 的整数序列 a1na_{1 \dots n},判断能否通过若干次操作把它变成序列 bib_i

mm 种可选的操作,第 ii 种操作可使用三元组 (ti,ui,vi)(t_i,u_i,v_i) 描述:

  • ti=1t_i=1,则她可以使 auia_{u_i}avia_{v_i} 都加一或都减一;
  • ti=2t_i=2,则她可以使 auia_{u_i} 减一、avia_{v_i} 加一,或是 auia_{u_i} 加一、avia_{v_i} 减一,因此当 ui=viu_i=v_i 时,这种操作相当于没有操作。

每种操作可以无限次进行

对于测试点 151 \sim 5n=2n=2m=1m=1ai,bi99a_i,b_i \le 99u1v1u_1 \ne v_1t1=1t_1=1
对于测试点 6106 \sim 10n=2n=2m=1m=1ai,bi99a_i,b_i \le 99u1v1u_1 \ne v_1t1=2t_1=2
对于测试点 111211 \sim 12n=2n=2ai,bi99a_i,b_i \le 99uiviu_i \ne v_i
对于测试点 131613 \sim 16ti=2t_i=2
对于测试点 1717n,m20n,m \le 20
对于测试点 1818n,m103n,m \le 10^3
对于所有测试点:1T101 \le T \le 101n,m1051 \le n,m \le 10^51ai,bi1091 \le a_i,b_i \le 10^9ti{1,2}t_i \in \{1,2\}1ui,vin1\le u_i,v_i \le n

从部分分入手先看只有操作 22,操作 22 的特点就是一加一减,那么我们考虑把所有能联通的点缩点成为一个连通块,那么我们就发现对于同 11 个连通块,联通块内的每个点都可以任意变化,但前提是总和不变,因此对此类操作仅仅只需判断 a,ba,b 相对应的连通块内,点集之和是否相等

再看只有操作一,操作一是同加同减,很显然还是同一个连通块内的奇偶性不变,并且每个元素还能任意变化,还有集合中若划分为两集合,是集合对应操作,那么差值是不变的,因此只需判断奇偶是否相同即可,可是这个是有前提的,我们必须要划分出两个集合去判断。

直接推广到两操作混合。

序列通过操作已经分成若干集合,那么我们其实可以考虑二分图,连通块之间是否相等我们直接考虑对应元素做差,最主要的还是操作 22,因为二分图是最好能判断差值是否相等,若形不成那么就判断奇偶性是否相等。

1操作考虑并查集维护连通性,二操作考虑连边判断

O(T(n+m)α(n))O(T(n+m)\alpha(n))

α(n)4\alpha(n) \approx 4

冒泡排序

给定一个 1n1 ∼ n 的排列 pip_i,接下来有 mm 次操作,操作共两种:

  1. 交换操作:给定 xx,将当前排列中的第 xx 个数与第 x+1x+1 个数交换位置。
  2. 询问操作:给定 kk,请你求出当前排列经过 kk 轮冒泡排序后的逆序对个数。
    对一个长度为 nn 的排列 pip_i 进行一轮冒泡排序的伪代码如下:
1
2
3
for i = 1 to n-1:
if p[i] > p[i + 1]:
swap(p[i], p[i + 1])

2n,m2×1052 \leq n,m \leq 2 \times 10^5ti{1,2}t_i \in \{1,2\}1x<n1 \leq x < n0k<2310 \leq k < 2^{31}

众所周知冒泡排序是 O(n2)O(n^2),其本质就是单次交换逆序对减少 11,那么我们就发现对于一次操作所有元素 ii,在 <i<i 与其匹配的逆序对个数减小 11,因此查询操作是很简单的,就是对于逆序对相同的位置,他们肯定是在逆序对轮下他们是不动的,然后剩下的都 1-1,若记录 <i<i 与其匹配的逆序对个数为 xx,那么总的减少的就是 nxn-x

直接使用树状数组维护即可,好疑惑他为何要求一个前缀和?

考虑交换,交换根据实际意义逆序对的增减,放在树状数组上就好了。

最小环

打表找规律发现,无论 kk 为即,当原序列从小到大排序玩 iii+2i+2 连边是最优的,在发现,对于一个 kk 距离长度,本质不同的环只有 gcd(n,k)gcd(n,k),那么环长应该是 ngcd(n,k)\frac{n}{gcd(n,k)}

我们直接枚举环上每个新环的点,答案此时必然是最优的。

NOI Online 2020 #3

水壶

贪心求解即可。

问题转化为连续 k+1k+1 个数的和的最大值。

记前缀和 Si=j=1iajS_i=\sum_{j=1}^ia_j,则 ans=max{SiSik1k+1in}ans=\max\{S_i-S_{i-k-1}|k+1 \le i \le n \}

复杂度 O(n)O(n)

魔法值

给定 nn 节点无向图 G(V,E)G(V,E),初始点权为 fif_i,每回合第 ii 个点的点权为上一回合所有相邻节点的点权的异或值。

给定 qq 此询问,问第 xx 回合 11 号点的点权。

形式操作

fx,j=fv1,j1fv2,j1fvk,j1f_{x,j}=f_{v_1,j-1}\oplus f_{v_2,j-1}\oplus \cdots\oplus f_{v_k,j-1}

其中 j1j\ge 1v1,v2,,vkv_1,v_2,\cdots,v_k 是所有与 xx 号城市直接相连的城市,\oplus 为异或运算。

  • 对于 20%20\% 的数据,满足 ai100a_i \leq 100

O(qm)O(qm) 暴力

  • 对于 40%40\% 的数据,满足 n20n \leq 20
    O(n3qlogn)O(n^3 q \log n)

  • 另有 30%30\% 的数据,满足 m=n(n1)2m=\frac{n(n-1)}{2}

不会。

  • 对于 100%100\% 的数据,满足 1n,q1001 \leq n,q \leq 1001mn(n1)21 \leq m \leq \frac{n(n-1)}{2}1ai<2321\leq a_i < 2^{32}0fi<2320\leq f_i < 2^{32}

考虑二进制拆分,提前预处理。

O(n3qlogn)O(n2qlogn)O(n^3 q \log n) \rightarrow O(n^2 q \log n)

优秀子序列

给定长度为 nn 的非负整数序列 AA,求满组一下要求的子序列的贡献之和(子序列)不要求连续。

  • 对于任意 i,j[1,m]i ,j \in [1,m]iji \not ={j},满足 Bi&Bj=0B_i \And B_j=0
  • 贡献是 ϕ(1+i=1mBi\phi(1+\sum_{i=1}^mB_i

n106ai2×105n\le 10^6,a_i \le 2\times 10^5

分析

先考虑子序列中任意两个不同的数按位与等于0,说明相加不可能产生进位。

1+i=1mBi2181+\sum_{i=1}^mB_i\le2^{18}

d=log2max{Ai}d=\lfloor\log_2max\{A_i\}\rfloor

那么预处理 2182^{18} 的欧拉函数。

\dots

__END__