POJ 1177 Picture(求周长并)

题目链接

看的HH的题解。。周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段。

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <string>

  4 #include <cmath>

  5 #include <algorithm>

  6 using namespace std;

  7 #define maxn 10000

  8 #define lson l , m, rt<<1

  9 #define rson m+1, r,rt<<1|1

 10 int que[maxn*4];

 11 int sum[maxn*4];

 12 int cnt[maxn*4];

 13 bool lbd[maxn*4] , rbd[maxn*4];

 14 int numseg[maxn*4];

 15 struct node

 16 {

 17     int lx,rx,y;

 18     int s;

 19     node() {}

 20     node(int a,int b,int c,int d):lx(a),rx(b),y(c),s(d) {}

 21     bool operator < (const node &S) const

 22     {

 23         if(y == S.y) return s > S.s;

 24         return y < S.y;

 25     }

 26 } mat[maxn];

 27 int bin(int x,int n)

 28 {

 29     int str,end,mid;

 30     str = 0,end = n;

 31     while(str <= end)

 32     {

 33         mid = (str+end)/2;

 34         if(que[mid] == x)

 35             return mid;

 36         else if(que[mid] > x)

 37             end = mid - 1;

 38         else

 39             str = mid + 1;

 40     }

 41     return mid;

 42 }

 43 void pushup(int rt,int l,int r)

 44 {

 45     if(cnt[rt])

 46     {

 47         lbd[rt] = rbd[rt] = 1;

 48         sum[rt] = que[r+1] - que[l];

 49         numseg[rt] = 2;

 50     }

 51     else if (l == r)

 52     {

 53         sum[rt] = numseg[rt] = lbd[rt] = rbd[rt] = 0;

 54     }

 55     else

 56     {

 57         lbd[rt] = lbd[rt<<1];

 58         rbd[rt] = rbd[rt<<1|1];

 59         sum[rt] = sum[rt<<1] + sum[rt<<1|1];

 60         numseg[rt] = numseg[rt<<1] + numseg[rt<<1|1];

 61         if (lbd[rt<<1|1] && rbd[rt<<1]) numseg[rt] -= 2;

 62     }

 63 }

 64 void update(int L,int R,int c,int l,int r,int rt)

 65 {

 66     if(L <= l&&r <= R)

 67     {

 68         cnt[rt] += c;

 69         pushup(rt,l,r);

 70         return ;

 71     }

 72     int m = (l+r)>>1;

 73     if(L <= m)

 74         update(L,R,c,lson);

 75     if(R > m)

 76         update(L,R,c,rson);

 77     pushup(rt,l,r);

 78 }

 79 int main()

 80 {

 81     int n,num,i,l,r;

 82     int a,b,c,d;

 83     while(scanf("%d",&n)!=EOF)

 84     {

 85         if(!n) break;

 86         num = 0;

 87         for(i = 0; i < n; i ++)

 88         {

 89             scanf("%d%d%d%d",&a,&b,&c,&d);

 90             que[num] = a;

 91             mat[num ++] = node(a,c,b,1);

 92             que[num] = c;

 93             mat[num ++] = node(a,c,d,-1);

 94         }

 95         sort(que,que+num);

 96         sort(mat,mat+num);

 97         int k = 1;

 98         for(i = 1; i < num; i ++)

 99         {

100             if(que[i] != que[i-1])

101                 que[k++] = que[i];

102         }

103         int ans = 0,last = 0;

104         memset(cnt,0,sizeof(cnt));

105         memset(sum,0,sizeof(sum));

106         memset(lbd,0,sizeof(lbd));

107         memset(rbd,0,sizeof(rbd));

108         for(i = 0; i < num; i ++)

109         {

110             l = bin(mat[i].lx,k-1);

111             r = bin(mat[i].rx,k-1)-1;

112             if(l <= r)

113                 update(l,r,mat[i].s,0,k-1,1);

114             ans += numseg[1] * (mat[i+1].y - mat[i].y);

115             ans += abs(sum[1] - last);

116             last = sum[1];

117         }

118         printf("%d\n",ans);

119     }

120     return 0;

121 }

 

你可能感兴趣的:(poj)