• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 101,  comments - 57,  trackbacks - 0
            線段樹經典解決問題poj1151,計算圖形覆蓋總面積。

            1.用了半小時寫了一個簡單算法,看了看測試數據沒過,原來理解題意錯誤。(如果提交就是WA)
            2.然后又用了樸素的枚舉,這次是TLE,看來是水平不行,要學習學習別人的思路了。
            3.看完別人代碼后,花了半天用自己的思路寫了一遍,RTE。
            4.原來是數組設小了,再次提交PE。
            4.最后居然是要輸出兩個換行,暈倒!AC

            線段樹的應用還有很多,就此題來說基本的思維是用線段樹的方法就每一塊面積單獨進行計算(按x軸分塊),然后累加。此題由于是浮點型,還用到了離散化的方法來幫助線段樹來進行轉化。

            最后show一下代碼
              1#include "stdio.h"
              2#include "stdlib.h"
              3
              4#define MAX 100
              5
              6struct node
              7{
              8    int left;
              9    int right;
             10    double h;
             11    double y2;
             12}
            xdtree[5 * MAX + 11];
             13
             14// xdtree_leaf_size = 2^(n - 1) = 200 < 256
             15//                n < 9
             16// xdtree_size = 2^n - 1 =  511;
             17struct axis
             18{
             19    double x1;
             20    double y1;
             21    double x2;
             22    double y2;
             23}
            area[MAX];
             24
             25double d[2 * MAX];
             26
             27void build_tree(int n, int l, int r)
             28{
             29    int m;
             30
             31    xdtree[n].left  = l;
             32    xdtree[n].right = r;
             33    xdtree[n].h     = 0;
             34    xdtree[n].y2    = 0;
             35    
             36    if (r - l == 1)
             37        return;
             38
             39    m = (r + l) >> 1;
             40
             41    build_tree(2 * n + 1, l, m);
             42    build_tree(2 * n + 2, m, r);
             43}

             44
             45void insert(int i, double x1, double y1, double x2, double y2)
             46{
             47    int m;
             48
             49    if (xdtree[i].y2 >= y2)
             50        return;
             51    
             52    if (xdtree[i].right - xdtree[i].left == 1)
             53    {    
             54        
             55        if (d[xdtree[i].left] == x1 && d[xdtree[i].right] == x2)
             56        {
             57            if (xdtree[i].y2 > y1)
             58            {
             59                xdtree[i].h += y2 - xdtree[i].y2;
             60            }

             61            else
             62            {
             63                xdtree[i].h += y2 - y1;
             64            }

             65            xdtree[i].y2 = y2;
             66        }

             67    }

             68    else
             69    {
             70        m = (xdtree[i].left + xdtree[i].right) >> 1;
             71        
             72        if (d[m] >= x2)
             73        {
             74            insert(2 * i + 1, x1, y1, x2, y2);
             75        }

             76        else if (d[m] <= x1)
             77        {
             78            insert(2 * i + 2, x1, y1, x2, y2);
             79        }

             80        else
             81        {
             82            insert(2 * i + 1, x1, y1, d[m], y2);
             83            insert(2 * i + 2, d[m], y1, x2, y2);
             84        }

             85    }

             86}

             87
             88double calc(int i)
             89{
             90    if (xdtree[i].right - xdtree[i].left == 1)
             91    {
             92        return xdtree[i].h * (d[xdtree[i].right] - d[xdtree[i].left]);
             93    }

             94    else
             95    {
             96        return calc(2 * i + 1+ calc(2 * i + 2);
             97    }

             98}

             99
            100
            101int cmp_d(const double *p1, const double *p2)
            102{
            103    if (*p1 > *p2)
            104        return 1;
            105    else if (*p1 == *p2)
            106        return 0;
            107    else
            108        return -1;
            109}

            110
            111int cmp_y1(const struct axis *p1, const struct axis *p2)
            112{
            113    return cmp_d(&p1->y1, &p2->y1);
            114}

            115
            116void main()
            117{
            118    int c, i, j, k, n;
            119    
            120    n = 0;
            121    
            122    while (scanf("%d"&c))
            123    {
            124        if (!c) break;
            125        
            126        for (i = 0, k = 0; i < c; ++i)
            127        {
            128            scanf("%lf %lf %lf %lf"&area[i].x1, &area[i].y1, &area[i].x2, &area[i].y2);
            129            d[k++= area[i].x1;
            130            d[k++= area[i].x2;
            131        }

            132
            133        qsort(d, k, sizeof(d[0]), cmp_d);
            134        
            135        for (i = 1, j = 0; i < k; ++i)
            136        {
            137            if (d[j] != d[i])
            138            {
            139                d[++j] = d[i];
            140            }

            141        }

            142
            143        build_tree(00, j);
            144
            145        qsort(area, c, sizeof(area[0]), cmp_y1);
            146
            147        for (i = 0; i < c; i++)
            148        {
            149            insert(0, area[i].x1, area[i].y1, area[i].x2, area[i].y2);
            150        }

            151        printf("Test case #%d\nTotal explored area: %0.2lf\n\n"++n, calc(0));
            152    }

            153}

            154
            posted on 2010-08-15 23:38 margin 閱讀(264) 評論(0)  編輯 收藏 引用
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            收藏夾

            常去的壇子

            • CVC電腦病毒論壇
            • 很多人說我是AV,我告訴他們:別瞧不起人,我們也能創造價值
            • 安全焦點
            • 黑客聚集的地方,一般是好酒最多的地方...
            • 看雪論壇
            • 國內最強的加密解密論壇,成醉其中經常夜不歸宿
            • 驅動開發論壇
            • 厭倦了啤的朋友們,來我們來整點白的...痛痛快快的BSOD也好過隔鞋瘙癢!

            我的朋友

            • Sen的blog
            • IDE方面資深的受害者...經常為一個變量的定義找不著北的痛苦程序員(深表同情)
            • 老羅的blog
            • 良師益友,千年水牛,引擎猛男,分析怪獸,墨鏡酷哥,臺球高手....

            搜索

            •  

            最新評論

            观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 欧美日韩久久中文字幕| 亚洲国产精品综合久久一线| 亚洲精品乱码久久久久久蜜桃图片 | 欧美国产成人久久精品| 一本色道久久综合亚洲精品| 久久噜噜电影你懂的| 无码人妻久久一区二区三区蜜桃 | 久久精品aⅴ无码中文字字幕不卡| 国产精品久久毛片完整版| 伊人热热久久原色播放www| 情人伊人久久综合亚洲| 久久精品人人槡人妻人人玩AV| 久久亚洲国产成人精品无码区| 久久夜色精品国产噜噜亚洲AV| 久久久久国产精品三级网 | 久久久无码精品亚洲日韩蜜臀浪潮 | 久久精品成人免费国产片小草| 亚洲中文字幕无码久久2020| 亚洲狠狠综合久久| 欧美精品一区二区精品久久| 精品久久久久久综合日本| 91久久香蕉国产熟女线看| 无码日韩人妻精品久久蜜桃 | 久久se精品一区二区影院| 久久久久女教师免费一区| 久久午夜福利电影| 久久综合噜噜激激的五月天| 91久久精品91久久性色| 精品久久国产一区二区三区香蕉| 88久久精品无码一区二区毛片| 欧美大战日韩91综合一区婷婷久久青草 | 久久国产成人| AV色综合久久天堂AV色综合在| 久久久久久久久久久免费精品| 久久综合九色综合网站| 国产免费久久精品99久久| 久久精品国产精品亚洲精品 | 99久久成人国产精品免费| 久久婷婷成人综合色综合| 国产成人精品综合久久久|