线段树65pts求条,WA on #5
查看原帖
线段树65pts求条,WA on #5
674147
vanueber楼主2024/8/15 20:20

rt

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long

using namespace std;

const int mod=998244353;
const int maxn=5e5+15;
int n,m;
int x[maxn];

struct line
{
	int l,r,h;
}xd[maxn];
bool cmp(line a,line b)
{
	return a.h>b.h;
}
struct node
{
	int l,r;
	int sum,tag;
}tr[maxn<<2];
int ls(int p)
{
	return p<<1;
}
int rs(int p)
{
	return p<<1|1;

}
void pushup(int p)
{
	tr[p].sum=tr[ls(p)].sum%mod+tr[rs(p)].sum%mod;
	tr[p].sum%=mod;
}
void pushdown(int p)
{
	if(tr[p].tag)
	{
		tr[ls(p)].sum=tr[rs(p)].sum=0;
		tr[ls(p)].tag=tr[rs(p)].tag=1;
		tr[p].tag=0;
	}
}
void build(int p,int l,int r)
{
	tr[p].l=l,tr[p].r=r;
	if(l==r)
	{
		tr[p].sum=0;
		return;
	}
	int mid=l+r>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void add(int p,int x,int k)
{
	if(tr[p].l==x&&tr[p].r==x)
	{
		tr[p].sum+=(k%mod);
		tr[p].sum%=mod;
		return;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(mid>=x) add(ls(p),x,k);
	else add(rs(p),x,k);
	pushup(p);
}
void update(int p,int l,int r)
{
	if(l<=tr[p].l&&tr[p].r<=r)
	{
		tr[p].sum=0;
		tr[p].tag=1;
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(mid>=l) update(ls(p),l,r);
	if(r>mid) update(rs(p),l,r);
	pushup(p);
}
int query(int p,int l,int r)
{
	if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum%mod;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	int sum=0;
	if(mid>=l) sum+=query(ls(p),l,r)%mod,sum%=mod;
	if(mid<r) sum+=query(rs(p),l,r)%mod,sum%=mod;
	return sum%mod;
}
void test()
{
	cout<<"#"<<1<<endl;
}
void print(node x)
{
	cout<<x.l<<" "<<x.r<<" "<<x.sum<<" "<<x.tag<<endl;
}
int maxp=-1;
signed main()
{
	#ifndef ONLINE_JUDGE
 	freopen("in.txt","r",stdin);
 	#endif
 	cin>>n>>m;//坐标+1
 	for(int i=1;i<=m;i++) 
 	{
	 	scanf("%lld%lld%lld",&xd[i].l,&xd[i].r,&xd[i].h);
	 	xd[i].l++,xd[i].r++;
	 	maxp=max(maxp,xd[i].r);
	 	
	}
	sort(xd+1,xd+n+1,cmp);
	build(1,1,maxp);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&x[i]);
		x[i]++;
		add(1,x[i],1);
	}
	
	for(int i=1;i<=m;i++)
	{
		int num=query(1,xd[i].l,xd[i].r)%mod;
		update(1,xd[i].l,xd[i].r);
		add(1,xd[i].l,num),add(1,xd[i].r,num);
//		for(int i=1;i<=20;i++) print(tr[i]);cout<<endl;
	}
	printf("%lld\n",query(1,1,maxp)%mod);
	return 0;
}

2024/8/15 20:20
加载中...