• <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 閱讀(237) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構
            久久久精品人妻一区二区三区四| 精品无码久久久久久午夜| 久久精品免费观看| 国产91久久综合| 久久婷婷五月综合成人D啪 | 国内精品久久久久久99蜜桃| 午夜不卡久久精品无码免费| 97精品伊人久久大香线蕉app| 久久不射电影网| 久久久久精品国产亚洲AV无码| 欧美一区二区三区久久综合| 久久精品国产91久久麻豆自制| 色综合久久久久综合99| 久久久av波多野一区二区| 久久99精品久久久久久9蜜桃| 国产69精品久久久久9999APGF| 97精品国产97久久久久久免费| 久久天天躁狠狠躁夜夜2020老熟妇 | 精品久久人人爽天天玩人人妻| 亚洲午夜久久久影院| 99久久精品这里只有精品| 亚洲AV无码一区东京热久久| 丁香久久婷婷国产午夜视频| 久久精品a亚洲国产v高清不卡| 亚洲AV伊人久久青青草原| 99久久精品免费看国产| 久久久久女人精品毛片| 91麻豆国产精品91久久久| 久久精品无码一区二区日韩AV| 国产美女久久精品香蕉69| 久久久久久久人妻无码中文字幕爆| 午夜精品久久久久| 国内精品伊人久久久久妇| 人妻少妇精品久久| 欧美国产成人久久精品| 久久精品国产一区二区三区不卡| 久久久精品午夜免费不卡| 99精品久久精品一区二区| 免费观看成人久久网免费观看| 国产欧美久久一区二区| 99久久精品国产一区二区三区|