首页 > 代码库 > POJ2777线段树染色+lazy
POJ2777线段树染色+lazy
第一次写这样的题目,反正出现了各种坑爹问题,调了老半天,除了延迟标记外,这题还要开一个cnt数组用来存储各个区间内颜色的种类数,
每次改变颜色时,更新一次。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> using namespace std; #define INF 0xfffffff #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define maxn 100005 int col[maxn<<2],cnt[maxn<<2]; void pushdown(int rt) { if(col[rt]!=-1) { cnt[rt<<1]=cnt[rt<<1|1]=1<<(col[rt]-1); col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; } } void build() { col[1]=1; cnt[1]=1; } void update(int L,int R,int cha,int l,int r,int rt) { if(L<=l&&r<=R) { col[rt]=cha; cnt[rt]=1<<(cha-1); return ; } if(L>r||R<l) return ; pushdown(rt); int mid=(l+r)>>1; update(L,R,cha,lson); update(L,R,cha,rson); cnt[rt]=cnt[rt<<1]|cnt[rt<<1|1]; } int query(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { return cnt[rt]; } if(L>r||R<l) return 0; pushdown(rt); int mid=(l+r)>>1; return query(L,R,lson)|query(L,R,rson); } int main() { int n,t,o; char str[100]; int a,b,c; build(); scanf("%d%d%d",&n,&t,&o); while(o--) { scanf("%s",str); if(str[0]=='C') { scanf("%d%d%d",&a,&b,&c); if(a>b) swap(a,b); update(a,b,c,1,n,1); } else { int ans=0; scanf("%d %d",&a,&b); if(a>b) swap(a,b); int temp=query(a,b,1,n,1); while(temp) { if(temp&1) ans++; temp=temp>>1; } printf("%d\n",ans); } } return 0; }
POJ2777线段树染色+lazy
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。