Description

很久以前, 有一个小小的国度, 为了方便, 我们可以把它想象为一个大大的矩形, 矩形的左下角为(0, 0), 右上角为(w, h), 共有(w + 1) * (h + 1)个整点, 在本题中我们只考虑所有的整点.在这个国度里, 有n座山峰, 第i座位于整点(xi, yi)上, 现在我们需要选择一些整点来修建房子, 除了n座山峰以外还有(w + 1) * (h + 1) – n个可以修建房子的地方. 有些点修建房子风景会更加优美, 比如从这个点往北眺望可以看到一座山峰即你位于(x, y), 而存在一座位于(x, y + d)的山峰, 这样你就可以欣赏到山峰的美景, 东, 西, 南三个方向也同样如此.如果某个点上某个方向可以眺望到某座山峰, 那么我们称这座山峰为这个点的一个neighbour, 当然neighbour越多, 这个点修建房子风景会越优美.作为房地产开发公司的技术人员, 你的任务很简单, 统计在(w + 1) * (h + 1) – n 个点中neighbours总数为0, 1, 2, 3, 4的点的总数分别为多少

Input

输入文件第一行为3个正整数, w, h, n. 以下n行,每行有两个整数(xi, yi), 表示第i个山峰的位置(0 <= xi <= w, 0 <= yi <= h).

Output

输出文件有5个数, 分别为neighbours总数为0, 1, 2, 3, 4的点的个数.

离散化后用排序+树状数组统计一下

#include<bits/stdc++.h>
typedef long long i64;
const int N=5e5+;
char buf[],*ptr=buf+;
int G(){
if(ptr-buf==)fread(ptr=buf,,,stdin);
return *ptr++;
}
int _(){
int x=;
if(ptr-buf<){
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
}else{
int c=G();
while(c<)c=G();
while(c>)x=x*+c-,c=G();
}
return x;
}
i64 a0,a1,a2,a3,a4;
int xm,ym,n;
int xs[N],ys[N],xp,yp;
int xw[N][],yw[N][],f[N],g[N];
struct pos{
int x,y;
}ps[N],ps2[N],qs[N],qs2[N];
bool cmpx(pos a,pos b){
return a.x<b.x||a.x==b.x&&a.y<b.y;
}
bool cmpy(pos a,pos b){
return a.y<b.y||a.y==b.y&&a.x<b.x;
}
void inc(int*f,int w){
for(++w;w<=n;w+=w&-w)++f[w];
}
int sum(int*f,int w){
int s=;
for(++w;w;w-=w&-w)s+=f[w];
return s;
}
int main(){
xm=_()+,ym=_()+,n=_();
for(int i=;i<n;++i){
ps[i].x=xs[i]=_();
ps[i].y=ys[i]=_();
}
std::sort(xs,xs+n);
xp=std::unique(xs,xs+n)-xs;
std::sort(ys,ys+n);
yp=std::unique(ys,ys+n)-ys;
a0=i64(xm-xp)*(ym-yp);
for(int i=;i<n;++i){
ps[i].x=std::lower_bound(xs,xs+xp,ps[i].x)-xs;
ps[i].y=std::lower_bound(ys,ys+yp,ps[i].y)-ys;
}
memcpy(ps2,ps,n*sizeof(pos));
std::sort(ps,ps+n,cmpx);
for(int i=,j=,p1,p2;i<n;i=j){
int x=ps[i].x;
for(++j;j<n&&ps[j].x==x;++j){
p1=ps[j-].y,p2=ps[j].y;
a2+=ys[p2]-ys[p1]-(p2-p1);
}
p1=yw[x][]=ps[i].y;
p2=yw[x][]=ps[j-].y;
a1+=ys[p1]+ym-ys[p2]-(p1+yp-p2);
}
std::sort(ps2,ps2+n,cmpy);
for(int i=,j=,p1,p2;i<n;i=j){
int y=ps2[i].y;
for(++j;j<n&&ps2[j].y==y;++j){
p1=ps2[j-].x,p2=ps2[j].x;
a2+=xs[p2]-xs[p1]-(p2-p1);
}
p1=ps2[i].x;
p2=ps2[j-].x;
a1+=xs[p1]+xm-xs[p2]-(p1+xp-p2);
qs[y]=(pos){p1,y};
qs2[y]=(pos){p2,y};
}
std::sort(qs,qs+yp,cmpx);
std::sort(qs2,qs2+yp,cmpx);
for(int x=,p=,pp=,i=;x<xp;++x){
for(;p<yp&&qs2[p].x<x;++p)inc(f,qs2[p].y);
for(;pp<yp&&qs[pp].x<x;++pp)inc(g,qs[pp].y);
for(++i;i<n&&ps[i].x==x;++i){
int p1=ps[i-].y,p2=ps[i].y;
a4+=sum(g,p2-)-sum(f,p2-)-(sum(g,p1)-sum(f,p1));
}
a2+=sum(f,yw[x][]-)+p-sum(f,yw[x][]);
}
memset(f,,sizeof(int)*(n+));
for(int x=xp-,p=yp-,t=;x>=;--x){
for(;p>=&&qs[p].x>x;--p)inc(f,qs[p].y),++t;
int s0,s1;
a2+=(s0=sum(f,yw[x][]-))+t-(s1=sum(f,yw[x][]));
}
a3=i64(xm)*ym-n-a0-a1-a2-a4;
printf("%lld %lld %lld %lld %lld\n",a0,a1,a2,a3,a4);
return ;
}

