社区讨论

就 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 条回复,欢迎继续交流。

正在加载回复...