专栏文章
ARC207A Affinity for Artifacts 题解
AT_arc207_a题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mindme35
- 此快照首次捕获于
- 2025/12/02 00:41 3 个月前
- 此快照最后确认于
- 2025/12/02 00:41 3 个月前
设总成本为 ,第 个灯是第 个被点亮的。考虑每个灯节约了多少成本,则显然有:
考虑把 看作 类数, 看作 类数,将所有 和所有 扔进一个长度为 的数列 中并从大到小排序,每次选出一个 类数和 类数进行匹配,贡献为较小的数的值。
设 表示考虑到数列 的第 项,此时一共匹配了 对数,总贡献为 的方案数。转移时,首先根据 和前缀和数组,计算出未匹配的 类数数量 和未匹配的 类数数量 ,再根据 的类型分别处理:
- 若 为 类数:
- 若 :对 进行匹配,;
- 不对 进行匹配,。
- 若 为 类数:
- 若 :对 进行匹配,;
- 不对 进行匹配,。
初始化 。设 ,特判一下 和 的情况,答案即为 。
时间复杂度 。
Cconst int N=105,mod=998244353;
int n,x,a[N],s[N<<1][3],f[N<<1][N][N*(N-1)/2];
ll sum,v;
pii p[N<<1];
int get(int i,int j){
int a=s[i][1],b=s[i][2];
return b-a+j;
}
void add(int &a,int b){
a+=b;
if(a>=mod) a-=mod;
}
void solve(){
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
v=sum-x;
if(v<0) v=0;
if(v>n*(n-1)/2) v=n*(n-1)/2+1;
for(int i=1;i<=n;i++) p[i]={a[i],1},p[n+i]={i-1,2};
sort(p+1,p+n+n+1),reverse(p+1,p+n+n+1);
for(int i=1;i<=n+n;i++) for(int j=1;j<=2;j++) s[i][j]=s[i-1][j]+(p[i].se==j);
f[0][0][0]=1;
for(int i=0;i<n+n;i++){
for(int j=0;j<=min(s[i][1],s[i][2]);j++){
int x=s[i][1]-j,y=s[i][2]-j;
for(int s=0;s<=n*(n-1)/2;s++){
if(p[i+1].se==1){
if(y!=0) add(f[i+1][j+1][s+p[i+1].fi],1ll*f[i][j][s]*y%mod);
add(f[i+1][j][s],f[i][j][s]);
}
else{
if(x!=0) add(f[i+1][j+1][s+p[i+1].fi],1ll*f[i][j][s]*x%mod);
add(f[i+1][j][s],f[i][j][s]);
}
}
}
}
int ans=0;
for(int i=v;i<=n*(n-1)/2;i++) add(ans,f[n+n][n][i]);
cout<<ans<<endl;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...