首页 > 代码库 > HDU 4391 Paint The Wall 线段树(水
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 */
HDU 4391 Paint The Wall 线段树(水
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。