zoukankan      html  css  js  c++  java
  • POJ 2777 线段树基础题

    题意:

    给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作。

    第一个操作,将区间[a , b ]的颜色换成c。

    第二个操作,输出区间[a , b ]不同颜色的总数。

    直接线段树搞之。不过输入有个坑,a 可能大于b ,所以要判断一下。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <vector>
    #include <stack>
    #include <map>
    #include <iomanip>
    #define PI acos(-1.0)
    #define Max 2505
    #define inf 1<<28
    #define LL(x) (x<<1)
    #define RR(x) (x<<1|1)
    #define REP(i,s,t) for(int i=(s);i<=(t);++i)
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mp(a,b) make_pair(a,b)
    #define PII pair<int,int>
    using namespace std;
    
    int L[1111111] , R[1111111] , data[1111111] , add[1111111] ;
    int vis[1111] ;
    int ans ;
    int n , T ,O ;
    void push_up(int x){
        if(data[LL(x)] != data[RR(x)])
            data[x] = 50 ;
        else
        data[x] = data[LL(x)] ;
    }
    void build(int l ,int r ,int u){
        L[u] = l ;
        R[u] = r ;
        data[u] = 1 ;
        add[u] = 0 ;
        if(l == r)return ;
        int mid = l + r >> 1 ;
        build(l ,mid ,LL(u)) ;
        build(mid + 1 ,r ,RR(u)) ;
    }
    
    void push_down(int x){
        if(add[x]){
            add[LL(x)] = add[x] ;
            add[RR(x)] = add[x] ;
            data[LL(x)] = add[x] ;
            data[RR(x)] = add[x] ;
            add[x] = 0 ;
        }
    }
    
    void updata(int l ,int r ,int u ,int color){
        push_down(u) ;
        if(l > R[u] || r < L[u])return ;
        if(l == L[u] && r == R[u]){
            data[u] = color ;
            add[u] = color ;
            return ;
        }
        int mid = (L[u] + R[u]) >> 1 ;
        if(r <= mid)updata(l , r , LL(u) ,color) ;
        else if(l > mid)updata(l ,r ,RR(u) ,color) ;
        else {
            updata(l ,mid ,LL(u), color) ;
            updata(mid + 1 ,r ,RR(u) ,color) ;
        }
        push_up(u) ;
    }
    
    void query(int l ,int r ,int u){
        push_down(u) ;
        if(l > R[u] || r < L[u])return ;
        if(l == L[u] && r == R[u]){
            if(data[u] != 50){
                if(!vis[data[u]]){
                    ans ++ ;
                    vis[data[u]] = 1 ;
                }
                return ;
            }
        }
        int mid = L[u] + R[u] >> 1 ;
        if(l > mid )query(l ,r , RR(u)) ;
        else if(r <= mid)query(l, r ,LL(u)) ;
        else {
            query(l , mid ,LL(u)) ;
            query(mid + 1 ,r ,RR(u)) ;
        }
        push_up(u) ;
    }
    inline void RD(int &ret) {
        char c;
        do {
            c = getchar();
        } while(c < '0' || c > '9') ;
        ret = c - '0';
        while((c=getchar()) >= '0' && c <= '9')
            ret = ret * 10 + ( c - '0' );
    }
    void swap(int& a ,int& b){
        int temp = a ;
        if(a > b){
            a = b ;
            b = temp ;
        }
    }
    void debug(){
        for (int i = 1 ;i <= 3 * n ;i ++){
            cout << "L:" << L[i] << "R:" << R[i] << "data:" << data[i] << "add:" << add[i] << endl;
        }
    }
    int main() {
        cin >> n >> T >> O ;
        build(1 , n , 1 ) ;
        int a , b , c ;
        char op[11] ;
        while(O -- ){
            scanf("%s",op) ;
            if(op[0] == 'C'){
                scanf("%d%d%d",&a,&b,&c) ;
                if( a > b)swap(a ,b ) ;
                updata(a , b, 1 , c) ;
            }
            else if(op[0] == 'P'){
                scanf("%d%d",&a,&b) ;
                if(a > b)swap(a , b) ;
                ans = 0 ;
                mem(vis,0) ;
                query(a , b , 1) ;
                printf("%d
    ",ans) ;
            }
        }
        return 0 ;
    }
    


  • 相关阅读:
    k8s 节点的 NodeAffinity 使用
    template 与 host , item trigger的关系
    mysql 性能优化思路
    nginx 配sorry page
    修改tomcat JVM 大小 jdk--目录修改
    (转)MySQL慢查询分析优化 + MySQL调优
    注册表操作 Microsoft.Win32.Registry与RegistryKey类
    C#(99):WCF之.NET Remoting通讯
    CallContext线程数据缓存-调用上下文
    C#(99):JSON与对象的序列化与反序列化
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3201267.html
Copyright © 2011-2022 走看看