题意:数组中1-n是0,现在q次查询,每次给你l,r,k,k=1表示l-r区间内的0修改成1,k=2表示把1修改成0.每次输出1-n内的0的个数。
思路:用map写,range(map名)【n】=1表示1-n都是0,所以range中会有多个元素,因为全为0的区间可能是断断续续的。
为什么用range【n】=1而不是range【1】=n呢?因为我们每次查询还有一个区间 l-r ,我们需要判断跟map中的元素是否有交集,所以啊我们就用其中元素的右端值跟查询的左端值比较,这样不会漏掉每一个0,是不是很巧妙?
具体思路看代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,q,cl,cr,k,ans;
map<int,int>range;
int main()
{
scanf("%d%d",&n,&q);
range[n]=1,ans=n;
while(q--)
{
scanf("%d%d%d",&cl,&cr,&k);
auto it=range.lower_bound(cl);
while(it!=range.end())
{
int l=it->second,r=it->first;
if(cr<l) break;
ans=ans-(min(r,cr)-max(l,cl)+1);
range.erase(it++);
if(r>cr) range[r]=cr+1;
if(l<cl) range[cl-1]=l;
}
if(k==2)
range[cr]=cl,ans+=cr-cl+1;
printf("%d\n",ans);
}
}