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

2010 天津賽區G hdu 3726 splay

哎,一道裸splay的題目,網上竟然木有解題報告。我第一次寫splay,犯了很多很多NC的錯誤。。調了有一個下午,最后寫了個測試模塊+生成了隨機數據,才發現錯誤。
說說我的失誤吧。。
1、首先zig zag實現的時候一定要配對,不能亂,加個兒子節點就要把兒子節點的父親節點同時初始化好
2、新加入節點的size域及其祖先的size域名不用調整,會在splay過程中自動修正完畢
3、千萬別要試圖將一顆子樹的根節點插入到另外一棵樹中,以為將兩棵樹給合并住了。。BST的定義是左子樹中的所有節點嚴格小于根節點,而不僅僅是左兒子節點,右子樹亦同。

然后針對本題說說,要倒過來操作,不斷的將連通分支合并,相當于合并兩顆splay,沒有快速的方法,把size小的子樹里的節點一個一個塞到大樹中。記得這個思想MS是09年一場網絡賽里有過的,不過那題的詢問很簡單,恩
代碼
# include <cstdio>
# include <utility>
# include <functional>
# include <cstdlib>
# include <vector>
using namespace
std;
struct
node
{

    int
sz;
    pair<int,int> val;
    node *l,*r,*pre;
    void
clear()
    {

        l=r=pre=NULL;
    }
}
buff[20005];
inline
bool cmp(const pair<int,int> &a,const pair<int,int> &b)
{

    if
(a.first!=b.first) return a.first<b.first;
    else return
a.second<b.second;
}

inline
void update(node *pos)
{

    pos->sz=(pos->l?(pos->l->sz):0)+(pos->r?(pos->r->sz):0)+1;
}

void
zig(node *pos)
{

    node *gf=pos->pre->pre,*f=pos->pre;
    (
f->l)=(pos->r);
    if
(pos->r) (pos->r->pre)=f;
    update(f);
    (
pos->r)=f;
    (
f->pre)=pos;
    (
pos->pre)=gf;
    if
(gf&&(gf->l)==f) gf->l=pos;
    else if
(gf&&(gf->r)==f) (gf->r)=pos;
}

void
zag(node *pos)
{

    node *gf=pos->pre->pre,*f=pos->pre;
    (
f->r)=(pos->l);
    if
(pos->l) (pos->l->pre)=f;
    update(f);
    f->pre=pos;
    pos->l=f;
    pos->pre=gf;
    if
(gf&&gf->l==f) (gf->l)=pos;
    else if
(gf&&gf->r==f) (gf->r)=pos;
}

void
spaly(node *pos)
{

    while
(pos->pre)
    {

        if
(pos->pre->pre==NULL)
            if
(pos==(pos->pre->l)) zig(pos);
            else
zag(pos);
        else

        {

            node *t=pos->pre->pre;
            if
(t->l&&pos==(t->l->l))
                zig(pos->pre),zig(pos);
            else if
(t->r&&pos==(t->r->r))
                zag(pos->pre),zag(pos);
            else if
(t->l&&pos==(t->l->r))
                zag(pos),zig(pos);
            else

            {

                zig(pos);
                zag(pos);
            }
        }
    }

    update(pos);
}

void
sub_insert(node *p1,node *p2)
{

    node *pre;
    spaly(p2);
    while
(p2)
    {

        pre=p2;
        if
(cmp(p1->val,p2->val)) p2=p2->l;
        else
p2=p2->r;
    }

    if
(cmp(p1->val,pre->val))
        pre->l=p1,p1->pre=pre,spaly(p1);
    else

        pre->r=p1,p1->pre=pre,spaly(p1);
}

void
ins(node *p1,node *p2)
{

    if
(p1->l) ins(p1->l,p2);
    if
(p1->r) ins(p1->r,p2);
    p1->l=p1->r=p1->pre=NULL;
    p1->sz=1;
    sub_insert(p1,p2);
}

void
insert(node *p1,node *p2)
{

    spaly(p1),spaly(p2);
    if
(p1->sz<p2->sz)
        ins(p1,p2);
    else
ins(p2,p1);
}

int
select(int pos,int k)
{

    node *p=buff+pos;
    spaly(p);
    if
(k>(p->sz)||k<1) return 0;
    else
k=(p->sz)+1-k;
    int
co=0;
    while
(true)
    {

        if
(co++>500000) exit(0);
        if
((p->l?p->l->sz:0)>=k) p=p->l;
        else if
((p->l?p->l->sz:0)+1==k)
           break
;
        else
k-=(p->l?(p->l->sz):0)+1,p=p->r;
    }

     spaly(p);
     return
p->val.first;
}

