[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 轻松地完成 ...
随机推荐
- 升级Ubuntu18.04后遇到的坑
升级过程: 直接do-release-update 就可以直接从16.04更新到18.04了. 中间会提升更新一些配置文件, 我大部分都选择了N. 然后就成功升级到18.04了, 显卡驱动什么的都 ...
- JavaScript中Array方法总览
title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...
- Sublime使用随记
1.安装 Package Control Ctrl+` 打开命令行,执行如下代码: 适用于 Sublime Text 3: import urllib.request,os;pf='Package C ...
- swift语言点评五-Function
一.函数类型 Every function in Swift has a type, consisting of the function’s parameter types and return t ...
- canvas图片滚动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- HDU-5693 D Game 动态规划 两次动规
题目链接:https://cn.vjudge.net/problem/HDU-5693 题意 中文题 这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行.游戏规则很简单 ...
- 【Paper Reading】Object Recognition from Scale-Invariant Features
Paper: Object Recognition from Scale-Invariant Features Sorce: http://www.cs.ubc.ca/~lowe/papers/icc ...
- axios简单封装
写在最前面 新手前端刚刚接触vue,感觉真的好用.项目中需要使用axios,然后学习了一下.借鉴网上一些大佬的经验,现在分享一下axios的简单封装,如果有什么错误的地方,请大家指出. axios安装 ...
- 【BZOJ 1177】 [Apio2009]Oil
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如上图. 显然如果三个正方形.只可能是上面的情况. 则可以处理一下左上角.右上角.左下角.右下角的前缀最大正方形(dp),以及以某一 ...
- Tarjan 割点割边【模板】
#include <algorithm> #include <cstring> #include <cstdio> using namespace std; +); ...