MnZn求助莫队
查看原帖
MnZn求助莫队
455490
Sharpsmile楼主2022/7/25 08:47

QAQ在第五个点就T了,不知道到底是莫队复杂度有问题还是只是人菜常数大QAQ,求大佬帮帮

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define double long double
#define int long long
using namespace std;
const int M=998244353;
int n,m,q;
const int siz=333;
int a[100300];
int bel[100300];
int ans[100300];
int C[100300];

map<int,int>K;
int cnt =0;
struct node{
    int l,r,id;
};
inline bool cmp(node x,node y){
    return bel[x.l]==bel[y.l]?bel[x.l]%2==0?x.r>y.r:x.r<y.r:bel[x.l]<bel[y.l];
}
inline int qp(int a,int x){
    int res=1;
    while(x){
        if(x&1)res=res*a%M;
        a=a*a%M;
        x>>=1;
    }
    return res;
}
inline int inv(int x){return qp(x,M-2);}
struct ASK{
    int k;
    vector<node>g;
    int G;
    int c[100300];
    int s[100300];
    inline void calc(){
        G=(k*m+n)%M;
        sort(g.begin(),g.end(),cmp);
        int l=1,r=0;
        int res=1;
        s[0]=1;
        for(int i=1;i<=n;i++)
            s[i]=s[i-1]*(G-(n-i))%M;
        for(int i=1;i<=m;i++)
            C[i]+=k;
        for(node A:g){
            while(r<A.r){
                r++;
                res=res*(C[a[r]]-c[a[r]])%M;
                c[a[r]]++;
            }
            while(l>A.l){
                l--;
                res=res*(C[a[l]]-c[a[l]])%M;
                c[a[l]]++;
            }
            while(r>A.r){
                
                c[a[r]]--;
                res=res*inv(C[a[r]]-c[a[r]])%M;
                r--;
            }
            while(l<A.l){
                
                c[a[l]]--;
                res=res*inv(C[a[l]]-c[a[l]])%M;
                l++;
            }
            ans[A.id]=res*s[n-(r-l+1)]%M;
        }
        for(int i=1;i<=m;i++)
        C[i]-=k;
    }
}T[110];
signed main(){
    ios::sync_with_stdio(false);
    //freopen("/Users/noip2019/Downloads/P7735_2.in","r",stdin);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        bel[i]=(i+siz-1)/siz;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        C[a[i]]++;
    }
    for(int i=1;i<=q;i++){
        int l,r,k;
        cin>>l>>r>>k;
        if(!K.count(k)){
            K[k]=++cnt;
            T[cnt].k=k;
        }
        T[K[k]].g.push_back({l,r,i});
    }
    for(int i=1;i<=cnt;i++)
        T[i].calc();
    for(int i=1;i<=q;i++)
        cout<<ans[i]<<endl;
    return 0;
}
2022/7/25 08:47
加载中...