void
change(pair<int,int> val)
{

    node *p=buff+val.second;
    spaly(p);
    p->val=val;
    if
(p->l&&p->r)
    {

        node *t1=(p->l),*t2=(p->r);
        (
t1->pre)=(t2->pre)=(p->l)=(p->r)=NULL;
        while
(t1->r) t1=t1->r;
        spaly(t1);
        (
t1->r)=t2;
        (
t2->pre)=t1;
        spaly(t2);
        insert(t2,p);
    }

    else if
(p->l)
    {

        node *t=p->l;
        (
p->l)=(t->pre)=NULL;
        insert(t,p);
    }

    else if
(p->r)
    {

        node *t=p->r;
        (
p->r)=(t->pre)=NULL;
        insert(t,p);
    }

}

int
n,m;
pair<int,int> edge[60005];
bool
used[60005];
int
father[20005];
pair<int,pair<int,int> >  ask[1000005];
int
co=0;
int
find(int pos)
{

    if
(father[pos]==pos) return pos;
    else return
father[pos]=find(father[pos]);
}

int
main()
{

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

        for
(int i=1;i<=n;i++)
        {

            buff[i].clear();
            buff[i].val.second=i;
            father[i]=i;
            scanf("%d",&buff[i].val.first);
        }

        for
(int i=1;i<=m;i++)
        {

            used[i]=true;
            scanf("%d%d",&edge[i].first,&edge[i].second);
        }

        char
type[5];
        int
number=0;
        co=0;
        while
(scanf("%s",type)&&*type!='E')
        {

            pair<int,pair<int,int> > tmp;
            switch
(*type)
            {

            case
'D':
                tmp.first=2;
                scanf("%d",&tmp.second.first);
                used[tmp.second.first]=false;
                break
;
            case
'C':
            {

                tmp.first=1;
                scanf("%d%d",&tmp.second.second,&tmp.second.first);
                int
tt=buff[tmp.second.second].val.first;
                buff[tmp.second.second].val=tmp.second;
                tmp.second.first=tt;
                break
;
            }

            case
'Q':
                tmp.first=0;
                number++;
                scanf("%d%d",&tmp.second.first,&tmp.second.second);
                break
;
            };

            ask[co++]=tmp;
        }

        for
(int i=1;i<=m;i++)
            if
(used[i]&&find(edge[i].first)!=find(edge[i].second))
                insert(buff+edge[i].first,buff+edge[i].second),father[find(edge[i].first)]=find(edge[i].second);

           
        double
total=0;
        for
(int i=co-1;i>=0;i--)
        {

            switch
(ask[i].first)
            {

            case
0:
                total+=select(ask[i].second.first,ask[i].second.second);
                break
;
            case
1:
                change(ask[i].second);
                break
;
            case
2:
                //break;
                if(find(edge[ask[i].second.first].first)!=find(edge[ask[i].second.first].second))
                insert(buff+edge[ask[i].second.first].first,buff+edge[ask[i].second.first].second),
                father[find(edge[ask[i].second.first].first)]=find(edge[ask[i].second.first].second);
                break
;
            };
        }

        printf("Case %d: %.6f\n",test++,number?total/number:0);

    }

    return
0;
}

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

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

導航

統計

公告

統計系統

