zoukankan      html  css  js  c++  java
  • 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
    ", 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
    
    */
    


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    前端-JavaScript
    前端-HTML
    Python源程序(.py)转换为可执行文件(.exe)
    进程
    算法之动态规划问题
    算法之斐波那契数列
    贪心算法找零问题
    算法之迷宫问题
    数据结构相关知识
    常用排序算法
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4642340.html
Copyright © 2011-2022 走看看