UB 求条,玄 1 关。
查看原帖
UB 求条,玄 1 关。
1238611
harmis_yz楼主2024/9/28 15:10

条好久了啊,莫名其妙。

AT_abc262_h 能过。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define pii pair<int,int>
#define x first
#define y second
#define gc getchar()
#define rd read()
#define debug() puts("------------")

namespace yzqwq{
    il int read(){
        int x=0,f=1;char ch=gc;
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc;}
        while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc;
        return x*f;
    }
    il int qmi(int a,int b,int p){
        int ans=1;
        while(b){
            if(b&1) ans=ans*a%p;
            a=a*a%p,b>>=1;
        }
        return ans;
    }
    il int gcd(int a,int b){
        if(!b) return a;
        return gcd(b,a%b);
    }
    il int lcm(int a,int b){
        return a/gcd(a,b)*b;
    }
    il void exgcd(int a,int b,int &x,int &y){
        if(!b) return x=1,y=0,void(0);
        exgcd(b,a%b,x,y);
        int t=x;
        x=y,y=t-a/b*x;
        return ;
    }
    il int F(int n,int a,int b,int c){
        //sum{|_ (ai+b)/c _| i:0~n}
        if(!n) return b/c;
        if(!a) return (n+1)*(b/c);
        if(a>=c||b>=c){
            int x=a/b,y=b/c;
            return n*(n+1)/2*x+(n+1)*y+F(n,a%c,b%c,c);
        }
        int m=(a*n+b)/c;
        return n*m+F(m-1,c,c-b+1,a);
    }
    struct lb{
        int d[64];
        il void print(){
            for(re int i=0;i<63;++i)
            if(d[i]) printf("%lld:%lld\n",i,d[i]);
            return ;
        }
        lb(){memset(d,0,sizeof(d));}
        il void operator +=(int x){
            for(re int i=62;i>=0;--i){
                if(!(x&(1ll<<i))) continue;
                if(d[i]) x^=d[i];
                else return d[i]=x,void(0);
            }
            return ;
        }
        int& operator [](int x){
            return d[x];
        }
        il void operator +=(lb &x){
            for(re int i=62;i>=0;--i)
            if(x[i]) *this+=x[i];
            return ;
        }
        il friend lb operator +(lb &x,lb &y){
            lb z=x;
            for(re int i=62;i>=0;--i)
            if(y[i]) z+=y[i];
            return z;
        }
        il int Max_calc(){
            int ans=0;
            for(re int i=62;i>=0;--i)
            if((ans^d[i])>ans) ans^=d[i];
            return ans;
        }
    };
    mt19937 rnd(time(0));
}
using namespace yzqwq;

const int N=4e6+10,Mod=998244353;
int n,m,q;
struct Node{
	int l,r,x;
	il bool operator<(const Node&b)const{
		if(l!=b.l) return l<b.l;
		return r<b.r;
	}
}p[N];
vector<Node> v_[N];
vector<int> po[N];
int idx,vis[N],Vis[N];
int x[N],Max[N],f[N];
vector<pii> v[N];
multiset<int> s;
int ans=1;
int b[N],len;

il int work(int xx){
	int X=b[xx]-1;
	int len=(int)(po[xx].size());
//	if(len==0) return 1;
	for(re int i=0;i<=len;++i) Max[i]=0,f[i]=0;
	f[0]=1;
	for(auto i:v_[xx]){
		int l=i.l,r=i.r;
		l=lower_bound(po[xx].begin(),po[xx].end(),l)-po[xx].begin()+1;
		r=upper_bound(po[xx].begin(),po[xx].end(),r)-po[xx].begin()+1-1;
		Max[r]=max(Max[r],l);
		if(l>r) return 0;
	}
	if(X==0) return 1;
	int S=1,tag=1;
	for(re int i=1,j=0;i<=len;++i){
		tag=tag*X%Mod;
		f[i]=S*qmi(tag,Mod-2,Mod)%Mod;
		S=(f[i]*tag%Mod+S*X%Mod)%Mod;
		while(j<Max[i]) S=((S-f[j]*tag%Mod)%Mod+Mod)%Mod,++j;
	}
//	cout<<tag*f[0]<<"\n";/
	return S;
}
il void solve(){
	n=rd,q=rd,m=rd;
	b[++len]=m+1;
//	if(m==1) return ;
	for(re int i=1;i<=q;++i){
		p[i]={rd,rd,rd};
		b[++len]=p[i].x;
	}
	sort(b+1,b+len+1),len=unique(b+1,b+len+1)-(b+1);
	for(re int i=1;i<=q;++i){
		p[i].x=lower_bound(b+1,b+len+1,p[i].x)-b;
	}
	for(re int i=1;i<=q;++i){
		int l=p[i].l,r=p[i].r,x=p[i].x;
		v[l].push_back(pii{x,1});
		v[r+1].push_back({x,-1});
	}
	int sb=lower_bound(b+1,b+len+1,m+1)-b;
	s.insert(sb);
	for(re int i=1;i<=n;++i){
		for(auto j:v[i]){
			if(j.y==1) s.insert(j.x);
			else s.erase(s.find(j.x));
		}
		x[i]=(*s.begin());
		po[x[i]].push_back(i);
	}
	sort(p+1,p+q+1);
	for(re int i=1;i<=q;++i)
	if(!Vis[i]) v_[p[i].x].push_back({p[i].l,p[i].r,p[i].x});
	for(re int i=1;i<=len;++i){
		if(i==sb) ans=(ans*qmi((m)%Mod,(int)(po[i].size()),Mod)%Mod)%Mod;
		else ans=ans*work(i)%Mod;
	}
	printf("%lld\n",ans);
    return ;
}

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    int t=rd;while(t--)
    solve();
    return 0;
}
2024/9/28 15:10
加载中...