青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2010 ICPC天津賽區(qū) J hdu 3727 劃分樹的理解

很久不寫劃分樹了,果然各種NC錯誤
按照我的理解,劃分樹即一個線段樹(用來確定數(shù)組下標(biāo)和層次)以及一個log2(n)*n的數(shù)組,來記錄劃分信息
這題實現(xiàn)4個操作:
1、插入
按照劃分樹的定義,如果小于有序表中中間節(jié)點的值,就遞歸插入左子樹,否則遞歸插入右子樹。更新當(dāng)前區(qū)間段的劃分信息(無非就是往后計算一個)
2、詢問s,e區(qū)間第k小數(shù)
查詢s,e區(qū)間里面劃分到左子樹的個數(shù)i,如果i>=k,那么顯然遞歸到左子樹查詢,否則就是遞歸到右子樹查詢k-i小的數(shù)。注意!這里要重新定位左子樹和右子樹中的區(qū)間,由于是閉區(qū)間,那么做端點為s+sum(s-1),右端點為s+sum(e)-1,這個減一丟了。。調(diào)了我半天。。哎。。以前寫都是左閉右開區(qū)間的,結(jié)果習(xí)慣了。。
3、查詢值為k的數(shù)的位次
這個需要一個輔助數(shù)組,記錄值為k的數(shù)插在最頂層區(qū)間的哪個位置了。這個辦好后,就容易了,如果數(shù)被劃分到了左子樹,那么遞歸查詢左子樹,否則返回遞歸查詢右子樹的值加上當(dāng)前區(qū)間被劃分到左子樹的個數(shù)
4、查詢rank k的數(shù)
同樣是這樣,如果當(dāng)前區(qū)間被劃分到左子樹的個數(shù)小于等于k,那么遞歸查詢左子樹,否則遞歸查詢右子樹中rank為k-左子樹的size。
大概思想就是這樣了,實現(xiàn)有很多細節(jié),比如說假設(shè)p==區(qū)間左端點(左區(qū)間木有數(shù)),那么算sum(p-1)的時候就要特判下了。我喜歡用三元式,很方便。

代碼
# include <cstdio>
# include <cstring>
# include <map>
using namespace
std;
# define N 100005
int arr[20][N];
struct
node
{

   int
s,e,layer;
   int
c;
}
st[4*N];
int
q[500000][4],c;
int
remap[N],position[N];
map<int,int> refer;
void
init(int s,int e,int layer,int pos=1)
{

    st[pos].s=s;st[pos].e=e;
    st[pos].layer=layer;
    st[pos].c=st[pos].s;
    if
(s!=e) init(s,(s+e)/2,layer+1,pos<<1),init((s+e)/2+1,e,layer+1,(pos<<1)+1);
}

void
insert(int value,int pos=1)
{

     if
(st[pos].s==st[pos].e)
        arr[st[pos].layer][st[pos].c++]=value;
     else

     {

         if
(value<=(st[pos].s+st[pos].e)/2)
         {

             arr[st[pos].layer][st[pos].c]=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])+1;
             st[pos].c++;
             insert(value,pos<<1);
         }

         else

         {

             arr[st[pos].layer][st[pos].c]=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1]);
             st[pos].c++;
             insert(value,(pos<<1)+1);
         }
     }
}

int
q1(int s,int t,int k,int pos=1)
{

    if
(st[pos].s==st[pos].e)
        return
  remap[arr[st[pos].layer][st[pos].s]];
    else

    {

        if
(arr[st[pos].layer][t]-(s==st[pos].s?0:arr[st[pos].layer][s-1])>=k)//left
            return q1(st[pos].s+(s==st[pos].s?0:arr[st[pos].layer][s-1]),st[pos].s+arr[st[pos].layer][t]-1,k,pos<<1);
        else
//right
        {
            k-=arr[st[pos].layer][t]-(s==st[pos].s?0:arr[st[pos].layer][s-1]);
            return
q1((st[pos].s+st[pos].e)/2+1+s-1-st[pos].s+1-(s==st[pos].s?0:arr[st[pos].layer][s-1]),(st[pos].s+st[pos].e)/2+1+t-st[pos].s+1-arr[st[pos].layer][t]-1,k,(pos<<1)+1);
        }
    }
}

