NOIP 模拟赛:2024-11-18

福利场。

T1:

题意:\(n\times n\) 棋盘放 \(k\) 个主教。问多少个格子被攻击了。

对每个从对角线维护 \(dp[i]\) 表示这条对角线有多少个不被攻击。可以从两边往递推。

T2:

题意:两人博弈。给定矩阵,先手每次挑一行删掉,后手每次挑一列删掉。先手想最大化最后的数,后手想最小化最后的数。问最后的数是多少。

行最小值的最大值。

T3:

\(n\le 10^5\)

因为 \(n<2^{17}=131072\),所以我们可以使用 \(131072,262144\) 保证不重复。

显然度数为偶数的没用,然后令 \(now=\) 剩余被固定的与 \(n\) 的异或值。记剩余未被固定的数个数为 \(cnt\)

当前目标:构造 \(cnt\) 个数是它们异或为 \(now\)

  1. \(cnt=0\),若 \(now\neq 0\) 无解,否则直接输出。

  2. \(cnt=1\),若 \(now\) 被用过了误解,否则让这个未被固定的等于 \(now\),输出。

  3. \(cnt=2\),若 \(now=0\) 无解,否则让一个的 \(2^0\sim 2^{16}\) 部分 \(=now\),输出。

  4. \(cnt>2\)。若 \(cnt\) 为偶数,每个未固定的都先加上 \(131072\);若 \(cnt\) 为奇数,第一个加上 \(131072+262144\),第二个加上 \(262144\),之后都加上 \(131072\)

然后使第二个到最后一个的低位部分随便选(例如选 \(1\sim sz\))。记这堆随便选的数的异或和为 \(sum\)。然后让第一个的低位部分等于 \(sum\bigoplus now\) 即可。

坑点:正整数。

T4:

注意到修改的位置只可能是某类数的第一个,且只会改成已有的数。

分类:若改成前面已有的数,可以用 set 简单维护最大贡献;若改成后面已有的数,用两颗线段树维护 \(\le a[i],>a[i]\) 的两种贡献,和 \(a[i]\) 无关的贡献都丢到线段树上统计,在两颗线段树上区间查询即可。

posted @ 2024-11-18 11:21  FLY_lai  阅读(0)  评论(0编辑  收藏  举报