题目链接:贪婪大陆 - 洛谷

分析:先说一个容易引起误会的地方,就是同一个地方可以存在多种颜色,这也是本道题目最大的坑点,我一开始就以为后来染色会把之前染过色的地方覆盖掉,那这样就不太好处理了,而这道题目告诉我们对一段区间进行染色,颜色只能是这段区间不存在的,所以这也就给了我们一点启发意义:我们并不需要真正的对染的颜色关注太多,因为我们不可能去遍历哪一种颜色在该区间未出现过,下面给出正解:

我们只需要建立两棵线段树,一棵线段树中存储染色区间的起点,另一棵线段树中存储染色区间的终点,然后我们每次对一块区间[l,r]进行染色只需要把区间左端点的位置在第一棵线段树上加1,把区间右端点的位置在第二棵线段树上加1,这样我们就保证了区间[l,r]上一定有该号颜色(因为我们选取的颜色之前在区间[l,r]上是不存在的),那我们怎么知道一块区间[l,r]上有多少种颜色呢?我们可以这样考虑,可能出现在区间[l,r]上的染色区间肯定满足左边界在r前面,所以我们可以先找一下之前染色区间左边界在r之前的有多少种颜色,这些染色区间的右边界有两种情况,一种是在[1,l-1],一种是在[l,+无穷大],第一种情况的染色区间不会与[l,r]有交集,而后一种情况的染色区间一定会与[l,r]有交集,所以我们只要用染色区间左边界在r及之前的染色区间数量减去染色区间右边界在l之前的染色区间数量即可得到目标区间的颜色种类。

可以用线段树实现,也可以用树状数组实现,下面分别给出两种代码,后面还会对本题做出相应变形

线段树版本代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+10;
int l[2][N],r[2][N],sum[2][N];
void pushup(int t,int id)
{sum[t][id]=sum[t][id<<1]+sum[t][id<<1|1];
}
void build(int t,int id,int L,int R)
{l[t][id]=L;r[t][id]=R;sum[t][id]=0;if(L==R) return ;int mid=L+R>>1;build(t,id<<1,L,mid);build(t,id<<1|1,mid+1,R);
}
void update_point(int t,int id,int x,int val)
{if(l[t][id]==r[t][id]){sum[t][id]+=val;return ;}int mid=l[t][id]+r[t][id]>>1;if(x<=mid) update_point(t,id<<1,x,val);else update_point(t,id<<1|1,x,val);pushup(t,id);
}
int query_interval(int t,int id,int L,int R)
{if(l[t][id]>=L&&r[t][id]<=R) return sum[t][id];int mid=l[t][id]+r[t][id]>>1;int ans=0;if(L<=mid) ans+=query_interval(t,id<<1,L,R);if(mid+1<=R) ans+=query_interval(t,id<<1|1,L,R);return ans;
}
int main()
{int n,m;cin>>n>>m;build(0,1,1,n);//储存起点 build(1,1,1,n);//储存终点 for(int i=1;i<=m;i++){int op,a,b;scanf("%d%d%d",&op,&a,&b);if(op==1){update_point(0,1,a,1);update_point(1,1,b,1);}else{int ans=query_interval(0,1,1,b)-query_interval(1,1,1,a-1);printf("%d\n",ans);}}return 0;
}

树状数组版本代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+10;
int c[2][N],n,m;
int lowbit(int x)
{return x&(-x);
}
int sum(int k,int x)
{int ans=0;for(;x;x-=lowbit(x))ans+=c[k][x];return ans;
}
void add(int k,int x,int val)
{for(;x<=n;x+=lowbit(x))c[k][x]+=val;
}
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){int op,a,b;scanf("%d%d%d",&op,&a,&b);if(op==1){add(0,a,1);add(1,b,1);}else{int ans=sum(0,b)-sum(1,a-1);printf("%d\n",ans);}}return 0;
}

倘若这道题目是覆盖颜色,那就需要用另一种方法来解决了,就是说每次输入一段区间告诉你将要染色的颜色,然后问你某段区间内存在的颜色种数,下面给出颜色种数较少情况下的思路分析