int
q2(int s,int pos=1)
{

    if
(st[pos].s==st[pos].e) return 1;
    else if
(arr[st[pos].layer][s]-(s==st[pos].s?0:arr[st[pos].layer][s-1]))
      return
q2(st[pos].s+arr[st[pos].layer][s]-1,pos<<1);
    else
      return
(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])+q2((st[pos].s+st[pos].e)/2+1+s-st[pos].s+1-arr[st[pos].layer][s]-1,(pos<<1)+1);
}

int
q3(int k,int pos=1)
{

    if
(st[pos].s==st[pos].e) return remap[arr[st[pos].layer][st[pos].s]];
    else if
(k<=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])) return q3(k,pos<<1);
    else return
q3(k-(st[pos].s==st[pos].c?0:arr[st[pos].layer][st[pos].c-1]),(pos<<1)+1);
}

int
main()
{

    int
n,test=1;
    while
(scanf("%d",&n)!=EOF)
    {

       refer.clear();c=1;
       memset(arr,0,sizeof(arr));
       for
(int i=0;i<n;i++)
       {

           char
tmp[12];
           scanf("%s",tmp);
           if
(*tmp=='I')
             q[i][0]=0;
           else
q[i][0]=tmp[6]-48;
           switch
(q[i][0])
           {

           case
0:
                scanf("%d",&q[i][1]);
                refer[q[i][1]]=0;
                break
;
           case
1:
                scanf("%d%d%d",&q[i][1],&q[i][2],&q[i][3]);
                break
;
           default
:
                scanf("%d",&q[i][1]);
                break
;
           };
       }

       for
(map<int,int>::iterator i=refer.begin();i!=refer.end();i++)
         remap[c]=i->first,i->second=c++;
       init(1,c-1,0);
       long long
t[4]={0,0,0,0};
       int
now=1;
       for
(int i=0;i<n;i++)
         switch
(q[i][0])
         {

           case
0:
                insert(refer[q[i][1]]);
                position[refer[q[i][1]]]=now++;
                break
;
           case
1:
                t[1]+=q1(q[i][1],q[i][2],q[i][3]);
                break
;
           case
2:
                t[2]+=q2(position[refer[q[i][1]]]);
                break
;
           case
3:
                t[3]+=q3(q[i][1]);
                break
;
         };

       printf("Case %d:\n%I64d\n%I64d\n%I64d\n",test++,t[1],t[2],t[3]);
    }

    return
0;
}

posted on 2011-09-30 08:44 yzhw 閱讀(483) 評論(0)  編輯 收藏 引用 所屬分類: data struct

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導(dǎo)航

統(tǒng)計

公告

統(tǒng)計系統(tǒng)

留言簿(1)

隨筆分類(227)

文章分類(2)

OJ

