• Count Color (线段树区间染色➕二进制状态压缩)


    题目链接:https://vjudge.net/problem/POJ-2777

    题意:

    有L个画板,30种颜色,o个操作:P a b :询问a-b 种有多少种颜色不同的,C  a b c:把a-b全部涂成c的颜色(覆盖掉)

      1 #include <stdio.h>
      2 #include <algorithm>
      3 #include <iostream>
      4 #include <cstring>
      5 #include <string>
      6 #include <set>
      7 #include <map>
      8 
      9 #define LL long long
     10 using namespace std;
     11 const int maxn = 100005;
     12 
     13 int n,m,q;
     14 char c;
     15 int x,y,z;
     16 int sum;
     17 struct segment_tree{
     18     int l,r,col;
     19     int lazy;
     20 }tree[maxn*4];
     21 
     22 void pushup(int nod){
     23     tree[nod].col = tree[nod<<1].col | tree[(nod<<1)+1].col;
     24     return ;
     25 }
     26 
     27 void pushdown(int nod){
     28     tree[nod].lazy = 0;
     29     tree[nod<<1].lazy = 1;
     30     tree[(nod<<1)+1].lazy = 1;
     31     tree[nod<<1].col = tree[nod].col;
     32     tree[(nod<<1)+1].col = tree[nod].col;
     33     return ;
     34 }
     35 
     36 void build(int nod,int l,int r){
     37     tree[nod].l = l;
     38     tree[nod].r = r;
     39     tree[nod].col = 1; //这个初始化根据具体题目而决定
     40     tree[nod].lazy = 0;
     41     if (l == r)
     42         return ;
     43     int mid = (tree[nod].l + tree[nod].r)>>1;
     44     build(nod<<1,l,mid);
     45     build((nod<<1)+1,mid+1,r);
     46     pushup(nod);
     47 }
     48 
     49 void updata(int nod,int l,int r,int val){
     50     if (tree[nod].l == l && tree[nod].r == r){
     51         tree[nod].col = 1<<(val-1);
     52         tree[nod].lazy = 1;
     53         return ;
     54     }
     55     if (tree[nod].col == 1<<(val-1))  // 如果颜色一样,不用更新
     56         return ;
     57     if (tree[nod].lazy)
     58         pushdown(nod);
     59     int mid = (tree[nod].l + tree[nod].r) >> 1;
     60     if (r <= mid){
     61         updata(nod<<1,l,r,val);
     62     }
     63     else if (l>mid){
     64         updata((nod<<1)+1,l,r,val);
     65     }
     66     else {
     67         updata(nod<<1,l,mid,val);
     68         updata((nod<<1)+1,mid+1,r,val);
     69     }
     70     pushup(nod);
     71 }
     72 
     73 void querry(int nod,int l,int r){
     74     if (tree[nod].l == l && tree[nod].r == r){
     75         sum |= tree[nod].col;
     76         return ;
     77     }
     78     if (tree[nod].lazy){
     79         pushdown(nod);
     80     }
     81     int mid = (tree[nod].l + tree[nod].r) >> 1;
     82     if (r <= mid){
     83         querry(nod<<1,l,r);
     84     }
     85     else if (l>mid){
     86         querry((nod<<1)+1,l,r);
     87     }
     88     else {
     89         querry(nod<<1,l,mid);
     90         querry((nod<<1)+1,mid+1,r);
     91     }
     92 }
     93 
     94 int Ans(int sum){
     95     int ans = 0;
     96     while (sum){
     97         if (sum & 1){
     98             ans++;
     99         }
    100         sum = (sum>>1);
    101     }
    102     return ans;
    103 }
    104 
    105 
    106 int main(){
    107     scanf("%d%d%d",&n,&m,&q);
    108     build(1,1,n);
    109     getchar();
    110     for(int i=1;i<=q;i++)
    111     {
    112         scanf("%s",&c);
    113         if(c=='C')
    114         {
    115             scanf("%d%d%d",&x,&y,&z);
    116             if(x>y)swap(x,y);
    117             getchar();
    118             updata(1,x,y,z);
    119         }
    120         else
    121         {
    122             scanf("%d%d",&x,&y);
    123             getchar();
    124             sum=0;
    125             if(x>y)swap(x,y);//x可能>y
    126             querry(1,x,y);
    127             cout<<Ans(sum)<<endl;;
    128         }
    129     }
    130     return 0;
    131 }
  • 相关阅读:
    嵌入式Linux基础知识
    面向对象程序设计与原则
    设计模式之工厂模式
    设计模式之单例模式
    基于Doxygen的C/C++注释原则
    设计模式概论
    重启博客
    java 单例模式的几种写法
    CountDownLatch、CyclicBarrier
    java ConcurrentHashMap和CopyOnWriteArrayList解决并发问题
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11381298.html
Copyright © 2020-2023  润新知