月赛T2
  • 板块题目总版
  • 楼主LuomuQDM
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/6 18:18
  • 上次更新2023/10/27 16:43:35
查看原帖
月赛T2
221023
LuomuQDM楼主2022/8/6 18:18

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;
}
2022/8/6 18:18
加载中...