不如元神
查看原帖
不如元神
578004
02Ljh楼主2024/9/9 09:47

WA on subtask #3 #5 求调

感觉是取模问题 因为把 int 换成 __int128 就过 #3 了 但是始终调不出来。

// 前を向け 終わらないさ 
// 一生僕らは生きて征け
#include <bits/stdc++.h>
using namespace std;
#define INF 100000000001
#define ull unsigned long long
#define ll long long
#define WA cerr<<"meowww!\n";
#define eps 1e-5
#define none -1145141919
#define pii pair<int,int>
#define Y cout<<"Yes\n";
#define N cout<<"No\n";
#define H cout<<"\n";
#define WH cerr<<"\n";
#define fi first
#define se second
#define C continue;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define Rof(i,a,b) for(int i=(a);i>=(b);--i)
#define ROF(i,a,b) for(int i=(a);i>(b);--i)
#define G(i,p) for(auto i:pq[p])
#define VG(i,p) for(int i=0;i<pq[p].size();i++)
#define pb push_back
#define pk pop_back
#define WR(x) cerr<<(x)<<"\n";
#define MAXN 2000001
#define int long long
const int MOD=998244353;
void MD(int &x) { if(x<0) x+=MOD; if(x>=MOD) x%=MOD; return ; }
void Umn(int &x,int y) { if(x>y) x=y; return ; }
void Umx(int &x,int y) { if(x<y) x=y; return ; }
int n,q; pii a[MAXN];  int tg[MAXN],ef[MAXN]; int m=0;
int avg[MAXN],vl[MAXN]; int bx[MAXN];
int ksm(int x,int y) { int rt=1; 
while(y) { rt=(y%2)?(rt*x%MOD):(rt); x=x*x%MOD; y>>=1; } return rt%MOD; }
int ny;
int st=INF;
struct upd{int sum,ag,val;};
upd Upd(upd x,int num,int an)
{
    upd rt;
    rt.sum=x.sum+num; rt.ag=((x.ag*n)%MOD+num)%MOD*ny%MOD;
    rt.val=x.val+(num*((2*(an-1)%MOD+1-2*(x.ag)%MOD+MOD)%MOD)%MOD)%MOD*ny%MOD;
    MD(rt.val);
    rt.val+=((rt.sum*2%MOD-((x.ag+rt.ag)%MOD*n%MOD)%MOD+MOD)%MOD)%MOD*(x.ag-rt.ag+MOD)%MOD*ny%MOD;
    MD(rt.val);
    return rt;
}
int qans(int x)
{
    int ps=lower_bound(ef,ef+m-st+1,x)-ef;
    if(ef[ps]>x) --ps; //WR(ef[ps]);
    assert(ps+st+1>=0&&x-ef[ps]>=0&&ps>=0);
    upd tp=Upd({ef[ps],avg[ps],vl[ps]},x-ef[ps],ps+st+1);
    return tp.val;
}
 main()
{
    //freopen("in2.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 
    cin>>n>>q; ny=ksm(n,MOD-2); For(i,1,n) { cin>>a[i].fi>>a[i].se; Umn(st,a[i].fi); 
    ef[0]+=a[i].fi; Umx(m,a[i].se); tg[a[i].fi+1]++,tg[a[i].se+1]--; }
    //WR(ny);
    For(i,0,m) tg[i]+=tg[i-1];//st->m
    avg[0]=ef[0]*ny%MOD; For(i,1,n) { int kk=abs(a[i].fi-avg[0])%MOD; vl[0]+=(kk*kk)%MOD; MD(vl[0]); }
    vl[0]=(vl[0]*ny)%MOD;
    For(i,1,m-st) { 
        upd t=Upd({ef[i-1],avg[i-1],vl[i-1]},tg[i+st],i+st);
        ef[i]=t.sum,avg[i]=t.ag,vl[i]=t.val;
    }    
    For(i,1,q) { int p; cin>>p; cout<<qans(p)%MOD<<"\n"; }
    return 0;
}
/*
Need check before submit

1.INF=1e9 check if the val>=1e9 and only 0x3f3f3f3f and 0 can be memset!!!
2.Don't using getchar() unless is NESSASARY!!!
3.Enough size for the array!!!
4.Notice double's precision
5.CHECK UR LL OR ULL!!!
6.READ THE PROBLEM AGAIN AND AGAIN!!!
7.Check if for() is over int

*/
2024/9/9 09:47
加载中...