题目

参考博客地址

题意:

  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;
}
}

最新文章

  1. phalcon: 当删除循环删除一组数据,需要判断影响的行affectedRows
  2. C++与Java的语法区别
  3. Codeforces Round #371 (Div. 2)(set\unique)
  4. cellspacing,cellpadding什么区别
  5. C# 字符串转义和反转义
  6. 学习SQL的点点滴滴(二)删除临时表
  7. ClassPathXmlApplicationContext的启动
  8. mysql查看数据库命令
  9. iOS之核心动画(Core Animation)
  10. 搭建PhoneGap for Android开发环境
  11. 随手复习一下委托:delegate
  12. Mybatis oracle多表联合查询分页数据重复的问题
  13. Android 7.0 PopupWindow 的兼容问题
  14. Linux知识积累(3)$()和${}和$(())和(())
  15. C#异步编程----Thread
  16. 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 badge 通知
  17. Android Studio 之 项目瘦身、代码检查
  18. iOS弹出UIViewController小视图
  19. for循环中按条件删除数据元素
  20. 5-Python3从入门到实战—基础之数据类型(列表-List)

热门文章

  1. Kubernetes 服务质量 Qos 解析 - Pod 资源 requests 和 limits 如何配置?
  2. Linux thread process and kernel mode and user mode page table
  3. 【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】
  4. RDP Error: The Identity Of The Remote Computer Cannot Be Verified
  5. Kafka排队:Apache Kafka作为消息传递系统
  6. CI中如何配置BootStrap
  7. 作为一个纯粹数据结构的 Redis Streams
  8. NIO(2):Channel
  9. React 了解学习
  10. 深入剖析Linux IO原理和几种零拷贝机制的实现