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;
}

  

时间: 2024-11-06 17:18:59

BZOJ4255 : Keep Fit!的相关文章

Fat AP与Fit AP的主要特点和区别

Fat AP的主要特点: ·Fat AP是与Fit AP相对来讲的, Fat AP将WLAN的物理层.用户数据加密.用户认证.QoS.网络管理.漫游技术以及其他应用层的功能集于一身. ·Fat AP无线网络解决方案可由由Fat AP直接在有线网的基础上构成. ·Fat AP设备结构复杂,且难于集中管理. Fit AP的主要特点: ·Fit AP是相对Fat AP来讲的,它是一个只有加密.射频功能的AP,功能单一,不能独立工作. ·整个Fit AP无线网络解决方案由无线交换机和Fit AP在有线网

sklearn中各算法类的fit,fit_transform和transform函数

在使用PCA和NFC中有三个函数fit,fit_transform,transform区分不清各自的功能.通过测试,勉强了解各自的不同,在这里做一些笔记. 1.fit_transform是fit和transform的混合,相当于先调用fit再调用transform. 2.transform函数必须在fit函数之后调用否则会报错 3.fit_transform返回的是降维之后的结果,而且是对列压缩的 4.fit函数返回的是算法类,但是其成员变量components_是有数据的,而且似乎也是执行算法

Matlab中用fit做曲线拟合

1.确定要拟合的类型 一般情况下matlab会直接提供常用的类型,用fittype创建拟合模型.至于matlab具体提供了哪些模型,参见帮助"List of library models for curve and surface fitting" ft = fittype( 'gauss1' ); %高斯拟合 2.要拟合的数据格式 在最简单的情况下,即拟合两个向量X,Y,则其必须是列向量 3.拟合 使用fit进行拟合 fitresult= fit( xData, yData, ft,

u-boot FIT image介绍_转自“蜗窝科技”

转自:http://www.wowotech.net/u-boot/fit_image_overview.html 1. 前言 Linux kernel在ARM架构中引入device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想----同一个Image,可以支持多个不同的平台.随着新的ARM64架构将FDT列为必选项,并将和体系结构有关的代码剥离之后,这个梦想已经接近实现: 在编译linux kern

关于APKsmail中加入代码报错All register args must fit in 4 bits

最近在在smail文件中加入调用接口代码,大部分APK没什么问题回编打包的时候,偶尔碰到一个APK报错,All register args must fit in 4 bits 在在多次调试中发现寄存器数超过16了,不能直接使用p0.p1来作为invoke的参数,需要move一下 例如:开始的时候为invoke-static {p0}, Lneat/anad/iniat/Instancea;->instanceProjecta(Landroida/contenta/Contexta;)V 改过之

iOS开发 - 设立UIButton的Image为Aspect Fit

Button setImage设置的图片默认是会拉伸缩放的,如果我想要Aspect Fit的效果,要如何做呢?一开始我想到了用contentMode属性,很可惜不起作用.后来我发现button有一个imageView属性,设置它的contentMode就OK了.代码如下: UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.imageView.contentMode = UIViewContentMode

Fitnesse FIT的使用

FIT是fitnesse使用的默认的引擎(SLIM的使用在上一篇文章中说明),不需要特别声明即可使用执行表格测试,所有编写的fixture都需要继承Fit的Fitxture 编写测试用例前需要先声明class或者jar包所在的路径,才能找到所需要的fixture 使用关键字path 1. Column Fixture 这是使用最多的,每一行代表输入或者期望输出,添加?的代表调用的输出方法,如果期望值和实际输出值一致,则显示绿色,否则显示红色,并且显示实际输出值.如果添加的是()表示返回值,值的颜

fitnesse 中各类fit fixture的python实现

虽然网上都说slim效率很高,无奈找不到支持python的方法,继续用pyfit 1 Column Fixture 特点:行表格展现形式,一条测试用例对应一行数据 Wiki !define COMMAND_PATTERN {python "%m" %p} !define TEST_RUNNER {C:\Python27\PyFIT-0.8a2\fit\FitServer.py} !path E:\selfworkspaces\fitTest !|ColumnFixtureTest.Ad

Modified Least Square Method Fit Circle from Data

In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to fit circle, so i read some paper, and write a function to do it. template<typename _tp> struct Circle_ { _tp x; _tp y; _tp r; }; typedef Circle_<fl