$n \leq 100000$个矩形,一个一个覆盖在坐标系上,每个颜色都不一样,问最后能看到几种颜色。

由于后面的颜色可以覆盖前面的颜色,可以把颜色与时间联系上,第$i$个矩形颜色$i$来把时间维变成Max,接下来就是二维操作。

把矩形差分后按$x$排序可以得到一个y轴上的区间操作:区间加上或删除某种颜色;查区间内没统计过答案的最大的颜色(以此保证每个颜色只统计一次)。

区间维护:啪在了这整个区间的所有颜色(集合s,用set存);最大的没统计过答案的颜色(Max值)。一个区间中s的最大值如果比孩子的Max还要大,那么要么他会成为这个区间的Max,要么这个区间里没有Max(把孩子区间里的Max啪没了)。这里注意的是每个区间只有覆盖这整个区间的颜色,没有包括他儿子的,所以会出现儿子有些颜色比父亲大的情况。如果他成为了这个区间的Max,首先他得没统计过答案,其次他得看得见,也就是不会被孩子里的所有比他大的颜色给啪没。注意他虽然是啪在这整个区间的颜色的最大值,但可能被若干子区间的比他大的颜色一起啪没,所以如果他要能露个头出来,必须大于子区间的Min--区间可见颜色中最小的一个。如果s的最大值比孩子的Max小,直接继承。每次把同个x的所有操作搞完之后,不停地取线段树根节点的Max并把这段颜色重新加入(标记了统计过答案,效果不同)。

现在多了个Min,Min只需要看s的最大值会不会把左右孩子的Min给啪掉,如果会就是s的最大值,否则直接继承。

俩log。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<set>
#include<algorithm>
//#include<math.h>
//#include<iostream>
//#include<time.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,t=; while ((c=getchar())<'' || c>'') (c=='-') && (t=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*t;
} //Pay attention to read! int n,m;
#define maxn 400011
int lisax[maxn],lx=,lisay[maxn],ly=,ll[maxn],rr[maxn];
struct MM{int x,y1,y2,ty,col;}mm[maxn]; int lm=;
bool cmpx(const MM &a,const MM &b) {return a.x<b.x;} bool vis[maxn];
struct SMT
{
struct Node{int ls,rs,Max,Min; set<int,greater<int> > s;}a[maxn<<];
int size,n;
void up(int x)
{
Node &b=a[x],&p=a[a[x].ls],&q=a[a[x].rs];
int mm=b.s.empty()?-:*(b.s.begin());
if (mm>max(p.Max,q.Max))
{
if (vis[mm]) b.Max=-;
else if (mm<min(p.Min,q.Min)) b.Max=-;
else b.Max=mm;
}
else b.Max=max(p.Max,q.Max);
b.Min=max(mm,min(p.Min,q.Min));
}
void build(int &x,int L,int R)
{
x=++size; a[x].Max=-; a[x].Min=-;
if (L==R) return;
int mid=(L+R)>>;
build(a[x].ls,L,mid); build(a[x].rs,mid+,R);
}
void clear(int N) {size=; n=N; a[].Max=a[].Min=-; int x; build(x,,n);}
int ql,qr,v;
void Add(int x,int L,int R)
{
if (ql<=L && R<=qr) {if (!vis[v]) a[x].s.insert(v); up(x); return;}
int mid=(L+R)>>;
if (ql<=mid) Add(a[x].ls,L,mid);
if (qr> mid) Add(a[x].rs,mid+,R);
up(x);
}
void add(int L,int R,int V) {ql=L; qr=R; v=V; Add(,,n);}
void DEL(int x,int L,int R)
{
if (ql<=L && R<=qr) {a[x].s.erase(v); up(x); return;}
int mid=(L+R)>>;
if (ql<=mid) DEL(a[x].ls,L,mid);
if (qr> mid) DEL(a[x].rs,mid+,R);
up(x);
}
void Del(int L,int R,int V) {ql=L; qr=R; v=V; DEL(,,n);}
}t; int main()
{
m=qread();
for (int i=,x1,x2;i<=m;i++)
{
x1=qread(); lm++; mm[lm].y1=qread(); x2=qread(); mm[lm].y2=qread();
mm[lm].x=x1; mm[lm].ty=; mm[lm+]=mm[lm]; lm++; mm[lm].x=x2; mm[lm].ty=-;
lisax[++lx]=x1; lisax[++lx]=x2; lisay[++ly]=mm[lm].y1; lisay[++ly]=mm[lm].y2;
mm[lm].col=mm[lm-].col=i;
} sort(lisax+,lisax++lx); sort(lisay+,lisay++ly);
lx=unique(lisax+,lisax++lx)-lisax-; ly=unique(lisay+,lisay++ly)-lisay-;
for (int i=;i<=lm;i++) mm[i].x=lower_bound(lisax+,lisax++lx,mm[i].x)-lisax,
mm[i].y1=lower_bound(lisay+,lisay++ly,mm[i].y1)-lisay,
mm[i].y2=lower_bound(lisay+,lisay++ly,mm[i].y2)-lisay;
for (int i=;i<=m;i++) ll[i]=mm[i<<].y1,rr[i]=mm[i<<].y2; t.clear(ly);
sort(mm+,mm++lm,cmpx);
int ans=;
for (int i=,j=;i<=lx;i++)
{
for (;j<=lm && mm[j].x==i;j++)
{
if (mm[j].ty==) t.add(mm[j].y1,mm[j].y2-,mm[j].col);
else t.Del(mm[j].y1,mm[j].y2-,mm[j].col);
}
int tmp=t.a[].Max;
while (~tmp)
{
vis[tmp]=; ans++; t.add(ll[tmp],rr[tmp]-,tmp);
tmp=t.a[].Max;
}
}
printf("%d\n",ans+);
return ;
}

