1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include <cstdlib> #include <iostream> #include <cstring> #include <algorithm> #define M 20001 #define N 5001 #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<n;i++) #define LL long long using namespace std; struct MP{ int x,t,d,tag; }D[N*2]; inline bool operator<(MP a,MP b){ if(a.x==b.x)return a.tag>b.tag; return a.x<b.x; } struct tp{ int x,tag,ln; bool l,r; }BST[4*M]; int get_ln(int id){ return BST[id].tag? 2:BST[id].ln; } int query(int l,int r,int a,int b,int id,int x){ if(l>b||r<a)return BST[id].tag? r-l+1:BST[id].x; if(l==r){ BST[id].tag+=x; BST[id].l=BST[id].r=BST[id].tag>0; BST[id].ln=BST[id].tag? 2:0; return BST[id].tag? 1:0; } if(a<=l&&r<=b){ BST[id].tag+=x; if(BST[id].tag>0){ BST[id].l=BST[id].r=true; return r-l+1; }else{ BST[id].l=BST[id*2].l; BST[id].r=BST[id*2+1].r; return BST[id].x; } } BST[id].x=query(l,(l+r)/2,a,b,id*2,x)+query((l+r)/2+1,r,a,b,id*2+1,x); BST[id].ln=get_ln(id*2)+get_ln(id*2+1)-2*(int)(BST[id*2].r&&BST[id*2+1].l); BST[id].l=BST[id].tag? true:BST[id*2].l; BST[id].r=BST[id].tag? true:BST[id*2+1].r; return BST[id].tag? r-l+1:BST[id].x; } int main(int argc,char *argv[]) { ios_base::sync_with_stdio(false); int n; cin>>n; F(n){ cin>>D[i*2].x>>D[i*2].t>>D[i*2+1].x>>D[i*2].d; D[i*2+1].t=D[i*2].t; D[i*2+1].d=D[i*2].d; D[i*2].tag=-(D[i*2+1].tag=-1); } sort(D,D+n*2); LL sum=0; int cu=0,ncu=0,now=-10000; F(n*2){ sum+=(LL)((D[i].x-now)*get_ln(1)); now=D[i].x; ncu=query(0,M-1,D[i].t+10000,D[i].d+9999,1,D[i].tag); sum+=(LL)((cu-ncu)>0? cu-ncu:ncu-cu); cu=ncu; } cout<<sum<<endl; return 0; }
|