ARC200 小记
A (Dot Product)
题意
给定 \(n,a_{1\sim n},b_{1\sim n}\),求 \(x_{1\sim n}\),使得:
-
\(x_i\in [-10^8,10^8]\)
-
\(\sum \limits a_ix_i>0\)
-
\(\sum \limits b_ix_i<0\)
\(1\le n,a_i,b_i\le 2\times 10^5\)
题解
多枚举思路容易想到分析二元情况(不过我有点唐初始分析错了)。
发现若 \(\frac{a_i}{b_i}<\frac{a_j}{b_j}\),可以构造 \((x_i,x_j)=(-a_i-b_i,a_j+b_j)\)。
于是若 \(\frac{a_i}{b_i}\) 全相等则无解,否则如上构造。
B (LCM)
题意
给定 \(a_1,a_2,a_3\),记 \({\cal{Len}(x)}\) 表示 \(x\) 的位数。
请判断是否存在正整数 \(x,y\),满足:\({\cal{Len}}(x)=a_1,{\cal{Len}}(y)=a_2,{\cal{Len}}(\text{lcm}(x,y))=a_3\)。若存在给出构造。
\(1\le a_1,a_2,a_3\le 17\)
题解
估计大小:\(\max(x,y)\le \text{lcm}(x,y)\le xy\)。于是 \(\max(a_1,a_2)\le a_3\le a_1+a_2\),否则无解。
不妨 \(a_1\le a_2\),接下来尝试构造所有有解。
我们假设一个基本结构:\(x=p10^u,y=q10^v,p,q,10\) 两两互质,\({\cal{Len}}(p)+u=a_1,{\cal{Len}}(q)+v=a_2\)。
则 \({\cal{Len}}(\text{lcm}(x,y))={\cal{Len}}(\text{lcm}(p,q))+\max(u,v)=a_3\)。
但是 \({\cal{Len}}(\text{lcm}(p,q))\) 仍然不好刻画。我们钦定 \(p=1\) 或 \(q=1\)。
稍微分析一下,我们可以构造:\(x=10^{a_1-1},y=10^{a_1+a_2-a_3-1}(10^{a_3+1-a_1}-1)\)。
- 但是此时 \(a_1+a_2=a_3\) 就坠机了。
随便想想,构造 \(x=5\times 10^{a_1-1}+1,y=5\times 10^{a_2-1}\) 即可。这样能避免 \(a_1,a_2=1\) 的 Corner Case。
C (Movie Theater)
题意
给定 \(n\) 和两个长为 \(n\) 的序列 \(l_{1\sim n},r_{1\sim n}\)。
一家电影院有 \(n\) 个座位,从左到右排成一排。
\(n\) 个人依次来这家电影院看电影。你为每个人分配了一个座位。假设 \(p_i\) 是分配给 \(i\) 的座位。
\(i\) 在 \(l_i\) 到达,穿过座位 \(1, 2, \dots, p_i - 1\) 坐到座位 \(p_i\)。在 \(r_i\) 离开,穿过座位 \(1, 2, \dots, p_i - 1\) 离开。
在开区间 \((l_i,r_i)\) 的时间段内,其他人穿过座位 \(p_i\) 的次数就是 \(i\) 的不满意。
求 \(1\sim n\) 的字典序最小排列 \(p\),使得从 \(1\) 到 \(n\) 的所有人的总不满意度最小。
\(1\le n\le {\color{red}{5\times 10^5}},1\le l_i,r_i\le 2n\),保证所有 \(l_i,r_i\) 互不相同。
题解
这里给出一个 \(\mathcal{O}(n\log n)\) 的做法。
这题发现对一对点算贡献比较好刻画。
考虑第 \(i\) 个人和第 \(j\) 个人之间的贡献。令 \(S_i=[l_i,r_i]\)。
- 若 \(S_i\) 和 \(S_j\) 不相交,则不会产生贡献;
- 若 \(S_i\) 和 \(S_j\) 相交但不包含,则贡献恒为 \(1\);
- 若 \(S_i\) 包含了 \(S_j\),则 \(j\) 的座位在 \(i\) 前面更优,否则会产生 \(2\) 的贡献。
因此对于包含区间 \(S_j \sube S_i\),要求 \(p_j < p_i\),把图建出来是一个 DAG,那就是要求字典序最小的 逆拓扑序,也就是前置题目。
具体做法就是把图 建反图,每次找到入度被清零的 编号最大 的点,拓扑序倒序 放入这个点,用堆维护编号最大。
这个做法看着很违反直觉,具体证明和思路最后再说。
但是这样直接建图是 \(\mathcal{O}(n^2)\) 的,我们考虑 数据结构优化建图。
反图的连边 是形如 \(l_i\le l_j,r_j\le r_i\Rightarrow i\to j\)。
考虑二维数点咋做这题就咋做。
按照 \(r\) 从小到大扫描,每次 加入 就往 \(l_x\) 前缀 对应树状数组节点加入点 \(x\)。
加入就是类似前缀和连边。设当前树状数组某个点 \(i\) 代表了 \(b_i=u\),那么新建点 \(v\),连边 \(v\to u,v\to x\),然后 \(b_i=v\)。
然后 查询 就找到 \(l_x\) 后缀 对应的树状数组节点,连边 \(x\to b_i\) 即可。
前缀对应的树状数组节点形如 for(;w;w&=(w-1)),后缀形如 for(;w<=2*n;w+=w&-w)。
这样点边数均为 \(\mathcal{O}(n\log n)\)。然后注意加入的 虚点 用队列而不是堆维护,避免退化到 \(\mathcal{O}(n\log^2 n)\)。
来看最小的 逆拓扑序,最朴素的想法是每次找到入度被清零的,编号最小的点加入。
- 但是小的点藏在很大的点后面就坠机了。
考虑逆序字典序的限制依次形如:\(1\) 放的位置最小,\(2\) 放的位置最小,一直到 \(n\) 放的位置最小。
考虑 原图中出度 为 \(0\) 的所有点,把其他的放入 \(n\) 一定劣与放最大的。并且这些点的放置不影响其他点!
于是每次放最大的,删除递归即可。就是上面说的过程。
D (|A + A|)
题意
给定 \(m,k\),判断是否存在 \(n\) 以及数列 \(a_{1\sim n}\),使得:
并且 \(n\in [1,m],a_i\in [0,m-1],a_i\) 两两不同。如果可以要求给出构造。
\(T\) 组多测,\(T,\sum m\le 2\times 10^5,0\le k\le m\)
题解
猜一手合法的 \(k\) 很多。摸一些构造:
当 \(k\) 是奇数的时候,构造 \(\left\{0,1,2,\cdots,\frac{k-1}{2}\right\}\) 即可覆盖 \([0,k-1]\)。
然后经典套路是挖掉一个数变成 偶数,这里显然考虑挖掉 \(1\)。
构造 \(\left\{0,2,3,\cdots,\frac{k}{2}\right\}\) 即可覆盖 \([0,k]\backslash\{1\}\)。
注意这里 \(2,3\) 必须出现,即 \(k\ge 6\)。
考虑 \(k=2\),容易发现当且仅当 \(2\mid m\),构造 \(\left\{0,\frac{m}{2}\right\}\) 即可。
考虑 \(k=4\),打表发现 当且仅当 \(4\mid m\) 成立,构造 \(\left\{0,\frac{m}{4},\frac{2m}{4},\frac{3m}{4}\right\}\) 即可。
具体证明考虑当 \(k=4\) 时,集合大小只能是 \(3,4\),然后分讨哪几个相等。
E (popcount <= 2)
题意
\(T\) 组多测,给定 \(n,m\),求长度为 \(n\),值域为 \([0,2^m-1]\) 的数列 \(a\) 的个数,满足:
对 \(P=998244353\) 取模。
\(T\le 2\times 10^5,2\le n,m<P\)
题解
接下去用 \(pc\) 表示 \(\text{popcount}\)。
不妨所有数异或第一个数,即 \(a_1=0\)。这样限制了所有数 \(pc\le 2\),答案 \(\times 2^m\)。
分讨 \(pc=2\) 的数集长啥样。
没有 \(pc=2\)
一个 \(pc=2\)
首先 \(2^x+2^y\) 中,选择 \(x,y\) 的方案数有 \(\dbinom{m}{2}\)。
于是 \(a_{2\sim n}\) 的选择范围为:\(\{0,2^x,2^y,2^x+2^y\}\),并且 \(2^x+2^y\) 必须出现。
容斥一下,方案数为 \(4^{n-1}-3^{n-1}\)。
\(pc=2\) 的数异或和为 \(0\)
具体的,\(pc=2\) 的数形如:\(S=\{2^x+2^y,2^y+2^z,2^z+2^x\}\),\(x,y,z\) 的选法共 \(\dbinom{m}{3}\) 种。
你发现不能有 \(pc=1\) 的数。
于是 \(a_{2\sim n}\) 的选择范围为:\(S\cup \{0\}\),并且 \(S\) 中数必须出现。
你钦定 \(T\sube S\) 的数 不出现,方案数为 \(f(T)=(4-|T|)^{n-1}\)。
其他情况
钦定 \(x\),答案 \(\times m\)。你先假设有俩 \(2^x+2^y,2^x+2^z\),然后不能有 \(2^y+2^z\)。
摸摸性质,发现其他数必定为 \(2^x+2^t\),否则就能异或出 \(pc>2\)。
于是 \(a_{2\sim n}\) 的选择范围为:\(S=\{0,2^x\}\cup\{2^x+2^{t}:t\neq x\}\)。并且一定要出现至少两个不同的 \(2^x+2^t\)。
定义恰好 \(x\) 个的方案数为 \(f(x)\),则 \(ANS=all-f(0)-f(1)\)。
显然 \(all=(m+1)^{n-1},f(0)=2^{n-1}\)。
考虑 \(f(1)\),有 \(m-1\) 种选择 \(t\) 的方案数,接下来每个数在 \(\{0,2^x,2^{x}+2^t\}\) 中选择,\(2^{x}+2^t\) 至少出现一个。
即 \(f(1)=(m-1)(3^{n-1}-2^{n-1})\)。
把这几个答案加起来 \(\times 2^m\) 就是最终答案。

浙公网安备 33010602011771号