sort+线段树,50pts最后一个subtask错了,求大佬帮忙看看。解决问题一定关注
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
struct node{
ll l,r,h;
}mp[500010];
bool cmp(node a,node b){
return a.h>b.h;
}
struct tree{
ll v;
bool tag;
}f[500010];
ll n,m,mxl=100010,mxr,x,t[100010];
ll mt(ll l,ll r,ll id){
if(l==r){
f[id].tag=0,f[id].v=t[l];
return t[l];
}
ll ans=0,mid=(l+r)>>1;
ans=(mt(l,mid,id<<1)+mt(mid+1,r,id<<1|1))%mod;
return f[id].v=ans;
}
ll tot;
void add(ll x,ll l,ll r,ll id){
if(f[id].tag){
f[id].v=0,f[id].tag=0;
f[id<<1].tag=f[id<<1|1].tag=1;
}
f[id].v=(f[id].v+tot)%mod;
if(l==r)return;
ll mid=(l+r)>>1;
if(x<=mid)add(x,l,mid,id<<1);
else add(x,mid+1,r,id<<1|1);
}
ll sum(ll sl,ll sr,ll l,ll r,ll id){
if(f[id].tag){
f[id].v=0,f[id].tag=0;
f[id<<1].tag=f[id<<1|1].tag=1;
}
if(sl<=l&&sr>=r){
f[id].tag=1;
return f[id].v%mod;
}
ll ans=0,mid=(l+r)>>1;
if(sl<=mid)ans=(ans+sum(sl,sr,l,mid,id<<1))%mod;
if(sr>mid)ans=(ans+sum(sl,sr,mid+1,r,id<<1|1))%mod;
f[id].v=(f[id].v+mod-ans)%mod;
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
scanf("%lld%lld%lld",&mp[i].l,&mp[i].r,&mp[i].h);
mp[i].l++,mp[i].r++;
mxl=min(mxl,mp[i].l);
mxr=max(mxr,mp[i].r);
}
for(ll i=1;i<=n;i++){
scanf("%lld",&x);
x++;
t[x]++;
mxl=min(mxl,x),mxr=max(mxr,x);
}
mt(mxl,mxr,1);
sort(mp+1,mp+m+1,cmp);
for(ll i=1;i<=m;i++){
tot=(sum(mp[i].l,mp[i].r,mxl,mxr,1)+mod)%mod;
add(mp[i].l,mxl,mxr,1),add(mp[i].r,mxl,mxr,1);
}
printf("%lld\n",(sum(mxl,mxr,mxl,mxr,1)+mod)%mod);
return 0;
}