玄关求助,马蜂良好
  • 板块P10511 方差
  • 楼主XYzero
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/14 18:42
  • 上次更新2024/8/14 20:57:34
查看原帖
玄关求助,马蜂良好
917025
XYzero楼主2024/8/14 18:42

60pts求调

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 2e5 + 10;
const ll mod = 998244353;
// ans = -(a_l + ....+ a_r) ^ 2 + n(a_l ^ 2 + ....+ a_r ^ 2) 
ll n,m,q,pre[M],pre1[M],pre2[M],L,R;
struct seq{
	ll l,r;
	ll val;
}a[M];
bool cmp(seq a,seq b)
{
	return a.r < b.r;
}
int main(){
	//freopen("sample1.in","r",stdin);
	//freopen("ans.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin >> n >> m >> q;
	for(int i = 1;i <= m;i++){
		cin >> a[i].l >> a[i].r >> a[i].val;
	}
	sort(a + 1,a + 1 + m,cmp);
	for(int i = 1;i <= m;i++){
		ll len = (a[i].r - a[i].l + 1) % mod;
		a[i].val %= mod;
		pre[i] = (pre[i - 1] + len) % mod;
		pre1[i] = (pre1[i - 1] % mod + len * a[i].val % mod) % mod;
		pre2[i] = (pre2[i - 1] % mod + a[i].val % mod * a[i].val % mod * len) % mod;
	}
	for(int i = 1;i <= q;i++){
		cin >>  L >> R;
		ll l,r,pos1,pos2;
		pos2 = lower_bound(pre + 1,pre + 1 + m,R) - (pre);
	    pos1 = lower_bound(pre + 1,pre + 1 + m,L) - (pre);
	    ll ans = 0,res1 = 0,res2 = 0;
	    if(pos1 == pos2){
	    	cout << "0\n";
	    	continue;
		}
	    if(pre[pos1] == L){
	    	res1 += a[pos1].val % mod;
	    	res2 += a[pos1].val % mod * a[pos1].val % mod;
		}
		else{
			ll id = (L - pre[pos1 - 1]) % mod;
			ll len = (a[pos1].r - a[pos1].l + 1) % mod - id + 1;
			res1 += len * a[pos1].val % mod;
			res2 += len * a[pos1].val % mod * a[pos1].val % mod;
		}
		if(pre[pos2] == R){
			ll len = (a[pos2].r - a[pos2].l + 1) % mod;
			res1 += a[pos2].val * len % mod;
			res2 += a[pos2].val % mod * a[pos2].val % mod * len % mod;
		}
		else{
			ll id = (R - pre[pos2 - 1]) % mod;
		    res1 += a[pos2].val * id % mod;
		    res2 += a[pos2].val % mod * a[pos2].val % mod * id % mod;
		}
		if(pos2 - pos1 > 1){
			res1 += (pre1[pos2 - 1] % mod - pre1[pos1] % mod + mod) % mod;
			res2 += (pre2[pos2 - 1] % mod - pre2[pos1] % mod + mod) % mod;
		} 
		res1 %= mod;
		res2 %= mod;
		ans = (-(res1 * res1 % mod) + ((R - L + 1) % mod * res2 % mod) + mod) % mod;
		cout << (ans + mod) % mod << "\n";
	}
	
	return 0;
}
2024/8/14 18:42
加载中...