题解 P1558 【色板游戏】

· · 题解

注意 $x>y$ 的时候要替换,不然会死的很惨…… ```cpp #include<bits/stdc++.h> #define MAXN 100005 #define MAXT 35 #define iter set <Node>::iterator using namespace std; struct Node { int l,r; mutable int val; bool operator < (const Node &x) const { return l<x.l; } }; set <Node> s; int n,m,T; bool fg[MAXN]; iter Split(int pos) { iter it=s.lower_bound((Node){pos,pos,-1}); if(it!=s.end() && it->l==pos) return it; it--; Node x=*it; s.erase(it); s.insert((Node){x.l,pos-1,x.val}); return s.insert((Node){pos,x.r,x.val}).first; } void Assign(int l,int r,int val) { iter R=Split(r+1),L=Split(l); s.erase(L,R); s.insert((Node){l,r,val}); } int Query(int l,int r) { iter R=Split(r+1),L=Split(l); int res=0; memset(fg,0,sizeof(fg)); for(iter it=L;it!=R;it++) fg[it->val]=1; for(int i=1;i<=T;i++) if(fg[i]) res++; return res; } int main() { scanf("%d %d %d",&n,&T,&m); s.insert((Node){1,n,1}); for(int i=1;i<=m;i++) { int x,y,z; char opt; cin>>opt; scanf("%d %d",&x,&y); if(x>y) swap(x,y); if(opt=='C') { scanf("%d",&z); Assign(x,y,z); } else printf("%d\n",Query(x,y)); } return 0; } ```