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"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
随机推荐
- java基础(二) -对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一 ...
- Selenium基础知识(二)鼠标操作
一.鼠标操作 这个需要使用webdriver下的ActionChains类,这个类是操作鼠标操作的: from selenium.webdriver import ActionChains 鼠标操作可 ...
- unity3d射线控制移动
看看效果图 代码: using UnityEngine; using System.Collections; public class T2 : MonoBehaviour { // Use this ...
- unity3d 第一人称脚本解释MouseLook
using UnityEngine; using System.Collections; /// MouseLook rotates the transform based on the mouse ...
- 在window下搭建Vue.Js开发环境
nodejs官网http://nodejs.cn/下载安装包,无特殊要求可本地傻瓜式安装,这里选择2017-5-2发布的 v6.10.3,也可选择阿里云镜像https://npm.taobao.org ...
- react native 中使用react-native-vector-icons
1.引入依赖 cnpm install react-native-vector-icons --save 2.LINK原生 react-native link react-native-vector- ...
- node.js初识08
1.模块的概念,在前端的世界里,jq和js的关系,在后台里就是express和原生node的关系, 2.每一个js里的函数都只在当前文件里起作用,如果你希望在其他js里调用这个函数,这么你需要在这个j ...
- ueditor上传图片配置成功,但是如何删除无用的图片
我使用ueditor作为富文本编辑器,配置已经好了,上传功能也好了.现在的问题是当使用ueditor上传图片的时候,选择了图片就立刻上传到指定的文件夹里,而后续即使没有保存该篇文章内容,即取消操作,图 ...
- html5-边框属性
width: 500px; height: 300px; background: rgb(122,30,60); border: 10px solid black; /*bor ...
- html5-增强的表单-表单的重写
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...