HDU 4391 Paint The Wall 段树(水
意甲冠军:
特定n多头排列。m操作
以下是各点的颜色
以下m一种操纵:
1 l r col 染色
2 l r col 问间隔col色点
== 通的操作+区间内最大最小颜色数的优化,感觉非常不科学。。。
==感觉能够卡掉这样的写法。。反正就是不科学嘛
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; #define L(x) tree[x].l #define R(x) tree[x].r #define Len(x) tree[x].len #define Lazy(x) tree[x].lazy #define M(x) tree[x].minn #define W(x) tree[x].maxx #define Lson(x) (x<<1) #define Rson(x) (x<<1|1) const int N = 100010; struct node{ int l, r, len, lazy, minn, maxx; }tree[N<<2]; int col[N]; void push_up(int id){ if(Lazy(Lson(id)) == Lazy(Rson(id))) Lazy(id) = Lazy(Lson(id)); else Lazy(id) = -1; M(id) = min(M(Lson(id)), M(Rson(id))); W(id) = max(W(Lson(id)), W(Rson(id))); } void push_down(int id){ if(Lazy(id) != -1){ Lazy(Lson(id)) = Lazy(Rson(id)) = Lazy(id); M(Lson(id)) = W(Lson(id)) = Lazy(id); M(Rson(id)) = W(Rson(id)) = Lazy(id); } } void build(int l, int r, int id){ L(id) = l; R(id) = r; Len(id) = r-l+1; Lazy(id) = -1; if(l == r){ Lazy(id) = col[l]; W(id) = M(id) = col[l]; return ; } int mid = (l+r)>>1; build(l, mid, Lson(id)); build(mid+1, r, Rson(id)); push_up(id); } void updata(int l, int r,int val, int id){ if(l == L(id) && R(id) == r){ Lazy(id) = val; W(id) = M(id) = val; return ; } push_down(id); int mid = (L(id) + R(id)) >>1; if(mid < l) updata(l, r, val, Rson(id)); else if(r <= mid) updata(l, r, val, Lson(id)); else { updata(l, mid, val, Lson(id)); updata(mid+1, r, val, Rson(id)); } push_up(id); } int query(int l, int r, int col, int id){ if(!(M(id)<=col && col<=W(id))) return 0; if(Lazy(id)!=-1){ if(Lazy(id) == col) return r-l+1; else return 0; } push_down(id); int mid = (L(id) + R(id)) >>1; if(mid < l) return query(l, r, col, Rson(id)); else if(r <= mid) return query(l, r, col, Lson(id)); else return query(l, mid, col, Lson(id)) + query(mid+1, r, col, Rson(id)); } int n, que; int main() { while (cin>>n>>que) { for(int i = 1; i <= n; i++)scanf("%d", &col[i]); build(1, n, 1); while(que--){ int type, l, r, color; scanf("%d %d %d %d", &type, &l, &r, &color); l++; r++; if(type == 1) updata(l, r, color, 1); else printf("%d\n", query(l, r, color, 1)); } } return 0; } /* 5 12 1 2 3 4 0 2 1 3 3 1 1 3 1 2 1 3 3 2 0 3 1 2 3 4 1 1 0 4 0 2 0 4 0 2 0 4 2000000000 1 0 0 1 1 4 4 2 2 0 4 1 2 0 4 2 */
版权声明:本文博客原创文章。博客,未经同意,不得转载。