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"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
随机推荐
- PyQT5速成教程-4 Qt Designer实战[上]
本文由 沈庆阳 所有,转载请与作者取得联系! 前言 在前面几节的学习中,我们对PyQt的基本使用.Qt Designer与Python编码的工作流程有了基本的学习.同时也掌握了Qt Designer中 ...
- 解决Nginx重启时提示nginx: [emerg] bind() to 0.0.0.0:80错误
Nginx是一款轻量级的Web服务器,特点是占有内存少,并发能力强,因而使用比较广泛,蜗牛今天在一个VPS上重启Nginx时提示“nginx: [emerg] bind() to 0.0.0.0:80 ...
- !! MACD战法总结
我现在只发技术,不预测大盘.其实说实话,大盘不用预测,只要按照guoweijohn战法,有买入信号就入,有卖出信号就出..你也会成为股神..不是吹牛,且听慢慢分解 股市有三种市场: 一.牛市 二.震荡 ...
- HTML布局规范
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- SVN—使用总结
SVN使用教程总结 为什么要使用SVN? 在程序的编写过程中,每个程序员都会负责开发一个或多个模块,且开发中会生成很多不同的版本, 这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版 ...
- C语言---变量与函数
一个C程序是由一个或多个程序模块组成的,每一个程序模块作为一个源程序文件,一个源程序文件是一个编译单元. 源程序文件分为库函数和用户自己定义的函数,以及有参函数.无参函数. 函数调用的过程: 1) 定 ...
- kali linux wifi破解(aircrack)
需要一个能监听的网卡 airmon-ng start wlan0(監聽網卡) airmon-ng check kill(清除其他有影响的環境) airodump-ng mon0 (掃描附近wifi) ...
- Rpgmakermv(30) GameQuest任务插件
插件简介: 很牛X的任务插件(个人目前用过中的) 插件用法说明 Report any bugs, editor or plugin related here: http://forums.rpgmak ...
- 31网络通信之Select模型
多路复用并发模型 -- select #include<sys/select.h> #include<sys/time.h> int select(int maxfd, f ...
- workerman程序调试
现象1 启动后报错类似如下: php start.php start PHP Warning: stream_socket_server(): unable to connect to tcp://x ...