ODT 10pts 求调
查看原帖
ODT 10pts 求调
826774
Little_Fox_Fairy楼主2024/7/17 10:37
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#define int long long
#define pii pair<int,int>
#define endl putchar('\n')
using namespace std;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}

struct node
{
	int l,r;
	mutable int val;
	node (int l,int r=-1,int val=0) : l (l),r (r),val (val) {}
	bool operator <(const node &x) const {return l<x.l;}
};
set<node> s;
inline auto split(int pos)
{
	auto it=s.lower_bound(node(pos));
	if (it!=s.end() and it->l==pos) return it;
	it--;
	if (it->r<pos) return s.end();
	int l=it->l,r=it->r,val=it->val;
	s.erase(it);
	s.insert(node(l,pos-1,val));
	return s.insert(node(pos,r,val)).first;
}
inline void assign(int l,int r,int val)
{
	auto itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,val));
	return ;
}
inline int sum(int l,int r)
{
	auto itr=split(r+1),itl=split(l);
	int ans=0;
	while(itl!=itr)
	{
		ans+=(itl->r-itl->l+1)*(itl->val);
		itl++;
	}
	return ans;
}

int n,m;
signed main()
{
	read(&n),read(&m);
	s.insert(node(1,n,1));
	while (m--)
	{
		int l,r;
		read(&l),read(&r);
		assign(l,r,0);
	}
	write(sum(1,n)),endl;
	return 0;
}

喵~

2024/7/17 10:37
加载中...