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"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
随机推荐
- ida+gdb调试任意平台
原创链接:http://www.cnblogs.com/fply/p/8493504.html 仅做个记录,希望能帮到大家. ida+gda基本可以通杀所有平台,目前自己试了ios和ubuntu系统都 ...
- React对比Vue(一些小细节的差异)
@1===>发现一个神奇的地方在对数组进行增加删除的时候 react中一个输入框点击enter键,然后数组push,然后渲染 <input ref='valInput' onKeyUp={ ...
- Linux基础(三)Shell test 命令
Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt ...
- man查看帮助命令
man -h/-help 1.在man命令帮助信息的界面中,所包含的常用操作按键及其用途 按键 用处 空格键 向下翻一页 PaGe down 向下翻一页 PaGe up 向上翻一页 home 直接前往 ...
- Centos 6.5初始化配置
安装好centos 6.5 # -*- coding:utf-8 -*- import win32api import time import os from Tkinter import * are ...
- Python2.6 升级2.7
一. Centos6 默认为python2.6且不可卸载(因为Centos6深度依赖Python),要想升级为2.7 只能通过全新升级 操作如下: 1.下载 Python2.7 网址 https:// ...
- 准备mysql-connector-java
下载mysql-connector-java:https://mvnrepository.com/artifact/mysql/mysql-connector-java 导入mysql-connect ...
- JavaScript--详解typeof的用法
typeof定义 typeof是一元运算符,用来返回操作参数的类型(不是值) 检查一个变量是否存在,是否有值 typeof在两种情况下会返回"undefined&q ...
- Django admin模块无法调用css样式文件
在使用Django Admin开发时,发现admin模块css样式文件丢失,无法调用,使火狐浏览器提示: 此 URL 的资源不是文本: http://127.0.0.1:8000/statics/ad ...
- 【2017-2-20】C#运算符
运算符分类: 1.算术运算符 ⑴+ - * / %(取余,模) /3; Console.Write(d); Console.ReadLine(); 则输出结果为“3”,因为10和3都是int型,dec ...