留言簿(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>
            一区二区在线不卡| 亚洲一区图片| 久久久久久久国产| 欧美一区二区在线免费播放| 亚洲一区二区网站| 先锋a资源在线看亚洲| 午夜在线精品偷拍| 久久综合久久综合九色| 亚洲丶国产丶欧美一区二区三区 | 欧美sm重口味系列视频在线观看| 久久久综合视频| 欧美日韩国产综合一区二区| 国产精品高潮呻吟久久av无限| 亚洲欧洲日产国码二区| 亚洲激情影视| 国产欧美日韩综合| 亚洲欧洲日产国产综合网| 亚洲成人在线视频网站| 嫩模写真一区二区三区三州| 亚洲国产91| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美高清免费| 久久精品观看| 亚洲国产精品久久久久婷婷884 | 在线不卡中文字幕| 国产精品婷婷午夜在线观看| 1024亚洲| 欧美综合第一页| 亚洲国产精品一区在线观看不卡| 亚洲女人小视频在线观看| 老牛影视一区二区三区| 国产精品午夜在线观看| 亚洲精品国产精品国自产观看浪潮| 亚洲综合色激情五月| 欧美二区在线| 久久激情中文| 国产精品视频免费| 在线亚洲一区二区| 亚洲第一黄网| 久久精品国产久精国产思思| 欧美色欧美亚洲另类七区| 亚洲国产视频一区| 久久综合伊人77777蜜臀| 亚洲一区在线免费| 欧美系列一区| 艳女tv在线观看国产一区| 欧美成人激情在线| 久久久久久香蕉网| 激情综合网激情| 久久这里只有精品视频首页| 欧美一区二区三区四区在线观看地址 | 99精品久久久| 老鸭窝91久久精品色噜噜导演| 欧美日韩一区二区在线| 亚洲日本成人| 欧美激情中文不卡| 久久婷婷国产麻豆91天堂| 国产欧美一二三区| 久久丁香综合五月国产三级网站| 亚洲视频综合在线| 国产精品亚洲美女av网站| 亚洲免费影视| 亚洲欧美卡通另类91av| 亚洲激情视频网| 国产精品日韩在线观看| 国产日本欧洲亚洲| 嫩模写真一区二区三区三州| 国产精品分类| 91久久国产自产拍夜夜嗨| 国产自产女人91一区在线观看| 亚洲精品国产拍免费91在线| 在线观看国产精品网站| 午夜精品一区二区三区在线视| 99视频在线观看一区三区| 久久夜色精品亚洲噜噜国产mv| 亚洲欧美视频| 欧美亚洲成人免费| 一本久道久久久| 一区二区三区偷拍| 欧美精品色网| 国自产拍偷拍福利精品免费一| 午夜精品久久久久久久久| 欧美一级播放| 亚洲日本无吗高清不卡| 99精品视频免费| 国产专区欧美专区| 亚洲精品影视| 激情成人亚洲| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲成色最大综合在线| 欧美国产日本| 亚洲线精品一区二区三区八戒| 亚洲午夜久久久| 亚洲第一黄色网| 亚洲小说欧美另类婷婷| 加勒比av一区二区| 一区二区三区精品视频在线观看| 国内成人精品2018免费看| 亚洲区免费影片| 国产欧美一区二区精品秋霞影院| 亚洲福利视频一区二区| 国产精品网站在线播放| 欧美激情第三页| 国产一级揄自揄精品视频| 亚洲黄色影片| 在线播放豆国产99亚洲| 中文在线一区| 亚洲免费成人av电影| 久久精品官网| 欧美在线欧美在线| 欧美国产精品va在线观看| 久久久久久久久久久成人| 欧美日韩在线三区| 欧美激情在线观看| 在线播放精品| 久久九九精品| 久久久久99精品国产片| 欧美日韩一区二区在线| 亚洲欧洲日产国码二区| 亚洲国产精品www| 久久爱www.| 久久激五月天综合精品| 国产精品另类一区| 一区二区欧美视频| 久久精品二区亚洲w码| 亚洲精品乱码久久久久久久久| 美日韩精品免费观看视频| 国产精品系列在线| 麻豆精品精品国产自在97香蕉| 日韩亚洲综合在线| 老司机午夜免费精品视频| 99精品国产一区二区青青牛奶| 国产日本欧美一区二区| 欧美第十八页| 久久激情网站| 亚洲欧美日韩成人| 亚洲啪啪91| 欧美freesex8一10精品| 午夜亚洲精品| 一本色道久久综合亚洲精品不卡| 国产真实久久| 国产精品日韩一区二区| 欧美国产一区二区在线观看| 亚洲伊人观看| 欧美精品自拍偷拍动漫精品| 亚洲精品视频中文字幕| 亚洲综合色噜噜狠狠| 国产乱码精品一区二区三区不卡| 亚洲免费视频观看| 久久久久久有精品国产| 精品动漫3d一区二区三区| 久久精品国产一区二区三| 欧美91精品| 中文国产一区| 国产热re99久久6国产精品| 久久人人爽爽爽人久久久| 欧美激情一区二区三区在线视频观看| 亚洲欧洲一区二区三区在线观看| 欧美福利一区| 亚洲综合成人在线| 久久久噜噜噜久久狠狠50岁| 精品不卡在线| 欧美日韩麻豆| 久久不射2019中文字幕| 欧美激情精品久久久六区热门| 日韩午夜激情| 国产性做久久久久久| 欧美va天堂va视频va在线| 在线视频日韩精品| 蜜臀av性久久久久蜜臀aⅴ| 一本到12不卡视频在线dvd| 国产乱肥老妇国产一区二| 另类尿喷潮videofree| 亚洲图片在线| 亚洲高清在线精品| 久久精品一区二区三区不卡牛牛| 亚洲日本免费| 黄色成人91| 国产精品video| 欧美不卡在线| 欧美中文字幕在线播放| 亚洲另类春色国产| 蜜桃av噜噜一区| 欧美一级大片在线免费观看| 亚洲成色777777在线观看影院| 欧美三级网址| 久久亚洲精品伦理| 亚洲欧美日韩人成在线播放| 亚洲国产日韩一区| 久久影院午夜片一区| 亚洲一区二区三区三| 亚洲欧洲一区二区三区| 好吊一区二区三区| 国产精品三级视频| 欧美日韩国产色视频| 欧美r片在线| 美乳少妇欧美精品| 欧美一区不卡| 亚洲少妇一区| 欧美一区二区三区电影在线观看|