ODT60分求调(不是TLE)
查看原帖
ODT60分求调(不是TLE)
785917
Chthollian楼主2024/11/25 19:59

记录

#include <bits/stdc++.h>
#define IT set<Node>::iterator
#define ls now*2
#define rs now*2+1
using namespace std;
const long long mod=998244353;
int n,m,x,lmin=0x3f3f3f3f,rmax=-0x3f3f3f3f;
struct Line
{
	int l,r,h;
	bool operator < (const Line &ano) const
	{
		return h>ano.h;
	}
} line[500005];
struct Node
{
	int l,r;
	mutable long long v;
	Node(int L,int R=-1,long long V=0) : l(L),r(R),v(V) {}
	bool operator < (const Node &ano) const
	{
		return l<ano.l;
	}
};
set<Node> s;
IT split(int pos)
{
	IT it=s.lower_bound(Node(pos));
	if(it!=s.end() && it->l==pos)
	{
		return it;
	}
	it--;
	int L=it->l,R=it->r;
	long long V=it->v;
	s.erase(it);
	s.insert(Node(L,pos-1,V));
	return s.insert(Node(pos,R,V)).first;
}
void assign(int l,int r,long long k)
{
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(Node(l,r,k%mod));
}
void updata(int x,long long k)
{
	IT itr=split(x+1),itl=split(x);
	itl->v+=k;
	itl->v%=mod;
}
long long query(int l,int r)
{
	long long ans=0;
	IT itr=split(r+1),itl=split(l);
	for(;itl!=itr;itl++)
	{
		ans=(ans+itl->v*(itl->r-itl->l+1))%mod;
	}
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>line[i].l>>line[i].r>>line[i].h;
		lmin=min(lmin,line[i].l),rmax=max(rmax,line[i].r);
	}
	sort(line+1,line+n+1);
	s.insert(Node(0,100005));
	for(int i=1;i<=m;i++)
	{
		cin>>x;
		lmin=min(lmin,x),rmax=max(rmax,x);
		updata(x,1);
	}
	for(int i=1;i<=n;i++)
	{
		long long sum=query(line[i].l,line[i].r)%mod;
		assign(line[i].l,line[i].r,0);
		updata(line[i].l,sum);
		updata(line[i].r,sum);
	}
	cout<<query(0,100005)%mod;
	return 0;
}
2024/11/25 19:59
加载中...