我们可以把一个区间存在的颜色用一个数的二进制来表示,其实这个很简单,比如某一段区间的颜色是9,其对应的二进制为1001,这就意味着这段区间上存在2种颜色,也就是说某段区间的颜色种数就是这段区间颜色值的二进制表示中1的个数,至于pushup操作,就是当前区间的两个子区间的或值,然后剩下的就是一个线段树模板了

具体题目见:Count Color(线段树)_AC__dream的博客-CSDN博客

P2184 贪婪大陆(线段树或树状数组+思维)相关推荐

  1. 洛谷 P2184 贪婪大陆 解题报告

    P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...

  2. 【树状数组 思维题】luoguP3616 富金森林公园

    树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...

  3. 【洛谷】P2184 贪婪大陆

    题目地址: https://www.luogu.com.cn/problem/P2184 题目背景: 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed ...

  4. P2184 贪婪大陆

    题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁. 小 ...

  5. hdoj 4417 Super Mario 【树状数组 + 思维】

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. HDU - 5775 - Bubble Sort( 树状数组 + 思维 )

    题目链接:点击进入 题目 题意 问在给出的冒泡排序过程中,一个数到达的最右边位置与最左边位置距离差. 思路 对于一个数,位置 i ,假设右边比它小的数有 r 个,左边比它大的数有 l 个,最右边到达的 ...

  7. lugou P2184 贪婪大陆(线段树)

    题目描述 小 FF 最后一道防线是一条长度为 nn 的战壕,小 FF 拥有无数多种地雷,而 SCV 每次可以在 [L, R]区间埋放同一种不同于之前已经埋放的地雷.由于情况已经十万火急,小 FF 在某 ...

  8. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  9. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  10. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

最新文章

  1. maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
  2. python数字图像处理、色彩空间类型转换_Python+OpenCV图像处理—— 色彩空间转换...
  3. 云炬随笔20210819
  4. 计算机网络多元化媒体传达,【多媒体技术论文】视觉传达设计多媒体技术的应用(共4007字)...
  5. [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析
  6. 透彻解析!字节跳动Android实习面试凉凉经,年薪超过80万!
  7. 电子认证服务许可证企业名单_工信部注销28家企业跨地区增值电信业务经营许可证...
  8. C++中的构造函数小结
  9. 2019-07-18
  10. 携宠旅行逐渐成为新一代宠物主“刚需”,宠物友好型酒店呈现稀缺
  11. coolie —— 前端开发构建工具。
  12. python画一个正方形和圆_python用正方形画圆|怎么用matlab画出一个正方形?
  13. 用计算机怎么管理小米路由器,小米路由器3G怎么设置?(电脑)
  14. jQuery+PHP+Ajax动态数字统计展示实例
  15. Thor UI - 轻量简洁的免费开源移动端 UI 组件库,支持原生小程序和 uni-app
  16. R语言使用caret包的train函数构建adaboost模型、模型调优、自定义设置trainControl函数和tuneLength参数
  17. hadoop学习步骤
  18. 每日新闻:百度首个无人驾驶运营项目落户武汉;微软叫停Linux专利战;网易携手芬兰电信Elisa;瑞星华为联合发布云安全解决方案...
  19. 微信插件第一讲之自动回复机器人(护妻宝)
  20. WIN7安装VISIO 错误1406 安装程序无法将值 写入注册表项解决办法

热门文章

  1. 不积跬步无以至千里010
  2. 李智慧 - 架构师训练营 第四周
  3. Web.xml 错误或异常页面配置
  4. Java take和poll,Java多线程-CompletionService
  5. Caffe中的solver文件参数
  6. C语言实验——圆周率 sdut oj
  7. Photoshop抠图笔记
  8. 获取input输入值和获取form表单中的组件输入值区别
  9. pr中小人国微缩世界,速度快门的变化,动态地图,手写文字效果,打字机输入文字,照片定格效果
  10. 基于Phyton爬虫索引设计与实现答辩PPT模板