• <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>

            gzwzm06

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
              1#include <cstdio>
              2#include <algorithm>
              3using namespace std;
              4
              5const int SIZE = 100001;
              6
              7struct RANGE
              8{
              9    int m_S, m_E;
             10    int m_p;
             11
             12    //按區間右端從大到小排序,再按左端從小到大排
             13    //將左端依序插入線段樹,即將區間將大先放入,就能得出包含關系
             14    bool operator < (const RANGE& other)
             15    {
             16        if ( m_E != other.m_E )
             17            return (m_E > other.m_E);
             18        
             19        return (m_S < other.m_S);
             20    }

             21}
            cow[SIZE];
             22
             23//線段樹
             24struct STREE
             25{
             26    int m_leftPos, m_rightPos;
             27    int m_left, m_right;
             28    int m_ItNum;                //記錄區間的左端個數
             29}
            tree[SIZE * 2];
             30
             31int N, result[SIZE];
             32
             33void BuildSTree(int& index, const int& l, const int& r)
             34{
             35    int id = index;
             36    tree[id].m_left = l, tree[id].m_right = r;
             37    tree[id].m_ItNum = 0;
             38    if ( l == r )
             39    {
             40        tree[id].m_leftPos = tree[id].m_rightPos = -1;
             41        return ;
             42    }

             43
             44    int mid = (l + r) >> 1;
             45
             46    tree[id].m_leftPos = ++index;
             47    BuildSTree( index, l, mid );
             48    tree[id].m_rightPos = ++index;
             49    BuildSTree( index, mid + 1, r );
             50}

             51
             52int Insert(const int& id, const int& s)
             53{
             54    int num = 0;
             55    if ( tree[id].m_left == s && tree[id].m_right == s )
             56    {
             57        tree[id].m_ItNum++;
             58        return (tree[id].m_ItNum - 1);
             59    }

             60
             61    int mid = (tree[id].m_left + tree[id].m_right) >> 1;
             62
             63    if ( s <= mid ) {
             64        tree[id].m_ItNum++;
             65        num += Insert(tree[id].m_leftPos, s);
             66    }

             67    else {
             68        num = tree[id].m_ItNum;
             69        num += Insert(tree[id].m_rightPos, s);
             70    }

             71
             72    return num;
             73}

             74
             75int main()
             76{
             77    freopen("1.txt""r", stdin);
             78    int i, t, maxN;
             79
             80    while ( true )
             81    {
             82        scanf("%d"&N);
             83        if ( N == 0 )
             84            break;
             85        
             86        maxN = 0;
             87        for ( i = 0; i < N; ++i )
             88        {
             89            scanf("%d %d"&cow[i].m_S, &cow[i].m_E);
             90            cow[i].m_p = i;
             91            if ( cow[i].m_E > maxN )
             92                maxN = cow[i].m_E;
             93        }

             94        t = 0;
             95        BuildSTree(t, 0, maxN);
             96        sort(cow, cow + N);
             97
             98        result[cow[0].m_p] = Insert(0, cow[0].m_S);
             99        for ( i = 1; i < N; ++i )
            100        {
            101            result[cow[i].m_p] = Insert(0, cow[i].m_S);
            102            //處理區間相等的情況,插入操作還是照做,結果就為等價
            103            if ( cow[i].m_E == cow[i - 1].m_E && cow[i].m_S == cow[i - 1].m_S )
            104                result[cow[i].m_p] = result[cow[i - 1].m_p];
            105        }

            106
            107        for ( i = 0; i < N - 1++i )
            108        {
            109            printf("%d ", result[i]);
            110        }

            111        printf("%d\n", result[i]);
            112    }

            113    return 0;
            114}
            posted on 2009-04-11 16:15 閱讀(239) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構
            久久亚洲国产精品123区| 久久人人添人人爽添人人片牛牛| 无码专区久久综合久中文字幕| 伊人久久久AV老熟妇色| 亚洲午夜久久久影院伊人| 亚洲欧美日韩久久精品第一区| 精品久久一区二区三区| 2020久久精品亚洲热综合一本| 久久精品中文字幕久久| 狠狠色婷婷久久综合频道日韩 | 久久精品人人槡人妻人人玩AV| 久久亚洲国产午夜精品理论片| 日韩欧美亚洲综合久久| 91精品国产91久久久久久青草 | 怡红院日本一道日本久久| 亚洲午夜无码久久久久小说| 精品永久久福利一区二区| 久久国内免费视频| 久久中文精品无码中文字幕| 99国产欧美久久久精品蜜芽| 久久久久久久久久久精品尤物| 久久国产精品一区| 久久综合狠狠色综合伊人| 久久久久亚洲AV无码永不| 久久天天躁狠狠躁夜夜2020一| 久久婷婷五月综合色99啪ak| 久久精品一区二区| 久久99精品国产麻豆宅宅| 97精品国产91久久久久久| 久久久SS麻豆欧美国产日韩| 久久久久黑人强伦姧人妻| 精品久久久久久无码免费| www亚洲欲色成人久久精品| 久久精品aⅴ无码中文字字幕不卡| 久久天天躁狠狠躁夜夜不卡| 亚洲午夜久久久久久久久电影网| 国产精品久久久香蕉| 久久久久免费精品国产| 精品无码久久久久久午夜| 91视频国产91久久久| 精品国产婷婷久久久|