CF915E Physical Education Lessons

洛谷题目链接

珂朵莉树吼啊!!!

操作唯一:区间赋值,上模板就阔以了

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#define Set set<Node>::iterator
#define N 1000000007
using namespace std;
struct Node
{
	int l,r;
	mutable int val;
	Node(int L,int R,int V):l(L),r(R),val(V){}
	Node(int L):l(L){}
	bool operator<(const Node &it)const
	{
		return l<it.l;
	}
};
set<Node> st;
int n,m,num;
Set Split(int x)
{
	Set it=st.lower_bound(Node(x));
	if(it!=st.end()&&it->l==x)
		return it;
	--it;
	int L=it->l,R=it->r,V=it->val;
	st.erase(it);
	st.insert(Node(L,x-1,V));
	return st.insert(Node(x,R,V)).first;
}
void Change(int l,int r,int v)
{
	int now=0;
	Set rr=Split(r+1),ll=Split(l);
	for(Set it=ll;it!=rr;++it)
		if(it->val!=v)
			now+=it->r-it->l+1;
	num+=(v==1?now:-now);
	st.erase(ll,rr);
	st.insert(Node(l,r,v));
}
int main()
{
	scanf("%d%d",&n,&m);
	num=n;
	st.insert(Node(1,n,1));
	st.insert(Node(n+1));
	for(int i=1;i<=m;++i)
	{
		int opt,l,r;
		scanf("%d%d%d",&l,&r,&opt);
		if(opt==1)
			Change(l,r,0);
		else
			Change(l,r,1);
		printf("%d\n",num);
	}
	return 0;
}

  

posted @ 2019-01-02 15:38  模拟退火  阅读(210)  评论(0编辑  收藏  举报