• 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
    ",ans);
    119     }
    120     return 0;
    121 }
  • 相关阅读:
    jquery,smarty,dedecms的插件思路------dede未实践
    从英语单词shell想到的
    php的特殊功能-----不是和其他语言比较
    php程序执行过程--非宏观和微观而是写的程序一行一行的路径----利用xdebug了解一段程序的执行过程----覆盖率
    系统找不到指定路径的可能原因,以及404
    dede内容页调用点击数
    firework压缩图片类似于GD库中压缩图片的思路
    dede二级导航与二级栏目 ----内容介绍二级导航
    翻转二进制码
    翻转数组
  • 原文地址:https://www.cnblogs.com/naix-x/p/3250499.html
Copyright © 2020-2023  润新知