赞
踩
题目链接:https://www.luogu.com.cn/problem/P2161
用涂色的思想,四个变量,l,r,tag(标记改变的颜色),sum(记录颜色)。
sum=0时表示这个地方没有颜色
sum=-1时表示这个区间有多个颜色
sum>0 时表示这个地方有i号颜色
ans记录有多少种涂色,cnt记录删除多少种颜色
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<cctype> #include<ctime> #include<iostream> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<vector> #include<iomanip> #include<list> #include<bitset> #include<sstream> #include<fstream> #include<complex> #include<algorithm> #if __cplusplus >= 201103L #include <unordered_map> #include <unordered_set> #endif #define ll long long using namespace std; const int INF = 0x3f3f3f3f; const int N=200010; int cnt,ans; struct sut{ int l,r,tag,sum; }tree[N<<2]; int vis[N]; void build(int l1,int r1,int x){ tree[x].l=l1,tree[x].r=r1;tree[x].tag=0;tree[x].sum=0; if(l1==r1) return; int mid=(l1+r1)>>1; build(l1,mid,x<<1); build(mid+1,r1,x<<1|1); } void pushdown(int x){ if(!tree[x].tag) return; tree[x<<1].tag=tree[x<<1|1].tag=tree[x].tag; tree[x<<1].sum=tree[x<<1|1].sum=tree[x].tag; tree[x].tag=0; } void update(int l1,int r1,int add,int x){ if(l1<=tree[x].l&&tree[x].r<=r1){ tree[x].tag=add; tree[x].sum=add; } else{ pushdown(x); int mid=(tree[x].l+tree[x].r)>>1; if(l1<=mid) update(l1,r1,add,x<<1);//这里l1,r1不变,因为是在l1,r1区间维护。 if(r1>mid) update(l1,r1,add,x<<1|1); if(tree[x<<1].sum==tree[x<<1|1].sum) tree[x].sum=tree[x<<1].sum;//左区间颜色等于右区间颜色,这个区间同色 else tree[x].sum=-1; } } void query(int l1,int r1,int x){ if(l1<=tree[x].l&&tree[x].r<=r1){ if(!tree[x].sum) return;//没有颜色 if(tree[x].sum==-1){//多种颜色,继续往下走 pushdown(x); int mid=(tree[x].l+tree[x].r)>>1; if(l1<=mid) query(l1,r1,x<<1); if(r1>mid) query(l1,r1,x<<1|1); } if(tree[x].sum>0){//有一种颜色 if(!vis[tree[x].sum]){ ans--,cnt++;vis[tree[x].sum]=1; } } } else{ pushdown(x); int mid=(tree[x].l+tree[x].r)>>1; if(l1<=mid) query(l1,r1,x<<1); if(r1>mid) query(l1,r1,x<<1|1);} } int main(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n; cin>>n; build(1,100000,1); for(int i=1;i<=n;i++){ string s; cin>>s; if(s[0]=='A'){ int a,b; cin>>a>>b; query(a,b,1); cout<<cnt<<endl; cnt=0; update(a,b,i,1); ans++; } if(s[0]=='B'){ // query(1,n,1); cout<<ans<<endl; } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。