zoukankan      html  css  js  c++  java
  • poj2777 Count Color *

    //蛮水的线段树

    //
    2777
    //用scanf() 用位运算

    #include
    <cstdio>
    #include
    <cstring>
    using namespace std;

    const int MAXL = 100000 + 5;
    const int MAXT = 30 + 5;
    int L, T, O, a, b, c, ans;
    bool vis[MAXT * 3];
    char cmd;
    struct node{
    int l, r;
    int c;
    };
    node tree[MAXL
    * 3];

    void build(int i, int l, int r){
    tree[i].l
    = l; tree[i].r = r;
    tree[i].c
    = (i==1? 1 : 0); //注意题意:起始时刻颜色为1!

    if(tree[i].l == tree[i].r) return;
    int mid = (l + r) >> 1;
    build(i
    <<1, l, mid);
    build(i
    <<1 | 1, mid+1, r);
    }

    void insert(int i, int l, int r, int c){
    if(tree[i].l == l && tree[i].r == r){
    tree[i].c
    = c;
    return;
    }

    if(tree[i].l == tree[i].r) return;

    if(tree[i].c > 0 && tree[i].c != c){
    tree[i
    <<1].c = tree[i].c;
    tree[i
    <<1|1].c = tree[i].c;
    tree[i].c
    = 0;
    }
    int mid = (tree[i].l + tree[i].r) >> 1; //开始居然写成(l+r)>>1!!WA了n次
    if(r <= tree[i<<1].r){
    insert(i
    <<1, l, r, c);
    }
    else if(l >= tree[i<<1|1].l){
    insert(i
    <<1|1, l, r, c);
    }
    else{
    insert(i
    <<1, l, mid, c);
    insert(i
    <<1|1, mid+1, r, c);
    }
    }

    void cal(int i, int l, int r){
    if(tree[i].r < l || tree[i].l > r) return;
    if(tree[i].c > 0){
    if(!vis[tree[i].c]){
    vis[tree[i].c]
    = 1;
    ans
    ++;
    }
    return;
    }
    cal(i
    <<1, l, r);
    cal(i
    <<1 | 1, l, r);
    }

    int main(){
    scanf(
    "%d%d%d", &L, &T, &O);
    build(
    1, 1, L);

    for(int i=0; i<O; i++){
    scanf(
    "%c", &cmd);
    scanf(
    "%c", &cmd);

    if(cmd == 'C'){
    scanf(
    "%d%d%d", &a, &b, &c);
    if(a <= b)
    insert(
    1, a, b, c);

    else{
    insert(
    1, b, a, c); //a>b 则从b到a (题意没表述清)
    }
    }
    else{
    scanf(
    "%d%d", &a, &b);
    ans
    = 0;
    memset(vis,
    0, sizeof(vis));
    if(a <= b)
    cal(
    1, a, b);
    else{
    cal(
    1, b, a);
    }
    printf(
    "%d\n", ans);

    }
    }

    return 0;
    }

  • 相关阅读:
    返回一个整数数组中最大子数组的和2
    RT-Thread之自动初始化
    Git
    基于STM32的FreeRTOS移植
    RT-Thread之debug使用
    大数的进制转换
    uva-10110
    UVA-10061
    算法训练Maze
    森林变树
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2103060.html
Copyright © 2011-2022 走看看