POJ 2777 Count Color
2011-04-07 20:41
330 查看
经典的染色问题,很明显的体现了lazy——tag思想... /* 用cin超时... */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define L(t) ((t) << 1) #define R(t) ((t) << 1 | 1) using namespace std; const int MAXN = 1000002; bool used[33]; struct SegTree { int l, r; int color; //-1多种颜色 否则为单一颜色 int getMid(){ return (l + r) >> 1; } }; SegTree tree[MAXN << 2]; int l, t, o; //l长度 t种颜色 o次操作 void bulid(int left, int right, int t){ tree[t].l = left; tree[t].r = right; tree[t].color = 1; if(right == left) return; int mid = tree[t].getMid(); bulid(left,mid,L(t)); bulid(mid + 1, right, R(t)); } void insert(int left, int right, int c, int t){ if(left <= tree[t].l && right >= tree[t].r){ tree[t].color = c; return; } if(tree[t].color != -1){ //第二类信息 自上向下传递 tree[L(t)].color = tree[R(t)].color = tree[t].color; tree[t].color = -1; } int mid = tree[t].getMid(); if(right <= mid){ insert(left, right, c, L(t)); } else if(left > mid){ insert(left, right, c, R(t)); } else { insert(left, mid, c, L(t)); insert(mid + 1, right, c, R(t)); } } void query(int left, int right, int t){ if(tree[t].color > 0){ used[tree[t].color] = true; return; } int mid = tree[t].getMid(); if(right <= mid){ query(left, right, L(t)); } else if( left > mid){ query(left, right, R(t)); } else { query(left, mid, L(t)); query(mid + 1, right, R(t)); } } int main(){ char cmd[2]; int a, b, c; //cin >> l >> t >> o; scanf("%d%d%d",&l,&t,&o); bulid(1, l, 1); for(int i = 0; i < o; ++i){ //cin >> cmd; scanf("%s",cmd); if(cmd[0] == 'C'){ // cin >> a >> b >> c; scanf("%d%d%d",&a, &b, &c); if(a > b) a ^= b ^= a ^= b; insert(a, b, c, 1); } else { // cin >> a >> b; scanf("%d%d",&a, &b); if(a > b) a ^= b ^= a ^= b; memset(used, false, sizeof(used)); query(a, b, 1); int cnt = 0; for(int i = 0; i <= t; i++) if(used[i]){ cnt++; } // cout << cnt << endl; printf("%d\n",cnt); } } return 0; }
相关文章推荐
- POJ 2777 Count Color(线段树)
- poj 2777 Count Color
- Poj 2777 Count Color(线段树基础)
- POJ 2777-Count Color-(线段树)
- poj 2777 Count Color
- POJ 2777 Count Color
- POJ 2777 Count Color——区间更新的线段树+状态压缩
- POJ 2777 Count Color
- POJ 2777--Count Color(线段树)
- POJ 2777 Count Color (线段树区间更新 位压缩)
- POJ 2777 Count Color(线段树之成段更新)
- POJ 2777 Count Color(线段树 + 状态压缩)
- POJ 2777 Count Color (线段树区间更新)
- poj 2777 Count Color(线段树+染色问题)
- POJ 2777 Count Color (线段树)
- poj 2777 Count Color(位运算+线段树区间更新 可用bitset记录)
- POJ 2777 Count Color 线段树 区间更新
- POJ 2777 Count Color(线段树+二进制位运算)
- POJ 2777Count Color (线段树区间更新 + 位运算压缩)
- POJ 2777 Count Color