ACM-ICPC 2018 徐州赛区网络预赛 G. Trace-树状数组-区间修改,单点查询

赛后和队友讨论了一波,感谢无敌的队友给我细心的讲题

先埋坑

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxn = 1e5+7;
const int maxx = 1e7+5;
int treex[maxx];
int treey[maxx];
int n,maxxx = 0;
int lowbit(int x){
  return x&-x;
}
void add(int i,int x,int *tre){
  while(i<=maxxx){
    tre[i]+=x;
    i+=lowbit(i);
  }
}
int sum(int i,int *tre){
  int ans=0;
  while(i>0){
    ans+=tre[i];
    i-=lowbit(i);
  }
  return ans;
}
int main(){
  int x[maxn],y[maxn];
  while(~scanf("%d",&n)){
    for (int i=1;i<=n;i++){
        scanf("%d%d",&x[i],&y[i]);
        maxxx=max(maxxx,max(x[i],y[i]));
    }
    long long ans = 0;
    for(int i=n;i>=1;i--){
       int xx=x[i];
       int yy=y[i];
       int lenx=sum(yy,treex);
       int leny=sum(xx,treey);

       add(lenx+1,yy-leny,treey);
       add(leny+1,xx-lenx,treex);
       ans += xx - lenx;
       ans += yy - leny;
       add(xx+1,leny-yy,treey);
       add(yy+1,lenx-xx,treex);
    }
    cout<<ans<<endl;
  }
  return 0;
}

 

posted @ 2018-09-11 00:22  bluefly-hrbust  阅读(124)  评论(0编辑  收藏  举报