赛后和队友讨论了一波,感谢无敌的队友给我细心的讲题
先埋坑
#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; }