题目链接:POJ 2777 Count Color

【题目大意】

给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1;

有两种操作

1 。把给定区间的板子染成一种颜色

2 。查询给定区间有多少种不同的颜色

此题一看便是线段树的区间修改问题 , 然而对于统计有多少种不同颜色 , 开始想用set 来操作, 后来发现用set每次查询都要走到树的叶子节点,并不能运用线段树的高效率查询。 后来学到了 二进制状态压缩的方法 。(又是状态压缩,我怎么没想到捏!)

30种颜色 ,我们用二进制来存 , 每一位对于一种颜色即可。

【源代码】

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define L(m) m<<1
#define R(m) m<<1|1
using namespace std;
const int maxn = 100000+5;
int ans =0 ;
struct node{int l,r,color;bool setv; //懒惰标记
}tree[maxn<<2];
void Build(int m,int l,int r){tree[m].l=l ; tree[m].r=r;if(tree[m].l==tree[m].r){tree[m].color=1;tree[m].setv = 0; //不要忘了赋初值return ;}int mid = (l+r)>>1;Build(L(m),l,mid);Build(R(m),mid+1,r);tree[m].color = tree[L(m)].color | tree[R(m)].color; //回溯,也可以写maintain(m);
}
void pushdown(int m){if(tree[m].l==tree[m].r) return;if(tree[m].setv){int tmp = tree[m].color;tree[L(m)].color = tree[R(m)].color = tmp;tree[L(m)].setv= true;tree[R(m)].setv= true;tree[m].setv = false;}
}
void maintain(int m){tree[m].color = tree[L(m)].color | tree[R(m)].color;
}
void Update(int m,int l,int r,int x){if(tree[m].l>=l && tree[m].r<=r){tree[m].setv = true;tree[m].color = (1<<(x-1)); //存入2的几次方return ;}pushdown(m);int mid = (tree[m].l+tree[m].r)>>1;if(mid>=l)Update(L(m),l,r,x);if(mid<r)Update(R(m),l,r,x);maintain(m);
}
void Query(int m,int l,int r){if( (tree[m].l >= l && tree[m].r <= r)){ans |=tree[m].color; //用 或 操作来实现颜色的累加return  ;}pushdown(m);int mid = (tree[m].l + tree[m].r)>>1;if(mid>=l)Query(L(m),l,r);if(mid<r)Query(R(m),l,r);
}
int main(){int n,m,t;scanf("%d%d%d",&n,&m,&t);Build(1,1,n);char cmd;int a,b,c;while(t--){scanf(" %c",&cmd);scanf("%d%d",&a,&b);if(a>b)swap(a,b);if(cmd=='C'){scanf("%d",&c);Update(1,a,b,c);}else{ans = 0;int count = 0;Query(1,a,b);for(int i=0;i<m;i++){if(ans & (1<<i)) //与每一个二进制位进行 与 操作 , 相同说明有这个颜色count++;}printf("%d\n",count);}}return 0;
}

转载于:https://www.cnblogs.com/chaiwenjun000/p/5321180.html

POJ 2777 Count Color (线段树区间修改 + 状态压缩)相关推荐

  1. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  2. POJ 2777 - Count Color(线段树区间更新+状态压缩)

    题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...

  3. POJ2777 Count Color 线段树区间更新

    题目描写叙述: 长度为L个单位的画板,有T种不同的颜料.现要求按序做O个操作,操作分两种: 1."C A B C",即将A到B之间的区域涂上颜色C 2."P A B&qu ...

  4. 【模板】线段树区间修改

    区间修改: 区间修改过程类似于区间询问,例如将[ul, ur]内的所有元素都加上v,则进行如下操作: 当当前区间被区间[ul, ur]所包含时, 当前的节点值加上区间长度(r - l  + 1)乘以v ...

  5. python:线段树区间修改 + 区间查询 模板 + 坑点总结

    from functools import reduceclass SegTree:'''支持增量更新,覆盖更新,序列更新,任意RMQ操作基于二叉树实现初始化:O(1)增量更新或覆盖更新的单次操作复杂 ...

  6. poj 2777 Count Color

    http://poj.org/problem?id=2777 简单线段树,[成段更新,成段查询]! View Code 1 #include <cstdio> 2 #include < ...

  7. HDU 1698 Just a Hook (线段树区间修改+区间查询)

    题目链接: 传送门 题意:Pudge对装备钩子进行若干次的强化,强化分为三种分别对应的价值是1,2,3,在经历过若干次操作后,输出钩子对应的总价值,每次强化都是对钩子进行区间修改 解题思路:在明白了题 ...

  8. hdu1698(线段树/区间修改/求和)

    hdu1698"Just a Hook" 题意: 有一个区间s [1,n],每一节si的初始价值为1.定义操作:x y val,将区间[x,y]中的每一个小节的价值改为val.问: ...

  9. 1631 小鲨鱼在51nod小学(线段树区间修改+单点查询:不用下传lazy的区间修改)

    题目描述: 1631 小鲨鱼在51nod小学 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务. 每一个职务都有一个起始时间A和结束时间B, ...

最新文章

  1. Microsoft Lync Server 2013 协议路由
  2. C语言面试基础知识整理
  3. zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
  4. 尝鲜delphi开发android/ios_环境搭建
  5. 【NOIP2012-开车旅行】
  6. python错误怎么处理_python报的错误怎么处理
  7. UFLDL教程:Exercise:PCA in 2D PCA and Whitening
  8. Trie可持久化Trie
  9. Java之品优购课程讲义_day16(2)
  10. 矩池云上如何修改cuda版本
  11. [linux]redhat7.6 安装telnet
  12. Android编译32/64位so or bin(Android.bp or Android.mk)
  13. ERP系统健康体检的三大指标
  14. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.10.11
  15. python3GUI--下载抖音小姐姐所有无水印视频(附源码)
  16. Confusing Problem
  17. 【2020-CVPR-3D人体姿态估计】MetaFuse :A Pre-trained Fusion Model for Human Pose Estimation
  18. greenplum麒麟安装笔记
  19. 蒲公英应用内测使用方法总结
  20. VGG网络讲解——小白也能懂

热门文章

  1. 如何把竖排的数据变为横排_读懂微信改版背后的焦虑,企业新媒体营销该如何自救?...
  2. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY‘RE NOT. RENEWALS ARE LESSER
  3. mybatis if标签字符串判断
  4. 【代码源 Div1 - 102】#323. 最长因子链(dp)
  5. 【Luogu2085】最小函数值(优先队列)
  6. c语言中数据类型的课件,C语言数据类型课件.ppt
  7. cdr多页面排版_比AI更好用的文字排版软件推荐!
  8. c语言判断字符串的编码,C语言中判断一个char*是不是utf8编码
  9. profibus 主站软件_PROFIBUS网络的DP主站与DP从站
  10. JavaScript变量、属性、函数、方法的区别(1)