BZOJ4255 : Keep Fit!
首先旋转坐标系,把每个点可以接收的范围转化成一个正方形。
然后建立k-d tree,并记录下每个点在k-d tree上的位置。
对询问使用莫队算法,修改$O(\log n)$,查询期望$O(\log n)$。
总复杂度$O(n\sqrt{n}\log n)$。
#include<cstdio>
#include<cmath>
#include<algorithm>
const int N=200010,M=10010;
int T,n,m,d,i,x,y,id[N],root,cmp_d,X1,X2,Y1,Y2,lim,l,r,k;
struct P{int x,y;}a[N];
struct Q{int l,r,id;}q[M];long long now,ans[M];
inline bool cmpq(const Q&a,const Q&b){return a.l/lim<b.l/lim||a.l/lim==b.l/lim&&a.r<b.r;}
struct node{int d[2],l,r,Max[2],Min[2],val,sum,f;}t[N];
inline bool cmp(const node&a,const node&b){return a.d[cmp_d]<b.d[cmp_d];}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void umin(int&a,int b){if(a>b)a=b;}
inline void up(int x){
if(t[x].l){
umax(t[x].Max[0],t[t[x].l].Max[0]);
umin(t[x].Min[0],t[t[x].l].Min[0]);
umax(t[x].Max[1],t[t[x].l].Max[1]);
umin(t[x].Min[1],t[t[x].l].Min[1]);
}
if(t[x].r){
umax(t[x].Max[0],t[t[x].r].Max[0]);
umin(t[x].Min[0],t[t[x].r].Min[0]);
umax(t[x].Max[1],t[t[x].r].Max[1]);
umin(t[x].Min[1],t[t[x].r].Min[1]);
}
}
int build(int l,int r,int D,int f){
int mid=(l+r)>>1;
cmp_d=D,std::nth_element(t+l+1,t+mid+1,t+r+1,cmp);
id[t[mid].f]=mid;
t[mid].f=f;
t[mid].Max[0]=t[mid].Min[0]=t[mid].d[0];
t[mid].Max[1]=t[mid].Min[1]=t[mid].d[1];
t[mid].val=t[mid].sum=0;
if(l!=mid)t[mid].l=build(l,mid-1,!D,mid);else t[mid].l=0;
if(r!=mid)t[mid].r=build(mid+1,r,!D,mid);else t[mid].r=0;
return up(mid),mid;
}
inline void change(int x,int p){for(t[x].val+=p;x;x=t[x].f)t[x].sum+=p;}
void ask(int x){
if(t[x].Min[0]>X2||t[x].Max[0]<X1||t[x].Min[1]>Y2||t[x].Max[1]<Y1||!t[x].sum)return;
if(t[x].Min[0]>=X1&&t[x].Max[0]<=X2&&t[x].Min[1]>=Y1&&t[x].Max[1]<=Y2){k+=t[x].sum;return;}
if(t[x].d[0]>=X1&&t[x].d[0]<=X2&&t[x].d[1]>=Y1&&t[x].d[1]<=Y2)k+=t[x].val;
if(t[x].l)ask(t[x].l);
if(t[x].r)ask(t[x].r);
}
inline void add(int x){
X1=a[x].x-d,X2=a[x].x+d,Y1=a[x].y-d,Y2=a[x].y+d;
k=0,ask(root),now+=k;
change(id[x],1);
}
inline void del(int x){
change(id[x],-1);
X1=a[x].x-d,X2=a[x].x+d,Y1=a[x].y-d,Y2=a[x].y+d;
k=0,ask(root),now-=k;
}
int main(){
while(~scanf("%d%d%d",&n,&d,&m)){
printf("Case %d:\n",++T);
lim=(int)std::sqrt(n+0.5);
for(i=1;i<=n;i++){
scanf("%d%d",&x,&y);
t[i].d[0]=a[i].x=x+y,t[i].d[1]=a[i].y=x-y,t[i].f=i;
}
root=build(1,n,0,0);
for(i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
std::sort(q+1,q+m+1,cmpq);
for(i=l=1,r=now=0;i<=m;i++){
int L=q[i].l,R=q[i].r;
if(r<R){for(r++;r<=R;r++)add(r);r--;}
if(r>R)for(;r>R;r--)del(r);
if(l<L)for(;l<L;l++)del(l);
else if(l>L){for(l--;l>=L;l--)add(l);l++;}
ans[q[i].id]=now;
}
for(i=1;i<=m;i++)printf("%lld\n",ans[i]);
}
return 0;
}
BZOJ4255 : Keep Fit!的更多相关文章
- BZOJ4255:Keep Fit!
浅谈\(K-D\) \(Tree\) 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4255 莫队加\(kd\) \(tree\),直接 ...
- u-boot FIT image介绍_转自“蜗窝科技”
转自:http://www.wowotech.net/u-boot/fit_image_overview.html 1. 前言 Linux kernel在ARM架构中引入设备树device tree( ...
- Modified Least Square Method and Ransan Method to Fit Circle from Data
In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to f ...
- iOS Aspect Fit,Aspect Fill,Scale To Fill
Scale:拉伸图片,图片变形. Aspect:图片长宽的保持比例,图片不变形. Aspect Fill(常用):图像充满容器.以长宽中小的参数为限制. Aspect Fit:图像在容器中完整显示.以 ...
- ExtJs布局之accordion,fit,auto
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- 利用AVL树实现搬箱问题的best fit策略
//my.h //定义两个数据类型,货物Goods,箱子Box #include <vector> #include <cstddef> #include <iostre ...
- jQueryEasyUI中DataGrid的height,width,fit,fitColumns属性
height: 600, //不指定则默认垂直包裹,指定了则固定 width:1200,//不指定则水平100%平铺,指定了则固定 fit:false,//true:高度填充父窗体,忽略height属 ...
- 60秒找到最对的size?为服饰电商提供尺寸匹配解决方案的True Fit获1500万美元融资 | 36氪
60秒找到最对的size?为服饰电商提供尺寸匹配解决方案的True Fit获1500万美元融资 | 36氪 60秒找到最对的size?为服饰电商提供尺寸匹配解决方案的True Fit获1500万美元融 ...
- fitnesse 中各类fit fixture的python实现
虽然网上都说slim效率很高,无奈找不到支持python的方法,继续用pyfit 1 Column Fixture 特点:行表格展现形式,一条测试用例对应一行数据 Wiki !define COMMA ...
随机推荐
- js基础回顾
值类型:值的拷贝. 引用类型:一般指对象,地址的指针引用 typeof有几种类型:6种 变量和布尔值之间的转换 js中内置的函数
- VMware ESXI6.0服务器安装
1.制作一个ESXI6.0的系统安装盘 2.服务器启动后加载VMware ESXi 6.0的ISO文件,开始安装. 3.ESXi引导装入程序,VMware ESXi引导过程,在屏幕上方显示的版本号.内 ...
- Linux通过ssh登录其他服务器,不用输入密码
有A(192.168.10.163)和B(192.168.10.164)两台服务器,为了使A服务器通过SSH连接B服务器时,免密登录,做以下操作. 1. 登录A(192.168.10.163)服务器( ...
- 阿里云Tengine和Openresty/1.11.2.3 数据对比
HLS播放延迟测试:阿里云48s ,openresy 31s Cache-Control: max-age=300 NGINX下配置CACHE-CONTROL Content-Length:637 ...
- 格式化 SQL 来提高效率
本文由 伯乐在线 - cucr 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:msiman.ga.欢迎加入翻译小组. 背景 已格式化的SQL并不比未格式化SQL运行地更快.数据库可能真的不太在意你 ...
- NIO学习(1)-入门学习
一.NIO概念 IO:标准IO,也既阻塞式IO NIO:非阻塞式IO 二.NIO与标准IO的IO工作方式 标准IO基于字节流和字符流进行操作 NIO是基于通道(Channel)和缓冲区(Buffer) ...
- 解决Winsock2.h和afxsock.h定义冲突的办法
如果我们在工程中使用了afxsock.h,但在其它的地方又加了些 使用winsock2.h,哈哈,VC会告诉你一大堆错误,大意就是有定义重复,该怎么解决? 由于MFC的SOCKET类使用的是Winso ...
- Tensorflow数据读取的方式
深度学习既然是基于数据的方法,先不管多抽象,那总归是有读取数据的方法的吧,这里的数据应该是一个统称,包含我们讲的数据集和变量tensor. tf读取数据一共有3种方法: 供给数据(Feeding): ...
- iOS动画1 — UIView动画
iOS动画基础是Core Animation核心动画.Core Animation是iOS平台上负责图形渲染与动画的基础设施.由于核心动画的实现比较复杂,苹果提供了实现简单动画的接口—UIView动画 ...
- GBDT理解
一.提升树 提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法.以决策树为基函数的提升方法称为提升树,boosting tree.对分类问题的决策树是二叉分类树,对回归问题的决策树是二叉回归 ...