社区讨论
就 WA 1 个点,求调
AT_abc438_g[ABC438G] Sum of Min参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjr70lbq
- 此快照首次捕获于
- 2025/12/29 21:27 2 个月前
- 此快照最后确认于
- 2026/01/01 23:05 2 个月前
CPP
#include<bits/stdc++.h>
#define For(i,j,k) for(int i=j;i<=k;i++)
#define dFor(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
#define MAXN 400000
#define Mod 998244353
int n,m,a[MAXN],b[MAXN];
long long k;
int cnt=0,tot=0,pos[MAXN],id[MAXN];
vector<int> rt[MAXN],p[MAXN];
bool vis[MAXN];
struct Node{
int ls,rs;
int cnt,sum;
}tr[MAXN*32];
int clone(int c){
tr[++cnt]=tr[c];
return cnt;
}
int modify(int c,int L,int R,int x){
c=clone(c);
tr[c].cnt++;
tr[c].sum=(tr[c].sum+x)%Mod;
if(L==R) return c;
int mid=(L+R)/2;
if(x<=mid) tr[c].ls=modify(tr[c].ls,L,mid,x);
else tr[c].rs=modify(tr[c].rs,mid+1,R,x);
return c;
}
pair<int,int> operator +(pair<int,int> a,pair<int,int> b){
return {a.first+b.first,(a.second+b.second)%Mod};
}
pair<int,int> operator -(pair<int,int> a,pair<int,int> b){
return {a.first-b.first,(a.second-b.second+Mod)%Mod};
}
pair<int,int> query(int c,int L,int R,int x){
if(!c) return {0,0};
if(L==R) return {tr[c].cnt,0};
int mid=(L+R)/2;
if(x<=mid){
return pair<int,int>{tr[tr[c].rs].cnt,0}+query(tr[c].ls,L,mid,x);
}else{
return pair<int,int>{0,tr[tr[c].ls].sum}+query(tr[c].rs,mid+1,R,x);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
For(i,0,n-1){
cin>>a[i];
}
For(i,0,m-1){
cin>>b[i];
}
For(i,0,n-1){
if(vis[i]) continue;
tot++;
int x=i;
while(!vis[x]){
p[tot].push_back(x);
pos[x]=p[tot].size()-1;
id[x]=tot;
vis[x]=1;
x=(x+m)%n;
}
int sz=p[tot].size();
rt[tot].resize(sz*2);
rt[tot][0]=modify(0,1,1e9,a[i]);
For(j,1,sz-1){
rt[tot][j]=modify(rt[tot][j-1],1,1e9,a[p[tot][j]]);
}
For(j,0,sz-1){
rt[tot][j+sz]=modify(rt[tot][j+sz-1],1,1e9,a[p[tot][j]]);
}
}
int ans=0;
For(i,0,m-1){
if(k<i) break;
long long cnt=(k-1-i)/m+1;
int d=id[i%n],sz=p[d].size();
long long x=cnt/sz,y=cnt%sz;
if(x!=0){
pair<int,int> p=query(rt[d][sz-1],1,1e9,b[i]);
ans=(ans+x%Mod*p.first%Mod*b[i]%Mod)%Mod;
ans=(ans+x%Mod*p.second%Mod)%Mod;
}
if(y!=0){
pair<int,int> p=query(rt[d][pos[i%n]+y-1],1,1e9,b[i]);
if(pos[i%n]>0) p=p-query(rt[d][pos[i%n]-1],1,1e9,b[i]);
ans=(ans+1ll*p.first*b[i]%Mod)%Mod;
ans=(ans+p.second)%Mod;
}
}
cout<<ans<<endl;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...