最新隨筆

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲毛片一区| 欧美激情第三页| 亚洲成人在线观看视频| 国产亚洲精品久| 国产欧美综合一区二区三区| 国产精品国产三级国产普通话99| 欧美三级视频| 国产精品一卡二| 国内一区二区在线视频观看| 怡红院精品视频在线观看极品| 在线播放豆国产99亚洲| 亚洲免费电影在线| 欧美亚洲网站| 亚洲免费视频网站| 亚洲一区二区精品在线观看| 亚洲国产精品综合| 一卡二卡3卡四卡高清精品视频 | 香蕉亚洲视频| 久久久亚洲精品一区二区三区 | 久热re这里精品视频在线6| 模特精品裸拍一区| 一本久道久久综合中文字幕| 欧美在线综合| 欧美理论大片| 国产一区二区三区av电影| 亚洲电影网站| 亚洲综合日韩中文字幕v在线| 另类图片综合电影| av成人毛片| 久久色在线播放| 国产精品九色蝌蚪自拍| 亚洲电影中文字幕| 欧美在线观看视频一区二区| 欧美国产日韩一区| 欧美亚洲视频一区二区| 欧美日韩国产综合久久| 在线观看成人av| 亚洲欧美色一区| 91久久久国产精品| 亚洲欧美激情视频| 欧美日韩国产免费观看| 在线日韩成人| 久久久久在线观看| 亚洲一区日韩在线| 欧美日韩国产电影| 亚洲欧洲一级| 欧美成年人视频| 久久精品视频在线| 国产精品自拍三区| 亚洲视频欧美在线| 日韩午夜免费| 在线视频免费在线观看一区二区| 欧美另类一区| 亚洲乱码精品一二三四区日韩在线 | 亚洲欧美在线观看| 亚洲精品乱码久久久久久久久| 久久精品国产精品| 国产精品综合久久久| 午夜精品久久久久久久久久久久久| 日韩一级精品| 亚洲乱码国产乱码精品精 | 一区二区久久| 欧美另类一区| 一区二区日韩伦理片| 亚洲人成艺术| 欧美日韩三级一区二区| 亚洲社区在线观看| 亚洲午夜久久久久久久久电影院 | 亚洲日本va午夜在线影院| 欧美成人网在线| 玖玖视频精品| 亚洲毛片在线观看| 9l国产精品久久久久麻豆| 欧美天天在线| 欧美在线在线| 免费欧美网站| 亚洲在线电影| 久久成人免费视频| 亚洲国产三级网| 亚洲精品影院在线观看| 欧美日韩第一页| 香蕉成人久久| 狂野欧美一区| 亚洲欧美日韩在线播放| 久久久精品久久久久| 亚洲区中文字幕| 欧美午夜精彩| 免费不卡视频| 亚洲一区二区三区中文字幕| 亚洲欧美另类中文字幕| 精品成人a区在线观看| 亚洲欧洲日韩综合二区| 国产精品一区三区| 欧美成人免费在线| 国产精品成人播放| 久久综合九九| 欧美日韩福利| 久久资源在线| 国产精品v欧美精品v日韩 | 欧美激情麻豆| 国产精品二区在线| 欧美成人日韩| 国产欧美一区二区三区沐欲| 欧美jizzhd精品欧美巨大免费| 欧美日韩三区| 免费久久99精品国产| 欧美午夜精品理论片a级大开眼界| 久久精品二区三区| 欧美日韩国产一区二区三区| 久久久久国内| 欧美午夜精品久久久久久孕妇| 欧美xart系列高清| 国产欧美va欧美va香蕉在| 亚洲精品久久久蜜桃| 在线精品亚洲| 欧美一区二区三区播放老司机| 久久综合五月| 国产精品私房写真福利视频| 欧美激情一区二区三区| 国产亚洲一区二区在线观看| 亚洲精品色图| 91久久久久久| 久久人人看视频| 久久综合久久美利坚合众国| 国产精品日韩欧美一区| 99视频精品| 亚洲私人影吧| 欧美日韩综合精品| 亚洲巨乳在线| 亚洲丝袜av一区| 国产精品r级在线| 亚洲少妇一区| 亚洲欧美日韩国产成人| 日韩午夜在线电影| 亚洲视频播放| 欧美另类videos死尸| 亚洲国产欧美一区二区三区久久 | 亚洲二区在线观看| 在线成人免费视频| 久久久久亚洲综合| 免费欧美网站| 亚洲精品久久久久久一区二区| 麻豆国产精品777777在线| 欧美激情黄色片| 亚洲毛片视频| 欧美色欧美亚洲高清在线视频| 亚洲三级视频| 亚洲午夜一区| 国产精品一卡二卡| 性娇小13――14欧美| 久久久久久久91| 国产专区一区| 欧美一区二区在线免费观看| 久久久久国色av免费看影院| 尤物在线精品| 欧美日韩精品一区二区| 亚洲一区免费在线观看| 美女性感视频久久久| 日韩网站在线观看| 国产精品视频午夜| 久久久999精品| 亚洲精品久久久久久久久久久久 | 欧美一区二区免费| 国内外成人在线| 噜噜噜在线观看免费视频日韩| 91久久国产综合久久蜜月精品| 在线亚洲激情| 国产香蕉97碰碰久久人人| 久久手机精品视频| 日韩亚洲欧美高清| 久久久久久噜噜噜久久久精品| 亚洲日本aⅴ片在线观看香蕉| 欧美午夜a级限制福利片| 久久er精品视频| 日韩一级黄色大片| 久久久久久9| 亚洲网在线观看| 一区在线播放| 国产日产欧美一区| 欧美影院视频| 国产麻豆视频精品| 久久久久成人精品免费播放动漫| 欧美国产1区2区| 久久精品72免费观看| 一本色道久久99精品综合| 国产亚洲一区二区三区在线播放| 欧美激情久久久久久| 亚洲一区二区四区| 亚洲欧洲精品一区二区三区不卡| 欧美在线视频二区| 99国产精品久久久久久久久久| 国产日韩欧美三级| 欧美午夜欧美| 欧美日韩免费| 麻豆精品在线视频| 久久国产精品电影| 亚洲综合日韩中文字幕v在线| 亚洲人成在线观看网站高清| 久久夜色精品| 久久人人爽爽爽人久久久|