Count the Colors 线段树
2024-08-22 10:57:12
题意:
n范围[1,8000] , li 和 ri 的范围[0,8000]。 n个操作,每个操作是把 [li , ri]内的点修改成一个颜色c。 n个操作过后,按颜色从小到大 输出每种颜色分别有几块。
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=1e9+;
const int INF= 0x3f3f3f3f;
const int N=1e5+; int add[N<<];
int flag; //flag判断相邻两个区间的颜色是否相同
int ans[N<<]; void push_down(int rt)
{
if(add[rt]>)
{
add[rt<<]= add[rt];
add[rt<<|]= add[rt];
add[rt]=-;
}
}
void Built(int l,int r,int rt)
{
add[rt]=;
if(l==r) return;
int m=l+r>>;
Built(l,m,rt<<);
Built(m+,r,rt<<|);
} void update(int x,int y,int c,int l,int r,int rt)
{
if(x<=l && r<=y)
{
add[rt]=c;
return;
}
push_down(rt);
int m=l+r>>;
if(x<=m) update(x,y,c,l,m,rt<<); //当寻找一个区间的时候,路径上的值全改成c
if(m<y) update(x,y,c,m+,r,rt<<|);//当寻找一个区间的时候,路径上的值全改成c
add[rt]=-; //寻找到了之后,把回头的路径全部改成-1,说明如果顺着这些点下来,一定能找到区间
} void query(int l,int r,int rt)
{
if(flag==add[rt]) return;
if(add[rt]==) //一次也没有被涂过
{
flag=; return;
}
if(add[rt]>)
{
if(flag!=add[rt]) //不是同一块海报
{
flag=add[rt];
ans[add[rt]]++;
}
return;
} //接下来是如果add[rt]== -1 ,表示顺着这个点 一定能找到区间
if(l==r)
return;
int m=l+r>>;
query(l,m,rt<<);
query(m+,r,rt<<|);
}
int main()
{
int x,y,z,n,m;
while(scanf("%d",&n)==)
{
mem(add,); //0表示该点没有涂色。
mem(ans,);
Built(,,); for(int i=;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
update(x, y-, z+, ,,);
}
query(,,); for(int i=;i<=;i++)
{
if(ans[i]) printf("%d %d\n",i-,ans[i]);
}
cout<<endl;
}
}
最新文章
- phalcon: 当删除循环删除一组数据,需要判断影响的行affectedRows
- C++与Java的语法区别
- Codeforces Round #371 (Div. 2)(set\unique)
- cellspacing,cellpadding什么区别
- C# 字符串转义和反转义
- 学习SQL的点点滴滴(二)删除临时表
- ClassPathXmlApplicationContext的启动
- mysql查看数据库命令
- iOS之核心动画(Core Animation)
- 搭建PhoneGap for Android开发环境
- 随手复习一下委托:delegate
- Mybatis oracle多表联合查询分页数据重复的问题
- Android 7.0 PopupWindow 的兼容问题
- Linux知识积累(3)$()和${}和$(())和(())
- C#异步编程----Thread
- 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 badge 通知
- Android Studio 之 项目瘦身、代码检查
- iOS弹出UIViewController小视图
- for循环中按条件删除数据元素
- 5-Python3从入门到实战—基础之数据类型(列表-List)
热门文章
- Kubernetes 服务质量 Qos 解析 - Pod 资源 requests 和 limits 如何配置?
- Linux thread process and kernel mode and user mode page table
- 【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】
- RDP Error: The Identity Of The Remote Computer Cannot Be Verified
- Kafka排队:Apache Kafka作为消息传递系统
- CI中如何配置BootStrap
- 作为一个纯粹数据结构的 Redis Streams
- NIO(2):Channel
- React 了解学习
- 深入剖析Linux IO原理和几种零拷贝机制的实现