POJ - 3109 Inner Vertices
不存在-1的情况,而且最多一轮就结束了。如果新增加的黑点v0会产生新的黑点v1,那么v0和v1肯定是在一条轴上的,而原来这条轴上已经有黑点了。
离散以后扫描线统计,往线段上插点,然后查询区间上点数。
不妨以x为主轴,用一条条平行于y轴的线去扫。
按照x为主y为副排序以后,记录下标,将下标按y为主排序,为的是把y相同的一系列点变成一个入点(d[id] = 1),一个出点(d[id] = -1),
可能某个相同y值的点只有一个,所以最后的出点 -= 1。
点可能有重复,判重的话就标记一下平行x轴的线。
/*********************************************************
* ------------------ *
* author AbyssalFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
using namespace std; const int maxn = 1e5; typedef long long ll;
typedef pair<int,int> Point;
#define xc first
#define yc second
Point p[maxn];
int ys[maxn], d[maxn]; //discrete y, scan line
int n;
int r[maxn]; bool cmp(int a,int b)
{
return p[a].yc < p[b].yc || (p[a].yc == p[b].yc && p[a].xc < p[b].xc);
} int C[maxn+], n0;
bool vis[maxn+]; int sum(int x)
{
int re = ;
while(x > ){
re += C[x]; x &= x-;
}
return re;
} void add(int x,int d)
{
while(x <= n0){
C[x] += d;
x += x&-x;
}
} void solve()
{
for(int i = ; i < n; i++){
scanf("%d%d",&p[i].xc,&p[i].yc);
r[i] = i;
}
//compress
sort(p,p+n);
sort(r,r+n,cmp);
ys[r[]] = ; d[r[]] = ;
for(int i = ; i < n; i++){
ys[r[i]] = ys[r[i-]];
if(p[r[i]].yc != p[r[i-]].yc) {
d[r[i-]] -= ;
ys[r[i]]++;
d[r[i]] = ;
}
}
n0 = ys[r[n-]];
d[r[n-]] -= ;
//memset(C+1,0,sizeof(int)*n0); ll ans = n;
for(int i = , j; i < n;){
j = i;
while(j < n && p[j].xc == p[i].xc) { //不包含端点
if(d[j] < ) {
vis[ys[j]] = false;
add(ys[j], -);
}
j++;
}
if(ys[i] < ys[j-]-) {
ans += sum(ys[j-]-) - sum(ys[i]);
for(int k = i+; k < j-; k++){ //去重
if(vis[ys[k]]) ans--;
}
}
while(i < j) {
if(d[i] > ) {
add(ys[i],);
vis[ys[i]] = true;
}
i++;
}
}
printf("%I64d\n", ans);
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
scanf("%d", &n);
solve();
return ;
}
POJ - 3109 Inner Vertices的更多相关文章
- POJ 2109 Inner Vertices(扫描线+树状数组)
[题目链接] http://poj.org/problem?id=3109 [题目大意] 在一个棋盘上放满白子,现在把一些白子变成黑子, 如果一个白子上下左右都有黑子,就会变成黑子,问最终黑子个数 [ ...
- poj 3109
...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
- POJ题目分类推荐 (很好很有层次感)
著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...
- 计算几何--求凸包模板--Graham算法--poj 1113
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28157 Accepted: 9401 Description ...
- poj 1113:Wall(计算几何,求凸包周长)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28462 Accepted: 9498 Description ...
- 【POJ】1113 Wall(凸包)
http://poj.org/problem?id=1113 答案是凸包周长+半径为l的圆的周长... 证明?这是个坑.. #include <cstdio> #include <c ...
- 【POJ】2954 Triangle(pick定理)
http://poj.org/problem?id=2954 表示我交了20+次... 为什么呢?因为多组数据我是这样判断的:da=sum{a[i].x+a[i].y},然后!da就表示没有数据了QA ...
- poj 1179 Polygon
http://poj.org/problem?id=1179 Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
随机推荐
- 基本数据类型 list and tuple 04
列表和元组 一,列表 1.列表 由[]括起来 可以存放各种数据类型: 存放量比较大 2.列表的索引和切片 列表也有索引 lst [i] i 即列表中各元素的位置 2.1列表的切片 lst[star ...
- 配置编译器(GCC和GFortran)
平台信息 Description: CentOS Linux release 7.6.1810 (Core) 检查环境 $ gfortran -v $ gcc -v 安装 GCC和Fortran 环境 ...
- Django 中orm的第一次举荐
Django ORM :对象--关系--映射 创建Django准备工作: 1.在数据库创建你需要的数据库 2.在项目models里创建模型(就是python写的类,也可以说是python写的数据库) ...
- 既然有了HBase,为什么还需要Kudu呢?
不多说,直接上干货! 那既然有了HBase,为什么还需要Kudu呢? 简单的说,就是嫌弃HBase在OLAP(联机分析处理)场合,SQL/MR类的批量检索场景中,性能不够好.通常这种海量数据OLAP场 ...
- 案例54-crm练习新增联系人
1 前台页面部分 1 linkman/add.jsp <%@ page language="java" contentType="text/html; charse ...
- php 关于时间的函数
//返回1970年1月1日零点以来的秒数. //定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. time(); ...
- php高级教程
PHP - 多维数组 多维数组指的是包含一个或多个数组的数组. 注释:数组的维度指示您需要选择元素的索引数. 对于二维数组,您需要两个索引来选取元素 对于三维数组,您需要三个索引来选取元素 PHP - ...
- Mac 安装GTK
Mac上配置GTK环境 安装command line工具, 如果安装了Xcode, 就直接跳过该步骤 安装Homebrew 使用brew install pkg-config 使用brew insta ...
- 乐蜂网SALES倒计时原码展示
这是一个基于jquey写的倒计时.当然代码有点小改动,只是改了一下展示效果. 在静态页添加显示倒计时的容器,并引用下面脚本,代入时间参数即可使用. timeoutDate——到期时间,时间格式为201 ...
- Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)
什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...