类似求面积并。。2Y。。
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 #define LL __int64 8 #define maxn 40100 9 #define lson l , m, rt<<1 10 #define rson m+1, r,rt<<1|1 11 int que[maxn*4]; 12 int sum[maxn*4]; 13 int cnt[maxn*4]; 14 struct node 15 { 16 int x,y,s; 17 node(){} 18 node(int a,int b,int c):x(a),y(b),s(c){} 19 bool operator < (const node &S)const 20 { 21 return x < S.x; 22 } 23 }mat[maxn*3]; 24 int bin(int x,int n) 25 { 26 int str,mid,end; 27 str = 0; 28 end = n; 29 while(str <= end) 30 { 31 mid = (str+end)/2; 32 if(que[mid] == x) 33 return mid; 34 else if(que[mid] > x) 35 end = mid - 1; 36 else 37 str = mid + 1; 38 } 39 return mid; 40 } 41 void pushup(int rt,int l,int r) 42 { 43 if(cnt[rt]) 44 { 45 sum[rt] = que[r+1] - que[l]; 46 } 47 else if(l == r) 48 sum[rt] = 0; 49 else 50 sum[rt] = sum[rt<<1] + sum[rt<<1|1]; 51 } 52 void update(int L,int R,int c,int l,int r,int rt) 53 { 54 int m; 55 if(l >= L&&r <= R) 56 { 57 cnt[rt] += c; 58 pushup(rt,l,r); 59 return ; 60 } 61 m = (l+r)>>1; 62 if(L <= m) update(L,R,c,lson); 63 if(R > m) update(L,R,c,rson); 64 pushup(rt,l,r); 65 } 66 int main() 67 { 68 int n,a,b,c,i,k,num,l,r; 69 while(scanf("%d",&n)!=EOF) 70 { 71 memset(cnt,0,sizeof(cnt)); 72 memset(sum,0,sizeof(sum)); 73 num = 0; 74 for(i = 0;i < n;i ++) 75 { 76 scanf("%d%d%d",&a,&b,&c); 77 que[num] = 0; 78 mat[num++] = node(a,c,1); 79 que[num] = c; 80 mat[num++] = node(b,c,-1); 81 } 82 sort(mat,mat+num); 83 sort(que,que+num); 84 k = 1; 85 for(i = 1;i < num;i ++) 86 { 87 if(que[k] != que[i]) 88 que[k++] = que[i]; 89 } 90 LL ans = 0; 91 for(i = 0;i < num-1;i ++) 92 { 93 l = 0; 94 r = bin(mat[i].y,k-1)-1; 95 if(l <= r) 96 update(l,r,mat[i].s,0,k-1,1); 97 ans = ans + (LL)sum[1]*(mat[i+1].x - mat[i].x); 98 } 99 printf("%I64d ",ans); 100 } 101 return 0; 102 }