[BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+树状数组)
题意
给出第一象限的n个点,有m次询问,每次询问一个矩形中的点的个数.(0<=n,m<=500000,0<=xi,yi<=10000000)
题解
一眼望去不可做。
用二位前缀和的思想,一个矩形可以用以坐标轴为一对临边的四个矩形加减得到。
考虑离线,离散化。所以我们要求的只是若干个以坐标轴为一对临边的矩形的权值。
但还是不可做。
转化为序列问题,我们要求的矩形面积,其实就是每行前缀和的一段连续地和。
具体一些,就是,算出每一行的前缀和,对于横坐标相等的前缀和,我们维护他们,矩形的面积,就是这些前缀和的前面一段。同时维护一个横坐标指针x,在x右移时前缀和加上横坐标为x的点。我们发现这些操作可以用树状数组维护。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int const N=;
int head[N],hed[N],c[N],n,m;
int cnt,cntx,cnty,totx,toty,ans[N],tot,x[N],y[N];
struct zb{
int x,y;
}zb[N];
struct ask{
int x,xx,y,yy;
}q[N];
struct edge{
int to,nxt;
}e[N];
struct hhh{
int to,nxt,w,id;
}f[N];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void ad(int u,int v,int c,int x){
tot++;
f[tot].nxt=hed[u];
f[tot].w=c;
f[tot].to=v;
f[tot].id=x;
hed[u]=tot;
}
int lowbit(int x){
return x&-x;
}
void update(int x,int w){
for(int i=x;i<=cnty;i+=lowbit(i)){
c[i]+=;
}
}
int check(int x,int w){
if(x==)return ;
int ans=;
for(int i=x;i>=;i-=lowbit(i)){
ans+=c[i];
}
return ans*w;
}
void work(){
for(int i=;i<=cntx;i++){
for(int j=head[i];j;j=e[j].nxt){
int v=e[j].to;
update(v,);
}
for(int j=hed[i];j;j=f[j].nxt){
int v=f[j].to;
ans[f[j].id]+=check(v,f[j].w);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d%d",&zb[i].x,&zb[i].y);
x[++totx]=zb[i].x;
y[++toty]=zb[i].y;
}
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&q[i].x,&q[i].y,&q[i].xx,&q[i].yy);
x[++totx]=q[i].x;
y[++toty]=q[i].y;
x[++totx]=q[i].xx;
y[++toty]=q[i].yy;
}
sort(x+,x++totx);
sort(y+,y++toty);
cntx=unique(x+,x++totx)-(x+);
cnty=unique(y+,y++toty)-(y+);
for(int i=;i<=n;i++){
zb[i].x=lower_bound(x+,x++cntx,zb[i].x)-x;
zb[i].y=lower_bound(y+,y++cnty,zb[i].y)-y;
add(zb[i].x,zb[i].y);
}
for(int i=;i<=m;i++){
q[i].x=lower_bound(x+,x++cntx,q[i].x)-x;
q[i].y=lower_bound(y+,y++cnty,q[i].y)-y;
q[i].xx=lower_bound(x+,x++cntx,q[i].xx)-x;
q[i].yy=lower_bound(y+,y++cnty,q[i].yy)-y;
ad(q[i].x-,q[i].y-,,i);
ad(q[i].xx,q[i].yy,,i);
ad(q[i].x-,q[i].yy,-,i);
ad(q[i].xx,q[i].y-,-,i);
}
work();
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
return ;
}
[BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+树状数组)的更多相关文章
- [bzoj1935][Shoi2007]Tree 园丁的烦恼 _树状数组
Tree 园丁的烦恼 bzoj-1935 Shoi-2007 题目大意:给定平面上的$n$个点,$m$次查询矩形点个数. 注释:$1\le n,m\le 5\cdot 10^5$. 想法:静态二维数点 ...
- [BZOJ1935][SHOI2007]Tree 园丁的烦恼(树状数组)
题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思 ...
- [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 552 Solved: 220[Submit][ ...
- bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼(树状数组 二维数点)
题意 题目链接 Sol 二维数点板子题 首先把询问拆成四个矩形 然后离散化+树状数组统计就可以了 // luogu-judger-enable-o2 #include<bits/stdc++.h ...
- 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...
- 【树状数组】bzoj1935 [Shoi2007]Tree 园丁的烦恼
把y坐标离散化后,按x坐标排序,把询问拆成四个点,每次询问某个点左下角的点的个数,注意处理边界和重叠的情况. #include<cstdio> #include<algorithm& ...
- [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松地完成 ...
随机推荐
- MetaSploit攻击实例讲解------社会工程学set攻击(kali linux 2016.2(rolling))(详细)
不多说,直接上干货! 首先,如果你是用的BT5,则set的配置文件是在 /pentest/exploits/set/set_config下. APACHE_SERVER=ONSELF_SIGNED_A ...
- Windows常见软件故障及解决方案
HM NIS Edit: HM NIS Edit 新建程序向导无效,提示“Please specify the setup lang” 说明 NSIS 安装不对.解决方案有二种: 1. 重装 NSIS ...
- iF.svnadmin 安装遇到的坑
iF.svnadmin 官网:http://svnadmin.insanefactory.com/ 安装配置iF.svnadmin : http://blog.linhere.com/archives ...
- CF17E Palisection(manacher)
题意 给出一个长度为N的字符串S,问S中有多少个回文子串对(i,j)使得i,j在S中的位置相交?(N<=2*106) 题解 #include<iostream> #include&l ...
- nginx开启gzip压缩后导致apk包下载不能正常安装
最后更新时间:2019/4/27 nginx一般都会开启gzip压缩,以提升传输性能. 配置如下: gzip on; gzip_comp_level 2; gzip_min_length 1k; gz ...
- mysql忘记密码怎么处理
1修改/etc/my.cnf文件 在[mysqld]下加一行skip-grant-tables 2.重启mysql使配置生效 3.免密码登录mysql并设置新密码 设置新的root密码,并刷新权限 4 ...
- Pimple相关的源码
已经有了非常好的Pimple的相关解析,建议先看下:Pimple - 一个简单的 PHP 依赖注入容器读 PHP - Pimple 源码笔记(上)读 PHP - Pimple 源码笔记(下) 这里通过 ...
- List Slider
http://www.jssor.com/download-jssor-slider-development-kit.html
- POJ——T 3041 Asteroids
http://poj.org/problem?id=3041 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23565 ...
- 怎样在windows7上使用snmp命令
原文地址:http://wenboxz.com/archives/window7-use-snmp-command.html/