记录编号 371967 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2012]世博会 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 5.351 s
提交时间 2017-02-17 14:17:01 内存使用 77.83 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
double X[maxn],Y[maxn],stx[maxn],sty[maxn],sx[maxn],sy[maxn];
int n,Q,rx[maxn],ry[maxn],Nx,Ny;
struct Rabit_q{int cnt;double sum;};
struct Rabit_Trie{
    int RT,cnt,size[maxn*20],ch[maxn*20][2],N;double sum[maxn*20];
    Rabit_Trie(){rx[0]=ry[0]=RT=cnt=1,N=17;}
    inline int set(int r0,int key,double v){
        int x=++cnt,res=x;bool b;
        size[x]++,sum[x]+=v;
        for(int i=N;~i;i--){
            b=key>>i&1;
            ch[x][!b]=ch[r0][!b],ch[x][b]=++cnt;
            x=ch[x][b],r0=ch[r0][b],size[x]=size[r0]+1,sum[x]=sum[r0]+v;
        }
        return res;
    }
    inline Rabit_q Sum(int r0,int rt,int key){
        key++;Rabit_q res;res.cnt=0,res.sum=0;
        for(int i=N;~i;i--){
            if(key>>i&1)res.sum+=sum[ch[rt][0]]-sum[ch[r0][0]],
                res.cnt+=size[ch[rt][0]]-size[ch[r0][0]],
                rt=ch[rt][1],r0=ch[r0][1];
            else rt=ch[rt][0],r0=ch[r0][0];
        }
        return res;
    }
    inline int get(int r0,int rt,int th){
        int res=0,tmp;
        for(int i=N;~i;i--){
            tmp=size[ch[rt][0]]-size[ch[r0][0]];
            if(th>tmp)th-=tmp,rt=ch[rt][1],r0=ch[r0][1],res|=1<<i;
            else rt=ch[rt][0],r0=ch[r0][0];
        }
        return res;
    }
}Tx,Ty;
inline void Rabit_in(){
    scanf("%d%d",&n,&Q);int i,A,B;double tx,ty;
    for(i=1;i<=n;i++)scanf("%lf",&X[i]);
    for(i=1;i<=n;i++)scanf("%lf",&Y[i]);
    for(i=1;i<=n;i++)
        tx=X[i]+Y[i],ty=X[i]-Y[i],
        stx[i]=X[i]=tx*0.5,sty[i]=Y[i]=ty*0.5,
        sx[i]=X[i]+sx[i-1],sy[i]=Y[i]+sy[i-1];
    sort(stx+1,stx+n+1),sort(sty,sty+n+1);
    Nx=unique(stx+1,stx+n+1)-stx-1,Ny=unique(sty+1,sty+n+1)-sty-1;
    for(i=1;i<=n;i++)
        A=lower_bound(stx+1,stx+Nx+1,X[i])-stx,
        B=lower_bound(sty+1,sty+Ny+1,Y[i])-sty,
        rx[i]=Tx.set(rx[i-1],A,X[i]),ry[i]=Ty.set(ry[i-1],B,Y[i]);
}
inline void Rabit_ans(){
    int s,t,mid,x,y;Rabit_q tx,ty;
    while(Q--)
        scanf("%d%d",&s,&t),mid=(t-s+1+1)/2,//ceil
        x=Tx.get(rx[s-1],rx[t],mid),y=Ty.get(ry[s-1],ry[t],mid),
        tx=Tx.Sum(rx[s-1],rx[t],x),ty=Ty.Sum(ry[s-1],ry[t],y),
        printf("%.2f\n",
        (sx[t]-sx[s-1]-tx.sum)-stx[x]*(t-s+1-tx.cnt)+stx[x]*tx.cnt-tx.sum+
        (sy[t]-sy[s-1]-ty.sum)-sty[y]*(t-s+1-ty.cnt)+sty[y]*ty.cnt-ty.sum);
}
int main(){
    freopen("nt2012_lhx_dis.in","r",stdin);freopen("nt2012_lhx_dis.out","w",stdout);
    Rabit_in();Rabit_ans();
}