$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. 数据倾斜是多么痛?spark作业调优秘籍

    目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么?      CSDN日报20170703——<从高考到程序员——我一直在寻找答案>      [直播]探究L ...

  2. Luogu P4593 [TJOI2018]教科书般的亵渎

    亵渎终于离开标准了,然而铺场快攻也变少了 给一个大力枚举(无任何性质)+艹出自然数幂和的方法,但是复杂度极限是\(O(k^4)\)的,不过跑的好快233 首先简单数学分析可以得出\(k=m+1\),因 ...

  3. HITICS || 2018大作业 程序人生 Hello's P2P

    摘  要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...

  4. AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)

    首先,有这样一道题: 给你一个单词W和一个文章T,问W在T中出现了几次(原题见POJ3461). OK,so easy~ HASH or KMP 轻松解决. 那么还有一道例题: 给定n个长度不超过50 ...

  5. mysql 复制中的 paxso 的两阶段和事务两阶段的区别

    1.普通的两阶段是 推送不同的数据给不同的主机,一旦出现网络中断,造成问题是不可服务. 因为本身有锁,故无所谓. 2.paxos 的两阶段是将相同的 数据给不同的主机,一旦超过半数即可认为成功.

  6. javascript 写一个随机范围整数的思路

    const {random} = Math; //返回 [min,max] 的随机值 //[0,1) * (max - min + 1) => [0,max-min+1) //[0,max-mi ...

  7. RestTemplate进行表单请求,注意要使用MultiValueMap

    在对接API的时候,有时候文档中会说,表单提交,这时候就需要用到 MultiValueMap来操作,下面给大家展示一个简单的demo. MultiValueMap<Object, Object& ...

  8. CVS使用之:先update后commit

    vcs在进行版本管理时: 1.如果添加新文件 cvs add directory_name/filename cvs commit directory_name/filename 2.如果修改文件 c ...

  9. 一、Numpy库与多维数组

    # Author:Zhang Yuan import numpy as np '''重点摘录: 轴的索引axis=i可以理解成是根据[]层数来判断的,0表示[],1表示[[]]... Numpy广播的 ...

  10. 落谷p3376 最大流EdmondsKarp增广路模板

    参考: https://blog.csdn.net/txl199106/article/details/64441994 分析: 该算法是用bfs求出是否有路从s到t, 然后建立反向边(关于反向边), ...