做题记录 25.3.20

\(\textcolor{blue}\odot\) CF1984F Reconstruction

\(b_0=b_{n+1}=0\)\(s_0=\text P\)\(s_{n+1}=\text S\)

对于每个 \(1\le i\le n+1\),设 \(\sum a_i=sm\)

  • \(s_{i-1}=\text P,s_i=\text P\),则要求 \(a_i=b_i-b_{i-1}\in[-m,m]\)
  • \(s_{i-1}=\text P,s_i=\text S\),则要求 \(b_i+b_{i-1}=sm\)
  • \(s_{i-1}=\text S,s_i=\text P\),则要求 \(b_i+b_{i-1}-sm\in[-2m,2m]\)
  • \(s_{i-1}=\text S,s_i=\text S\),则要求 \(a_i=b_{i-1}-b_i\in[-m,m]\)

由于 \(s_0=\text P\)\(s_{n+1}=\text S\),对于给定的 \(s_{1\sim n}\) 一定含有 \(\text {PS}\),即 \(sm\) 一定可以确定

\(sm\) 的取值只有 \(b_i+b_{i+1}\;(0\le i\le n)\) 共不超过 \(n+1\) 种(需要去重)

枚举 \(sm\),分别求出方案数(显然 \(sm\) 不同的方案一定不同)

\(f_{i,0}\) 表示 \(s_i\)\(\text P\) 的方案数,\(f_{i,1}\) 表示取 \(\text S\) 的方案数,容易 \(O(n)\) \(dp\) 求出一个 \(sm\) 的贡献

时间复杂度 \(O(n^2)\)

代码

参考

\(\textcolor{purple}\odot\) CF1986G2 Permutation Problem (Hard Version)

\(a_i=\frac i{\gcd(i,p_i)}\)\(b_i=\frac {p_i}{\gcd(i,p_i)}\),则转化为计算 \(\sum_{1\le i<j\le n}[a_i\mid b_j][b_i\mid a_j]\)

显然

\[\sum_{1\le i<j\le n}[a_i\mid b_j][b_i\mid a_j]=\frac12 \left(\sum_{i=1}^n\sum_{j=1}^n[a_i\mid b_j][a_j\mid b_i]-\sum_{i=1}^n[a_i\mid b_i]\right) \]

问题转化为求 \(\sum_{i=1}^n\sum_{j=1}^n[a_i\mid b_j][a_j\mid b_i]\)

\(B(x)=\{b_i\mid a_i=x\}\)\(A(x)=\{a_i\mid b_i=x\}\)

枚举 \(ai(1\le ai\le n)\),令 \(cnt_{aj}=\sum_{i}[a_i=ai][aj\mid b_i]\)(每计算一个 \(ai\) 时枚举 \(bi\in B(ai)\),然后枚举 \(d(d\mid bi)\),处理完一个 \(ai\) 后清空),枚举 \(bj(ai\mid bj)\),枚举 \(aj(aj\in A(bj))\),答案累加 \(cnt_{aj}\)

可证时间复杂度为 \(O(n\ln n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1983F array-value

二分答案,设值为 \(M\),则转化为查询有多少区间的权值 \(\le M\)

发现若区间 \([l,r]\) 合法则 \([l-1,r]\)\([l,r+1]\) 也合法,因此对于每个右端点求出最大的左端点使得区间合法

设右端点为 \(r\) 时左端点为 \(lp_r\),则 \(lp_r=\max(lp_{r-1},\max_{l\le r,a_l\oplus a_r\le M} l)\),其中后一项可以用字典树维护

时间复杂度 \(O(n\log^2 V)\)

代码

参考

posted @ 2025-03-21 07:10  Hstry  阅读(2)  评论(0)    收藏  举报