bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组
扫描线是显然的。
考虑一下横着的线段,取它两个端点,横坐标小的地方放一个+1,大的地方放一个-1事件。
然后扫描,扫到的横着的线段更新,竖着的线段用树状数组求答案。
然后考虑这一列上原来存在的黑点有没有被统计,如果没有就加上。
Code
/**
* bzoj
* Problem#1818
* Accepted
* Time: 1824ms
* Memory: 9776k
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
#define smax(a, b) (a = max(a, b))
#define smin(a, b) (a = min(a, b))
typedef bool boolean;
#define ll long long const int N = 1e5 + ; typedef class IndexedTree {
public:
int s;
int* ar; IndexedTree() { }
IndexedTree(int s):s(s) {
ar = new int[(s + )];
memset(ar, , sizeof(int) * (s + ));
} void add(int idx, int val) {
for ( ; idx <= s; idx += (idx & (-idx)))
ar[idx] += val;
} int query(int idx) {
int rt = ;
for ( ; idx; idx -= (idx & (-idx)))
rt += ar[idx];
return rt;
}
}IndexedTree; typedef class Event {
public:
int x, y, val; Event(int x = , int y = , int val = ):x(x), y(y), val(val) { } boolean operator < (Event b) const {
return x < b.x;
}
}Event; int n;
int xs[N], ys[N], bxs[N], bys[N];
int ls[N], rs[N], us[N], ds[N];
ll res = ;
int tp = ;
Event es[N << ];
vector<int> vs[N];
IndexedTree it; inline void init() {
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d%d", xs + i, ys + i);
} inline void descrete(int* ar, int* br, int n) {
memcpy(br, ar, sizeof(int) * (n + ));
sort(br + , br + n + );
for (int i = ; i <= n; i++)
ar[i] = lower_bound(br + , br + n + , ar[i]) - br;
} inline void solve() {
descrete(xs, bxs, n);
descrete(ys, bys, n); for (int i = ; i <= n; i++)
ls[i] = ds[i] = N;
for (int i = ; i <= n; i++)
us[i] = rs[i] = ; for (int i = ; i <= n; i++) {
smin(ls[ys[i]], xs[i]);
smax(rs[ys[i]], xs[i]);
smin(ds[xs[i]], ys[i]);
smax(us[xs[i]], ys[i]);
} for (int i = ; i <= n; i++)
vs[xs[i]].push_back(ys[i]); for (int i = ; i <= n; i++)
if (ls[i] < rs[i] - ) {
es[++tp] = Event(ls[i], i, );
es[++tp] = Event(rs[i], i, -);
}
sort(es + , es + tp + ); int pe = ;
it = IndexedTree(n);
bxs[] = -1e9 - ;
for (int i = ; i <= n; i++) {
if (bxs[i] == bxs[i - ]) continue;
while (pe <= tp && es[pe].x == i)
it.add(es[pe].y, es[pe].val), pe++;
if (ds[i] <= us[i])
res += it.query(us[i]) - it.query(ds[i] - );//, cerr << bxs[i] << endl;
for (int j = ; j < (signed) vs[i].size(); j++)
if (it.query(vs[i][j]) - it.query(vs[i][j] - ) == )
res++;
// cerr << bxs[i] << " " << res << endl;
}
printf(Auto"\n", res);
} int main() {
init();
solve();
return ;
}
bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组的更多相关文章
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- 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\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
- 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ...
- BZOJ 1818 内部白点(离散化+树状数组)
此题就是1227 的弱化版. 画个图或者稍微证明一下就能够知道,一定不会超过一次变换. 那么我们只需要统计有多少个白点会变黑,换句话说就是有多少个白点上下左右都有黑点. 离散化横坐标,因为没有黑点在的 ...
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...
- BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)
整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...
- FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
随机推荐
- 巧用CurrentThread.Name来统一标识日志记录(java-logback篇)
▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...
- MFC 运行报错:Debug Assertion Failed! dbgheap.c
对话框已调用DestroyWindow 时,在调用delete this导致
- CentOS中利用Docker安装Redis
CentOS中利用Docker安装Redis 1.拉取镜像 #docker pull redis:4.0.10 2.加载镜像 #docker run -p 6379:6379 --name test- ...
- C# Mongo Client 2.4.2创建索引
static async Task CreateIndex() { var client = new MongoClient(); var database = client.GetDatabase( ...
- CoreWebApi集成Exceptionless
参考博客 https://www.cnblogs.com/akaxb/p/7207827.html 一. Exceptionlessr的安装部署 依乐祝,<ASP.NET Core免费开源分布式 ...
- SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递
实现思路: 1:准备一个ThreadLocal变量,供线程之间共享. 2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中. 3:每 ...
- Linux 压缩解压缩命令详解
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- html5-hgroup和address元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 【Hadoop学习之九】MapReduce案例分析一-天气
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 找出每个月气温最高的2天 1949 ...
- HTTPS 之共享秘钥 公钥 及 私钥
HTTPS 之共享秘钥 公钥 及 私钥一 共享秘钥1.1 概念共享秘钥和我们生活中同一把锁的钥匙概念类似,对同一把锁来说,加锁时使用什么钥匙,解锁也必须使用同样的钥匙. 1.2 共享秘钥在HTTP传输 ...