解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的status是两个儿子节点的status异或得到的,同时为了能够提高查找效率,还要设置一个信息cover,cover=1表示这段区间只有一种颜色,cover=0表示有多种颜色被覆盖了,所以在找到cover=1的节点时直接回溯(因为子节点都是一种颜色,不需要再去查找)。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 100005;
struct Segment
{int l,r;int status;int cover;
}tree[maxn<<2];
int n,color,m;void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;tree[rt].status = tree[rt].cover = 1;if(l == r) return;int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
}void update(int rt,int l,int r,int val)
{if(l <= tree[rt].l && tree[rt].r <= r){tree[rt].status = 1 << (val - 1);tree[rt].cover = 1;return;}if(tree[rt].cover){tree[rt<<1].cover = tree[rt<<1|1].cover = tree[rt].cover;tree[rt<<1].status = tree[rt<<1|1].status = tree[rt].status;tree[rt].cover = 0;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(mid >= l) update(rt<<1,l,r,val);if(mid < r) update(rt<<1|1,l,r,val);tree[rt].status = tree[rt<<1].status | tree[rt<<1|1].status;if(tree[rt<<1].cover && tree[rt<<1|1].cover && tree[rt<<1].status == tree[rt<<1|1].status)tree[rt].cover = 1;
}int query(int rt,int l,int r)
{if(l <= tree[rt].l && tree[rt].r <= r)return tree[rt].status;if(tree[rt].cover) return tree[rt].status;int mid = (tree[rt].l + tree[rt].r) >> 1;int ans = 0;if(l <= mid) ans |= query(rt<<1,l,r);if(mid < r) ans |= query(rt<<1|1,l,r);return ans;
}int main()
{char ch;int a,b,c;while(scanf("%d%d%d",&n,&color,&m)!=EOF){build(1,1,n);while(m--){getchar();scanf("%c",&ch);if(ch == 'C'){scanf("%d%d%d",&a,&b,&c);if(a > b) swap(a,b);update(1,a,b,c);}else{scanf("%d%d",&a,&b);if(a > b) swap(a,b);int ans = query(1,a,b),sum = 0;for(int i = 0; i < color; i++)if(ans & (1 << i))sum++;printf("%d\n",sum);}}}return 0;
}

poj 2777(线段树+区间染色)相关推荐

  1. 线段树区间染色 浮水法 学习小记 Poj 2777 + Poj 2528

    复习过的东西必须时常拿来练练,虽说都是水题.... Poj 2777 典型的区间染色问题,貌似我的写法为了不数组越界必须多开一倍的数组空间.....还没有想到解决方法,有机会参考一下别人的写法. Po ...

  2. Hotel POJ - 3667(线段树 + 区间合并

    题意: 给定长度为n的区间 ,有2个操作: 操作1: 在区间中靠左放k个元素,输出新放入元素中最左边的位置,如果放不下输出 0: 操作2 : 清空 l 到 l+w-1这一段区间的元素 这里有一个状态转 ...

  3. POJ - 2528 (线段树区间染色 + 离散化)

    mle了30来发 花了两个半小时 终于找到bug a了这题 a了之后不知道该开心还是该骂自己sb 题目思路 题目挺简单的就是区间染色 最后统计总区间的颜色个数 因为区间数不算大 但是区间的端点值可以很 ...

  4. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

  5. POJ 2777 线段树

    一道线段树.lazy标记+位运算--(第一次写这个什么lazy标记,抄了一发题解) 我们发现:"或"操作在这里用正合适. 原题请戳这里 // by Sirius_Ren #incl ...

  6. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  7. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  8. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  9. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

最新文章

  1. pytorch 指定卡1_[原创][深度][PyTorch] DDP系列第一篇:入门教程
  2. Java程序员从笨鸟到菜鸟之(九十)跟我学jquery(六)jquery中事件详解
  3. html模板 循环里if,django模板里循环变量table里想要两个一行如何控制
  4. TortoiseGit 更新远程仓库最新代码到本地仓库_入门试炼_05
  5. 为什么谐振时电抗为0_高压直流输电(LCC-HVDC 和 MMC-HVDC)中平波电抗器的作用和选择策略...
  6. 万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)
  7. Leetcode:Pow(x,n)
  8. 【canvas】linejoin——miterLimit
  9. 黑苹果配置清单以及安装
  10. 第五次网页前端培训(JS的基本使用)
  11. IPFS(DRAFT 3) 中文版白皮书
  12. VS Code、IDEA开发工具及插件
  13. Font Awesome 找图标的正确姿势
  14. 读书寄语:难过时就抱抱自己,时间治愈的,都是愿意自渡的人
  15. 前台使用viewbag
  16. PPT精灵:批量插入图片生成幻灯片
  17. 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
  18. android投影到win7,求教,如何把安卓手机屏幕投射到win7电脑上-win7投屏设置,手机投屏到电脑win7...
  19. VirtualBox复制虚拟机(同电脑、跨电脑)
  20. Unity3D 集成 高德地图SDK 地图

热门文章

  1. Call Exec in PeopleCode
  2. GIt本地相关操作(一)
  3. 不是你无法入门自然语言处理(NLP),而是你没找到正确的打开方式
  4. 使用 python 获取 httpd 程序所占用物理内存
  5. 再不用担心DataRow类型转换和空值了(使用扩展方法解决高频问题)
  6. zabbix3.0安装过程记录
  7. 一款jquery实现的整屏切换特效
  8. Java Hibernate 二级缓存配置及缓存的统计策略
  9. redmine 邮件发送问题修复
  10. 如果我要...(开发版)