Codeforces983D. Arkady and Rectangles的更多相关文章

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

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

  2. [CF983D]Arkady and Rectangles

    题意:按顺序在坐标轴上画$n$个颜色为$1\cdots n$的矩形(数字大的颜色覆盖数字小的颜色),问最后能看到多少种颜色 先离散化,然后考虑扫描线+线段树 线段树每个节点用一个set存覆盖整个区间的 ...

  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. scanf("%s",s)与gets(s)

    #include <stdio.h> void fun(char s[]) {; while(s[i]!='\0') {i++;} printf("%d",i);} v ...

  2. 人人必知的10个 jQuery 小技巧

    原文地址:http://info.9iphp.com/10-jquery-tips-everyone-should-know/ 人人必知的10个 jQuery 小技巧   收集的10个 jQuery ...

  3. HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数

    HtmlUnit官网的介绍: HtmlUnit是一款基于Java的没有图形界面的浏览器程序.它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充 ...

  4. vs 2017 boost 安装目录 非安装

    linuxg++ -Wall -std=c++11 boost_socks5.cpp -o boost_socks5 -lboost_system -lboost_thread -lpthread m ...

  5. 洛谷 P1120 小木棍[数据加强版]

    这道题可能是我做过的数据最不水的一道题-- 题目传送门 这题可以说是神剪枝,本身搜索并不算难,但剪枝是真不好想(好吧,我承认我看了题解)-- 剪枝: 用桶来存储木棍 在输入的时候记录下最长的木棍和最短 ...

  6. shell脚本,当用sed删除某一文件里面的内容时,并追加到同一个文件会出现问题。

    shell脚本,当用sed删除某一文件里面的内容时,并追加到同一个文件会出现问题.因为初始文件和写入文件是一个文件这是失败的.需要追加到另一个文件,然后再用mv进行操作.[root@localhost ...

  7. CVS在update时状态status

    cvs update -Ad 时,terminal 会display如下: P xx.v P xx.c ? xx.v ? xx.c A xx.v M xx.v U xx.v C xx.v 第一个字母: ...

  8. cache支持single/increment/increment4三种方式传输

    1.cache bypass signle---data length 已知 increment ---data length 不知 用 last data address  结束数据传输 2.cac ...

  9. LeetCode(137) Single Number II

    题目 Given an array of integers, every element appears three times except for one. Find that single on ...

  10. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph

    "Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...