RiOI-4上课 0pts求调
查看原帖
RiOI-4上课 0pts求调
642486
Compilation_Error楼主2024/9/8 18:35
#include <bits/stdc++.h>
using namespace std;
#define int long long

using ll = long long;

const int N = 1e6 + 5, MOD = 998244353, HSMOD = 1610612741, HSMOD2 = 998244353; // Remember to change

int n,q;

struct Node
{
	int l,r;
	Node()=default;
	Node(int l,int r):l(l),r(r){}
}a[N],b[N],c[N];

ll pre[N],suf[N],pre2[N],suf2[N];
ll vl[N],vr[N],vl2[N],vr2[N];
int cnt[N],cc[N];

long long qpow(long long a, long long b)
{
	long long res = 1ll, base = a;
	while (b)
	{
		if (b & 1ll) res = res * base % MOD;
		base = base * base % MOD;
		b >>= 1ll;
	}
	return res;
}

ll inv(ll a)
{
	return qpow(a, MOD - 2ll);
}

signed main()
{
	//freopen("*.in", "r", stdin);
	//freopen("*.out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].l>>a[i].r;
		b[i]=c[i]=a[i];
		cc[a[i].l]++,cc[a[i].r+1]--;
	}
	for(int i=0;i<=(int)1e6;i++)
	{
		cnt[i]=(i?cnt[i-1]:0)+cc[i];
	}
	sort(b+1,b+n+1,[&](const auto& x,const auto&y){return x.r<y.r;});
	sort(c+1,c+n+1,[&](const auto& x,const auto&y){return x.l<y.l;});
	for(int i=1;i<=n;i++) pre[i]=(pre[i-1]+(1ll*b[i].r*b[i].r)),pre2[i]=(pre2[i-1]+b[i].r);
	for(int i=n;i>=1;i--)
	{
		suf[i]=(suf[i+1]+(1ll*c[i].l*c[i].l));
		suf2[i]=(suf2[i+1]+c[i].l);
	}
	for(int i=0;i<=(int)1e6;i++)
	{
		// r<i 的 r^2 之和 
		int l=1,r=n,pos=0;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(b[mid].r<i) pos=mid,l=mid+1;
			else r=mid-1;
		}
		vr[i]=pre[pos];
		vr2[i]=pre2[pos];
		// l>i的l^2之和 
		l=1,r=n;
		pos=n+1;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(c[mid].l>i) pos=mid,r=mid-1;
			else l=mid+1;
		}
		vl[i]=suf[pos];
		vl2[i]=suf2[pos];
	}
	ll invn=inv(n);
	while(q--)
	{
		ll x;
		cin>>x;
		int l=0,r=(int)1e6,pos=-1;
		ll ns=-1;
		while(l<=r)
		{
			int mid=l+r>>1;
			ll s=1ll*cnt[mid]*mid+vl2[mid]+vr2[mid];
			if(s>=x) pos=mid,r=mid-1,ns=s;
			else l=mid+1;
		}
		ll ret=1ll*cnt[pos]*pos%MOD*pos%MOD+vl[pos]%MOD+vr[pos];
		ret%=MOD;
		ret=(ret-(pos*pos%MOD)+MOD)%MOD;
		ll nd=(ns-x);
		ret=ret+((pos-nd)*(pos-nd)%MOD);
		ret%=MOD;
		ret=ret*invn%MOD;
		ll ss=x*invn%MOD;
		ss=(ss*ss)%MOD;
		cout<<(ret-ss+MOD)%MOD<<"\n";
	}
	return 0;
}





2024/9/8 18:35
加载中...