poj 2777(线段树+区间染色)
解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有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(线段树+区间染色)相关推荐
- 线段树区间染色 浮水法 学习小记 Poj 2777 + Poj 2528
复习过的东西必须时常拿来练练,虽说都是水题.... Poj 2777 典型的区间染色问题,貌似我的写法为了不数组越界必须多开一倍的数组空间.....还没有想到解决方法,有机会参考一下别人的写法. Po ...
- Hotel POJ - 3667(线段树 + 区间合并
题意: 给定长度为n的区间 ,有2个操作: 操作1: 在区间中靠左放k个元素,输出新放入元素中最左边的位置,如果放不下输出 0: 操作2 : 清空 l 到 l+w-1这一段区间的元素 这里有一个状态转 ...
- POJ - 2528 (线段树区间染色 + 离散化)
mle了30来发 花了两个半小时 终于找到bug a了这题 a了之后不知道该开心还是该骂自己sb 题目思路 题目挺简单的就是区间染色 最后统计总区间的颜色个数 因为区间数不算大 但是区间的端点值可以很 ...
- poj 2528 线段树离散化+染色
题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...
- POJ 2777 线段树
一道线段树.lazy标记+位运算--(第一次写这个什么lazy标记,抄了一发题解) 我们发现:"或"操作在这里用正合适. 原题请戳这里 // by Sirius_Ren #incl ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- 树链剖分——线段树区间合并bzoj染色
线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...
最新文章
- pytorch 指定卡1_[原创][深度][PyTorch] DDP系列第一篇:入门教程
- Java程序员从笨鸟到菜鸟之(九十)跟我学jquery(六)jquery中事件详解
- html模板 循环里if,django模板里循环变量table里想要两个一行如何控制
- TortoiseGit 更新远程仓库最新代码到本地仓库_入门试炼_05
- 为什么谐振时电抗为0_高压直流输电(LCC-HVDC 和 MMC-HVDC)中平波电抗器的作用和选择策略...
- 万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)
- Leetcode:Pow(x,n)
- 【canvas】linejoin——miterLimit
- 黑苹果配置清单以及安装
- 第五次网页前端培训(JS的基本使用)
- IPFS(DRAFT 3) 中文版白皮书
- VS Code、IDEA开发工具及插件
- Font Awesome 找图标的正确姿势
- 读书寄语:难过时就抱抱自己,时间治愈的,都是愿意自渡的人
- 前台使用viewbag
- PPT精灵:批量插入图片生成幻灯片
- 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
- android投影到win7,求教,如何把安卓手机屏幕投射到win7电脑上-win7投屏设置,手机投屏到电脑win7...
- VirtualBox复制虚拟机(同电脑、跨电脑)
- Unity3D 集成 高德地图SDK 地图