题意:按顺序在坐标轴上画$n$个颜色为$1\cdots n$的矩形(数字大的颜色覆盖数字小的颜色),问最后能看到多少种颜色

先离散化,然后考虑扫描线+线段树

线段树每个节点用一个set存覆盖整个区间的颜色,$mx$表示之前未被看到并且能在这个区间看到的最大颜色,$mn$表示能在这个区间看到的最小颜色,那么修改时用儿子的对应信息和当前节点的set最大值更新信息即可

每次扫描线修改完后统计答案,不停地把根节点的$mx$加入答案(已被看到过)并更新线段树对应区间即可

注意坐标区间$[l,r]$转为实现时的区间是$[l,r-1]$!

#include<stdio.h>
#include<set>
#include<map>
#include<vector>
using namespace std;
set<int>cov[800010];
int mx[800010],mn[800010];
bool vis[100010];
void pushup(int x,bool f){
	if(f)
		mx[x]=mn[x]=0;
	else{
		mx[x]=max(mx[x<<1],mx[x<<1|1]);
		mn[x]=min(mn[x<<1],mn[x<<1|1]);
	}
	if(!cov[x].empty()){
		int g=*cov[x].rbegin();
		if(!vis[g])
			mx[x]=max(mx[x],g);
		else
			mn[x]=max(mn[x],g);
	}
	if(mn[x]>mx[x])mx[x]=0;
}
void modify(int L,int R,int v,int l,int r,int x){
	if(L<=l&&r<=R){
		if(v>0)
			cov[x].insert(v);
		else
			cov[x].erase(-v);
		return pushup(x,l==r);
	}
	int mid=(l+r)>>1;
	if(L<=mid)modify(L,R,v,l,mid,x<<1);
	if(mid<R)modify(L,R,v,mid+1,r,x<<1|1);
	pushup(x,0);
}
map<int,int>px,py;
map<int,int>::iterator it;
struct rect{
	int x1,y1,x2,y2;
}r[100010];
struct event{
	int l,r,v;
	event(int a=0,int b=0,int c=0){l=a;r=b;v=c;}
};
vector<event>e[200010];
int main(){
	int n,nx,ny,i,ans;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d%d%d%d",&r[i].x1,&r[i].y1,&r[i].x2,&r[i].y2);
		px[r[i].x1]=px[r[i].x2]=1;
		py[r[i].y1]=py[r[i].y2]=1;
	}
	for(nx=1,it=px.begin();it!=px.end();it++,nx++)it->second=nx;
	nx--;
	for(ny=1,it=py.begin();it!=py.end();it++,ny++)it->second=ny;
	ny--;
	for(i=1;i<=n;i++){
		r[i].x1=px[r[i].x1];
		r[i].x2=px[r[i].x2];
		r[i].y1=py[r[i].y1];
		r[i].y2=py[r[i].y2]-1;
		e[r[i].x1].push_back(event(r[i].y1,r[i].y2,i));
		e[r[i].x2].push_back(event(r[i].y1,r[i].y2,-i));
	}
	ans=0;
	for(i=1;i<=nx;i++){
		for(event v:e[i])modify(v.l,v.r,v.v,1,ny,1);
		while(mx[1]){
			vis[mx[1]]=1;
			ans++;
			modify(r[mx[1]].y1,r[mx[1]].y2,0,1,ny,1);
		}
	}
	printf("%d",ans+1);
}

[CF983D]Arkady and Rectangles的更多相关文章

  1. [CF983D]Arkady and Rectangles[线段树+可删堆/set]

    题意 你有一个无限大的绘图板,开始颜色是\(0\) , 你将进行\(n\) 次绘图,第\(i\) 次绘图会将左下角为 \((x_1, y_1)\),右上角为\((x_2, y_2)\) 的矩形涂成颜色 ...

  2. Codeforces983D. Arkady and Rectangles

    $n \leq 100000$个矩形,一个一个覆盖在坐标系上,每个颜色都不一样,问最后能看到几种颜色. 由于后面的颜色可以覆盖前面的颜色,可以把颜色与时间联系上,第$i$个矩形颜色$i$来把时间维变成 ...

  3. Codeforces Round #483 (Div. 1) 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 为了证明一下我又来更新了,写一篇简要的题解吧. 这场比赛好像有点神奇,E题莫名是道原题,导致有很多选手直接过掉了(Claris 表演24s过题 ...

  4. poj-1314 Finding Rectangles

    题目地址: http://poj.org/problem?id=1314 题意: 给出一串的点,有些点可以构成正方形,请按照字符排序输出. 因为这道题的用处很大, 最近接触的cv 中的Rectangl ...

  5. [ACM_暴力][ACM_几何] ZOJ 1426 Counting Rectangles (水平竖直线段组成的矩形个数,暴力)

    Description We are given a figure consisting of only horizontal and vertical line segments. Our goal ...

  6. codeforces 713B B. Searching Rectangles(二分)

    题目链接: B. Searching Rectangles time limit per test 1 second memory limit per test 256 megabytes input ...

  7. White Rectangles[HDU1510]

    White Rectangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. Java基础之在窗口中绘图——绘制直线和矩形(Sketcher 2 drawing lines and rectangles)

    控制台程序. import javax.swing.JComponent; import java.util.*; import java.awt.*; import java.awt.geom.*; ...

  9. Counting Rectangles

    Counting Rectangles Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1043 Accepted: 546 De ...

随机推荐

  1. 如何把阿里云的服务器配置为mac的共享文件夹(亲测有效)

    写在开头的就是,我只能百分之九十确定这个是真的有效....毕竟试了太多的方法,最后莫名其妙的就好了.. - -# 基础的步骤就不说了,网上一搜一大把,大家可能follow了所有的步骤以后发现还是连接不 ...

  2. 第九届蓝桥杯C/C++B组题解附代码

    1.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 125天 打开日历就ok 2. 标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库 ...

  3. Boke光纤交换机的snmp配置

    今天我配置了一下Boke光纤交换机e-300的snmp trap的配置 敲击help命令你会发现配置snmp的命令共有四个 snmpconfig                      Config ...

  4. 【AtCoder】ARC082 F - Sandglass

    [链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...

  5. 【洛谷 P1631】 序列合并 (堆)

    题目链接 直接暴力搞是\(n\)方的复杂度.\(n^2\)个数选\(n\)个最小的,容易想到堆. 我们堆里记录两个信息:到\(A\)数组哪个位置了,到\(B\)数组哪个位置了, 我直接把这两个信息存在 ...

  6. bzoj 2142 国家集训队试题 礼物

    问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数, 也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并 那么问题就转化成了快速求C(N ...

  7. mybatis注解动态sql

    @Insert("INSERT INTO user (name, age, gender, experience) VALUES (<a href="http://www.o ...

  8. Chrome浏览器跨域插件

    Moesif Origin & CORS Changer 这个插件允许发送跨域请求,重写Request Origin 和 CORS headers. 解决Debug Javascript时候出 ...

  9. How to learn wxPython

    目录 How to learn wxPython Learn Python Choose a good editor Install wxPython Read the wxPython tutori ...

  10. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...