bzoj 1288: Neighbours的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 【BZOJ】【1211】【HNOI2004】树的计数

    Prufer序列+组合数学 嗯哼~给定每个点的度数!求树的种数!那么很自然的就想到是用prufer序列啦~(不知道prufer序列的……自己再找找资料吧,这里就不放了,可以去做一下BZOJ1005明明 ...

  3. 【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

    BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Le ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. 【CodeVS 1288】埃及分数

    http://codevs.cn/problem/1288/ loli秘制面向高一的搜索,好难啊QAQ 我本来想按照分母从大到小搜,因为这样分母从小到大枚举到的第一个可行方案就是最优方案. 但貌似会T ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. python 复制/移动文件

    用python实现将某代码文件复制/移动到指定路径下. 场景例如:mv ./xxx/git/project1/test.sh ./xxx/tmp/tmp/1/test.sh (相对路径./xxx/tm ...

  2. anu - children

    import { _flattenChildren } from "./createElement"; export const Children = { only(childre ...

  3. Android输入法框架系统(下)

    程序焦点获取事件导致输入法显示 从上面可以知道程序获得焦点时,程序端会先间接的调用IMMS的startInput将焦点View绑定到输入法,然后会调用IMMS的windowGainFocus函数,这个 ...

  4. nw 注册快捷键

    var option = { key : "Escape", }; var shortcut = new gui.Shortcut(option); gui.App.registe ...

  5. SWIFT中数字格式

    SWIFT中格式化数字比较常用的应该就是以下几种格式了. var formatter = NSNumberFormatter() //formatter.numberStyle = NSNumberF ...

  6. 《利用Python进行数据分析》笔记---第5章pandas入门

    写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...

  7. NBUT 1218 You are my brother 2010辽宁省赛

    Time limit 1000 ms Memory limit 131072 kB Little A gets to know a new friend, Little B, recently. On ...

  8. WEB接口测试之Jmeter接口测试自动化 (三)

    接口测试与数据驱动 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程. 2 数据驱动与jmeter接口测试 我们已经简单介绍了 ...

  9. Plotly绘图工具(多用于统计)

    作者:桂. 时间:2017-04-23  23:52:14 链接:http://www.cnblogs.com/xingshansi/p/6754769.html 前言 无意中考到一个小工具,网址为: ...

  10. Spring整合struts的配置文件存放问题

    只使用Spring的时候,我把applicationContext.xml是放在项目的src路径下的,这样使用ClassPathXmlApplicationContext很方便嘛 整合了struts之 ...