ARC 好题精选 1
【未完稿】
AT_arc111_c [ARC111C] Too Heavy
有 \(N\) 个人,编号为 \(1\) 到 \(N\),以及 \(N\) 个编号同样为 \(1\) 到 \(N\) 的行李。第 \(i\) 个人的体重为 \(a_i\),第 \(j\) 个行李的重量为 \(b_j\)。一开始,第 \(i\) 个人拿着编号为 \(p_i\) 的行李。你可以进行如下操作若干次(可以为 \(0\) 次),使得最终每个人都拿着与自己编号相同的行李。
- 选择 \(i, j\ (i \neq j)\),交换第 \(i\) 个人和第 \(j\) 个人手中的行李。
但是,如果某个人拿着的行李重量大于等于自己的体重,他就会感到疲劳,之后不能再参与任何操作(即不能再被选为 \(i\) 或 \(j\))。特别地,如果 \(a_i \leq b_{p_i}\),那么这个人一开始就无法参与任何操作。
请判断是否存在满足条件的操作序列。如果存在,请构造一个操作次数最少的方案。
其中 \(K\) 为操作次数,\(i_t, j_t\) 表示第 \(t\) 次操作选择的两个人的编号。
如果有多种方案,输出任意一种均可。
- \(1 \leq N \leq 200000\)
- \(1 \leq a_i, b_i \leq 10^9\)
- \(p\) 是 \(1, \ldots, N\) 的一个排列
sol
考虑 \(i\) 向 \(p_i\) 连边,一定得到多个互不相交的多元环。
如果某个 \(i\) 已经拿对了,即 \(p_i=i\) 那么就是一个自环:\(i \to i\),可以认为它已经解决,不需要操作。
从一个 \(a_i\) 最小的点开始操作,肯定不会阻挡后面的点进行操作。
实际上实现时不需要每次重新找最小值,直接把所有点按照 \(a_i\) 从小到大排序,然后依次处理即可。
AT_arc106_d [ARC106D] Powers
给定一个长度为 \(N\) 的整数序列 \(A = (A_1, A_2, \cdots, A_N)\) 和一个整数 \(K\)。
对于每一个满足 \(1 \le X \le K\) 的整数 \(X\),请计算以下值:
\[\left(\sum_{L=1}^{N-1} \sum_{R=L+1}^{N} (A_L + A_R)^X\right) \bmod 998244353
\]
- 输入均为整数。
- \(2 \le N \le 2 \times 10^5\)
- \(1 \le K \le 300\)
- \(1 \le A_i \le 10^8\)
sol
\[\begin{aligned}
\sum_{1\le L<R\le N}(A_L+A_R)^x
&=
\sum_{L=1}^{N-1}\sum_{R=L+1}^{N}(A_L+A_R)^x\\
&=
\sum_{L=1}^{N-1}\sum_{R=L+1}^{N}
\sum_{k=0}^{x}\binom{x}{k}A_L^kA_R^{x-k}\\
&=
\sum_{k=0}^{x}\binom{x}{k}\sum_{L=1}^{N-1}\sum_{R=L+1}^{N}A_L^kA_R^{x-k}\\
\end{aligned}
\]
不难发现,\(L,R\) 是对称的:
\[\sum_{1\le L<R\le N}(A_L+A_R)^x
=
\frac{1}{2}
\sum_{k=0}^{x}\binom{x}{k}
\left[
\left(\sum_{i=1}^{N}A_i^k\right)
\left(\sum_{i=1}^{N}A_i^{x-k}\right)
-
\sum_{i=1}^{N}A_i^x
\right]
\]
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int n,K;
int a[200005];
int f[305][200005];
int g[305];
int ft[305],invft[305];
int f1[305];
int qpow(int a,int b){
int h=a,ans=1;
while(b){
if(b&1) ans*=h,ans%=mod;
h*=h;
h%=mod;
b>>=1;
}
return ans;
}
signed main(){
cin>>n>>K;
ft[0]=invft[0]=1;
for(int i=1;i<=300;i++){
ft[i]=ft[i-1]*i;
ft[i]%=mod;
invft[i]=qpow(ft[i],mod-2);
}
for(int i=1;i<=n;i++){
cin>>a[i];
f[0][i]=1;
f[1][i]=a[i];
for(int j=2;j<=300;j++){
f[j][i]=f[j-1][i]*a[i];
f[j][i]%=mod;
}
}
for(int k=0;k<=300;k++){
for(int i=1;i<=n;i++){
f1[k]+=f[k][i];
f1[k]%=mod;
}
}
for(int i=1;i<=K;i++){
int w=0;
for(int k=0;k<=i;k++){
int h=qpow(2,mod-2);
h*=ft[i];
h%=mod;
h*=invft[k];
h%=mod;
h*=invft[i-k];
h%=mod;
int ans=0;
int r=1;
r*=f1[k];
r%=mod;
r*=f1[i-k];
r%=mod;
r-=f1[i];
r=(r+mod)%mod;
h*=r;
h%=mod;
w+=h;
w%=mod;
}
g[i]=w;
}
for(int i=1;i<=K;i++){
cout<<g[i]<<endl;
}
return 0;
}
easy42
OI / C++ / Algorithm
懒惰者出局。
OI / C++ / Algorithm
懒惰者出局。

浙公网安备 33010602011771号