BZOJ 1818: [Cqoi2010]内部白点 (BIT + 扫描线)
就是求多条线段的交点数,直接BIT+扫描线就行了. 注意不要算重最初存在的点.
CODE
#include<bits/stdc++.h>
using namespace std;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
	char ch; int flg = 1; for(;!isdigit(ch=getc());)if(ch=='-')flg=-flg;
	for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0'); res*=flg;
}
const int MAXN = 100005;
struct node { int x, y; }a[MAXN];
struct Node { int x, y, v; inline bool operator <(const Node &o)const { return y < o.y; } }q[MAXN];
inline bool cmpx(const node &a, const node &b) { return a.x == b.x ? a.y < b.y : a.x < b.x; }
inline bool cmpy(const node &a, const node &b) { return a.y == b.y ? a.x < b.x : a.y < b.y; }
int n, T[MAXN], b[MAXN], tot, N;
inline void upd(int x, int val) { while(x <= N) T[x] += val, x += x&-x; }
inline int qsum(int x) { int re = 0; while(x) re += T[x], x -= x&-x; return re; }
int main() {
	read(n);
	for(int i = 1; i <= n; ++i)
		read(a[i].x), read(a[i].y), b[++N] = a[i].x;
	sort(b + 1, b + N + 1);
	N = unique(b + 1, b + N + 1) - b - 1;
	for(int i = 1; i <= n; ++i) //离散化x坐标
		a[i].x = lower_bound(b + 1, b + N + 1, a[i].x) - b;
	sort(a + 1, a + n + 1, cmpx);
	for(int i = 1, j; i <= n; i = j) {
		int L = a[i].y, R;
		for(j = i; j <= n && a[j].x == a[i].x; ++j)
			R = a[j].y;
		if(R-L > 1) { //差分
			++tot, q[tot].x = a[i].x, q[tot].y = L+1, q[tot].v = 1;
			++tot, q[tot].x = a[i].x, q[tot].y = R, q[tot].v = -1;
		}
	}
	sort(a + 1, a + n + 1, cmpy);
	sort(q + 1, q + tot + 1);
	int cur = 1, ans = n;
	for(int i = 1, j; i <= n; i = j) {
		while(cur <= tot && q[cur].y <= a[i].y)
			upd(q[cur].x, q[cur].v), ++cur;
			for(j = i+1; j <= n && a[j].y == a[i].y; ++j)
				if(a[j-1].x+1 <= a[j].x-1)
					ans += qsum(a[j].x-1) - qsum(a[j-1].x); //差分
				//注意这里不能只用最靠左和最靠右的点形成的线段在BIT里查找
				//因为这段里面可能有最初就存在的黑点
	}
	printf("%d\n", ans);
}
BZOJ 1818: [Cqoi2010]内部白点 (BIT + 扫描线)的更多相关文章
- bzoj 1818 Cqoi2010 内部白点 扫描线
		[Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 530[Submit][Status][Disc ... 
- BZOJ 1818: [Cqoi2010]内部白点  扫描线+树状数组
		问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ... 
- bzoj 1818: [Cqoi2010]内部白点
		#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ... 
- BZOJ 1818: [Cqoi2010]内部白点(树状数组)
		传送门 解题思路 首先一定不可能有\(-1\)的情况,因为新产生的黑点不会造成任何贡献,它的各个方面都是不优的.那么只需要统计一遍答案,首先要将横坐标相同的两个点看成一条竖线,纵坐标相同的点看成一条横 ... 
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
		BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ... 
- 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)
		http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ... 
- 1818: [Cqoi2010]内部白点
		Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1394 Solved: 625 [Submit][Status][Discuss] Descriptio ... 
- Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点       扫描线,树状数组,离散化
		1818: [Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 704 Solved: 344[Submit][Status] ... 
- 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
		[BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ... 
随机推荐
- SpringBoot整合持久层技术-创建项目
			新建项目 Pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ... 
- VMware Conveter Standalone agent 安装时出现Error 29190错误的解决办法
			官网上面找的: if it helps anyone else, i found a workaround for my particular issue. on the source machine ... 
- [转帖]云服务器使用CentOS、Debian、Ubuntu的哪个版本
			云服务器使用CentOS.Debian.Ubuntu的哪个版本 2018-09-09 12:32:45作者:ywnz稿源:云网牛站 https://ywnz.com/linuxyffq/2986.ht ... 
- *【Python】【demo实验27】【练习实例】【定义递归函数】
			原题: 原题解答: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出 ... 
- redis 慢查询、Pipeline
			1.慢查询 简介 慢查询顾名思义是将redis执行命令较慢的命令记录下来,redis处理慢查询时是将慢查询记录到慢查询队列中 慢查询配置 slowlog-max-len 慢查询队列长度(记录多少条慢查 ... 
- Ruby Rails学习中:注册表单,注册失败,注册成功
			接上篇 一. 注册表单 用户资料页面已经可以访问了, 但内容还不完整.下面我们要为网站创建一个注册表单. 1.使用 form_for 注册页面的核心是一个表单, 用于提交注册相关的信息(名字.电子邮件 ... 
- Python开发之IDE选择
			Python开发之IDE 一.为什么用IDE 到现在为止,谁还不是个写过代码的人啦,但你有没有发现,每次写代码要新建文件.写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻 ... 
- C#面向对象16 访问修饰符
			C# 访问修饰符 public:公开的公共的 private:私有的,只能在内部类中访问 protected:受保护的,子类可以访问和类的内部 internal:只能在当前项目/程序集中访问.在同一项 ... 
- SQL的GROUP BY  与  Order By
			1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ... 
- 09 Python之IO多路复用
			四种常见IO模型 阻塞IO(blocking IO).非阻塞IO(nonblocking IO).IO多路复用(IOmultiplexing).异步IO(asynchronous IO) IO发生时涉 ... 
