题意:

给n个互不相交的多边形(边均平行于坐标轴),问最大深度。深度的定义是,若多边形A被多边形B包含,则\(dep[A]=max(dep[B])+1\)。坐标系的深度为0。(n<=40000,顶点个数<=200000)

题解:

扫描线+动态维护区间。

考虑从左往右枚举交x轴平行于y轴的扫描线,维护每一个多边形在这条扫描线上能包含的最大\(y\)区间。

在任意时刻,这段区间都是连续的,因此我们只需维护两个端点。

将点离散,扫描线扫描的是所有点的x轴坐标。将所有点按照x为第一关键字、y为第二关键字,升序排序。然后从小到大枚举每个点。

令当前枚举到的点为\(p\)点,所在多边形为\(A\)。

然后我们在这些要么包含要么不交的区间的端点中找一个点\(q\),满足\(y_q>y_p\)且\(y_q\)最小,\(q\)所在多边形为\(B\)。

由于我们是从左往右扫,而且多边形互不相交,因此问题转化为求当前端点被多少个区间包含的问题。

考虑这两种情况:

1、被\(q\)点所在区间包含,则\(dep[A]=dep[B]+1\)

2、没有被包含,则\(dep[A]=dep[B]\)

那么我们如何判断包含呢?我们在维护的两个端点打上这样的标记:

一个多边形的边\((u, v)\),方向为逆时针方向,假设方向为\((u->v)\),则我们标记边的终点\(v\)。

则可以发现如果这个\(q\)是有标记的,则\(A\)没有被\(B\)包含。否则被\(B\)包含。

证明就是分类讨论几种情况即可。

现在来考虑如何维护每个多边形包含的区间。

由于一个多边形内每个点的\(x\)轴出现次数一定是偶数次。而由于排序后的性质,每条有向边的起点就加入到区间,终点则去掉。

到此本题解决。

#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int n, d[40005], ans, tot;
struct ip {
int x, y, id;
bool flag;
bool operator < (const ip &a) const {
return x==a.x?y<a.y:x<a.x;
}
}p[N];
map<int, ip *>mp;
void work() {
sort(p+1, p+1+tot);
map<int, ip *>::iterator it;
for(int i=1; i<=tot; ++i) {
int y=p[i].y;
it=mp.find(y);
if(it!=mp.end()) {
mp.erase(it);
}
else {
mp[y]=&p[i];
int id=p[i].id;
if(!d[id]) {
it=mp.upper_bound(y);
if(it==mp.end()) {
d[id]=1;
}
else {
if(it->second->flag) d[id]=d[it->second->id];
else d[id]=d[it->second->id]+1;
}
}
}
}
for(int i=1; i<=n; ++i) {
ans=max(ans, d[i]);
}
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; ++i) {
int k, x[2], t;
scanf("%d%d", &k, &x[0]);
t=x[0];
for(int j=1; j<=k; ++j) {
if(j!=k) scanf("%d", &x[j&1]);
else x[0]=t;
p[++tot]=(ip){x[0], x[1], i, (bool)(j&1)};
}
}
work();
printf("%d\n", ans);
return 0;
}

【BZOJ】2078: [POI2004]WYS的更多相关文章

  1. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  4. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  5. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  6. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  7. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  8. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  9. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

随机推荐

  1. IIS7 经典模式和集成模式的区别(转载)

    转载地址:http://www.poluoluo.com/server/201301/193110.html 升级过程中出现了比较多的问题,前面文章也提到过几个.这次就主要介绍下httpHandler ...

  2. Delphi面向对象---接口

    从Delphi3开始支持接口.接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两个方面的内容: 1)一方面是实现这个接口 2)另一方面是定义接口的客户 一个类能够实现多个接 ...

  3. Pyqt 中__init__(self,parent==None) parent理解

    参考: 在PyQt中,所有class都是从QObject派生而来,QWidget对象就可以有一个parent.这种parent-child关系主要用于两个方面: 没有parent的QWidget类被认 ...

  4. python中最简单的多进程程序

    学着.. #!/usr/bin/env python # -*- coding: utf-8 -*- # Spawn a Process: Chapter 3: Process Based Paral ...

  5. Web API 使用上安全吗?

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  6. hibernate查询语句实例代码

    一.聚集函数的使用: avg(...), sum(...), min(...), max(...) count(*) count(...), count(distinct ...), count(al ...

  7. JavaScript - BOM

    window 对象 window 对象是BOM的核心对象,也是ECMAScript规定的Global对象. 无法跨浏览精确获得窗口左边和上边的精确值,同样也无法确定浏览器窗口本身的大小,但是可以取得页 ...

  8. Windows下Apache服务器中自动配置二级子域名

    今天我们介绍的这个办法,只需要简单修改 httpd-vhosts.conf 文件,配合 .htaccess 文件即可实现自动配置二级域名. 我们这里以 wpchina.com 为例,以下代码中的 wp ...

  9. [Oracle] 生产上表的列类型更新

    由于粗心,数据库脚本生成的时候错将一个类型NUMBER(5)的字段类型改为 VARCHAR2(5) 直接进行表修改会报错,因为数据已经存在,不能进行更新: ); 大体思路如下:       将要更改类 ...

  10. 协处理器,王明学learn

    协处理器 协处理器用于执行特定的处理任务,如:数学协处理器可以控制数字处理,以减轻处理器的负担.ARM可支持多达16个协处理器,其中CP15是最重要的一个. CP15提供16组寄存器 通过提供的16组 ...