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. Oracle 与Sql Server常用函数对比

    来自:http://topic.csdn.net/u/20080704/08/b2b8c42f-b0d6-4cda-98b1-6e4a279b4ff8.html 感谢楼主 函数 SQLServer和O ...

  2. 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展HMC ...

  3. spring事务管理及相关知识

    最近在项目中遇到了spring事务的注解及相关知识,突然间感觉自己对于这部分知识只停留在表面的理解层次上,于是乎花些时间上网搜索了一些文章,以及对于源码的解读,整理如下: 一.既然谈到事务,那就先搞清 ...

  4. PTA 大炮打蚊子   (15分)

    现在,我们用大炮来打蚊子:蚊子分布在一个M×NM\times NM×N格的二维平面上,每只蚊子占据一格.向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O ...

  5. sql,用 ISNULL(), NVL(), IFNULL() and COALESCE() 函数替换空值

    在数据库操作中,往往要对一些查询出来的空值进行替换,如函数SUM(),这个函数如果没有值会返回NULL,这是我们不希望看到的, 在MySQL中我们可以这样来写: ) ... 在SQLSERVER中我们 ...

  6. Linux shell —— 数组与关联数组

    使用 declare -A(declare 的用法请使用 help 进行查看,help declare) 进行声明关联数组变量: $ declare -A fruits_price $ fruits_ ...

  7. 学习magento要学哪些知识

    php框架水平,具体点的就是大名鼎鼎的ZF框架.别急,先还是熟悉下OSC吧,主要是热身下商城的那些业务流的知识,基本的数据流程.自己做模板的话CSS2.0水平还不能太低.JS框架JQ吧相对简单点.当然 ...

  8. WinRAR备份技巧 - imsoft.cnblogs

    RAR控制台日常备份策略 run.batrar a -ep1 -agYYYY{年}MM{月}DD{日} 备份 @list.txt-ep1是忽略原文件路径,rar包里是一堆文件,没有目录结构-ag附加命 ...

  9. 在 Ubuntu 18.0-10上安装 MySQL8

    直接使用apt install mysql-server安装,那么恭喜你踩坑. sudo apt install mysql-server默认会安装MySQL 5.7,将会出现一些莫名的问题,例如:安 ...

  10. dubbo监控工具

    现在企业使用dubbo技术太普遍,所以dubbo的监控工具也应运而生,而且还很稳定,他就是一个web项目, 部署起来非常简单,下载个项目war包(dubbo-admin-2.5.4-SNAPSHOT. ...