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

            樹的統(tǒng)計(jì)

            ??????????????????????????????????????????????????????????

            源程序名 :count. pas/c/cpp

            可執(zhí)行文件名 : count.exe

            輸入文件名 :count.in

            輸出文件名 : count.out

            時(shí)限 : 2s

            ?

            一棵樹上有 n 個(gè)節(jié)點(diǎn),編號(hào)分別為 1 n ,每個(gè)節(jié)點(diǎn)都有一個(gè)權(quán)值 w

            我們將以下面的形式來要求你對(duì)這棵樹完成一些操作:

            I.?????????????????? CHANGE u t : 把結(jié)點(diǎn) u 的權(quán)值改為 t

            II.??????????????? QMAX u v: 詢問從點(diǎn) u 到點(diǎn) v 的路徑上的節(jié)點(diǎn)的最大權(quán)值

            III.???????????? QSUM u v: 詢問從點(diǎn) u 到點(diǎn) v 的路徑上的節(jié)點(diǎn)的權(quán)值和

            ?

            注意:從點(diǎn) u 到點(diǎn) v 的路徑上的節(jié)點(diǎn)包括 u v 本身

            ?

            輸入:

            輸入文件的第一行為一個(gè)整數(shù) n ,表示節(jié)點(diǎn)的個(gè)數(shù)。

            ?????? 接下來 n – 1 行,每行 2 個(gè)整數(shù) a b ,表示節(jié)點(diǎn) a 和節(jié)點(diǎn) b 之間有一條邊相連。

            ?????? 接下來 n 行,每行一個(gè)整數(shù),第 i 行的整數(shù) wi 表示節(jié)點(diǎn) i 的權(quán)值。

            ?????? 接下來 1 行,為一個(gè)整數(shù) q ,表示操作的總數(shù)。

            接下來 q 行,每行一個(gè)操作,以“ CHANGE u t ”或者“ QMAX u v ”或者“ QSUM u v ”的形式給出。

            ?

            對(duì)于 100 %的數(shù)據(jù),保證 1<=n<=30000 0<=q<=200000 ;中途操作中保證每個(gè)節(jié)點(diǎn)的權(quán)值 w -30000 30000 之間。

            輸出:

            ?????? 對(duì)于每個(gè)“ QMAX ”或者“ QSUM ”的操作,每行輸出一個(gè)整數(shù)表示要求輸出的結(jié)果。

            樣例

            count.in

            4

            1 2

            2 3

            4 1

            4 2 1 3

            12

            QMAX 3 4

            QMAX 3 3

            QMAX 3 2

            QMAX 2 3

            QSUM 3 4

            QSUM 2 1

            CHANGE 1 5

            QMAX 3 4

            CHANGE 3 6

            QMAX 3 4

            QMAX 2 4

            QSUM 3 4

            count.out

            4

            1

            2

            2

            10

            6

            5

            6

            5

            16


            標(biāo)程:

            //DynamicTrees?by?using?self-adjusting?tree
            #include<cstdlib>
            #include
            <cstdio>
            #include
            <cstring>
            using?namespace?std;
            int?const?maxN?=?30010;
            class?SplayTree?{???????//So-called?LinkCut-Trees
            ????public:
            ????????SplayTree?
            *father,?*left,?*right;
            ????????
            int?maxCost,?cost,?sum;
            ????????
            void?Set()?{
            ????????????father?
            =?left?=?right?=?0;
            ????????}
            ????????
            void?UpDate()?{
            ????????????maxCost?
            =?sum?=?cost;
            ????????????
            if?(left)?{
            ????????????????maxCost?
            >?=?left->maxCost;
            ????????????????sum?
            +=?left->sum;
            ????????????}
            ????????????
            if?(right)?{
            ????????????????maxCost?
            >?=?right->maxCost;
            ????????????????sum?
            +=?right->sum;
            ????????????}
            ????????}
            ????????
            void?Zig()?{
            ????????????
            if?(father->father)?{
            ????????????????
            if?(father->father->left?==?father)?father->father->left?=?this;
            ????????????????
            else?if?(father->father->right?==?father)?father->father->right?=?this;
            ????????????}
            ????????????father
            ->left?=?right;
            ????????????
            if?(right)?right->father?=?father;
            ????????????right?
            =?father;
            ????????????father?
            =?right->father;
            ????????????right
            ->father?=?this;
            ????????????right
            ->UpDate();
            ????????????UpDate();
            ????????}
            ????????
            void?Zag()?{
            ????????????
            if?(father->father)?{
            ????????????????
            if?(father->father->left?==?father)?father->father->left?=?this;
            ????????????????
            else?if?(father->father->right?==?father)?father->father->right?=?this;
            ????????????}
            ????????????father
            ->right?=?left;
            ????????????
            if?(left)?left->father?=?father;
            ????????????left?
            =?father;
            ????????????father?
            =?left->father;
            ????????????left
            ->father?=?this;
            ????????????left
            ->UpDate();
            ????????????UpDate();
            ????????}
            ????????
            void?Splay()?{
            ????????????
            while?(father?&&?(father->left?==?this?||?father->right?==?this))?{
            ????????????????
            if?(!father->father?||?father->father->left?!=?father?&&?father->father->right?!=?father)?{
            ????????????????????
            if?(father->left?==?this)?Zig();
            ????????????????????
            else??????????????????????Zag();
            ????????????????????
            return;
            ????????????????}
            ????????????????
            if?(father->father->left?==?father)?{
            ????????????????????
            if?(father->left?==?this)?{father->Zig();?Zig();}
            ????????????????????
            else??{Zag();?Zig();}
            ????????????????}
            ????????????????
            else?if?(father->left?==?this)?{Zig();Zag();}
            ????????????????
            else?{father->Zag();Zag();}
            ????????????}
            ????????}
            }?tree[maxN];
            struct?dataType?{
            ????
            int?nxt,?node;
            }?data[maxN?
            <<?1];
            int?totCases;
            int?head[maxN],?edge[maxN];
            bool?v[maxN];
            int?n,?dataL;
            void?Init();
            void?Dfs(int?now);
            void?Add(int?n1,?int?n2);
            void?Work();
            int?Query(int?a,?int?b,?int?kind);
            void?Change(int?i,?int?ti);
            int?main()
            {
            ????freopen(
            "count.in",?"r",?stdin);
            ????freopen(
            "count.out",?"w",?stdout);
            ????Init();
            ????Dfs(
            0);
            ????Work();
            }
            void?Init()
            {
            ????memset(head,?
            -1,?sizeof(head));
            ????scanf(
            "%d",?&n);
            ????dataL?
            =?0;
            ????
            for?(int?i(1);?i?<?n;?++i)?{
            ????????
            int?a,?b;
            ????????scanf(
            "%d%d",?&a,?&b);
            ????????
            --a,?--b;
            ????????Add(a,?b),?Add(b,?a);
            ????}
            ????
            for?(int?i(0);?i?!=?n;?++i)?tree[i].Set();
            ????
            for?(int?i(0);?i?!=?n;?++i)?{
            ????????scanf(
            "%d",?&tree[i].cost);
            ????????tree[i].maxCost?
            =?tree[i].sum?=?tree[i].cost;
            ????}
            }
            void?Add(int?n1,?int?n2)
            {
            ????data[dataL].node?
            =?n2;
            ????data[dataL].nxt?
            =?head[n1];
            ????head[n1]?
            =?dataL;
            ????dataL
            ++;
            }
            void?Dfs(int?now)
            {
            ????v[now]?
            =?true;
            ????
            for?(int?tem(head[now]);?tem?!=?-1;?tem?=?data[tem].nxt)
            ????????
            if?(!v[data[tem].node])?{
            ????????????tree[data[tem].node].father?
            =?&tree[now];
            ????????????Dfs(data[tem].node);
            ????????}
            ????v[now]?
            =?false;
            }
            void?Work()
            {
            ????
            int?q,?a,?b;
            ????
            char?ch[20];
            ????scanf(
            "%d",?&q);
            ????
            for?(int?i(0);?i?<?q;?++i)?{
            ????????scanf(
            "%s",?ch);
            ????????scanf(
            "%d%d",?&a,?&b);
            ????????
            if?(ch[0]?==?'Q')?{
            ????????????
            if?(ch[1]?==?'M')?printf("%d\n",?Query(a,?b,?0));
            ????????????
            else??????????????printf("%d\n",?Query(a,?b,?1));
            ????????}
            ????????
            else?Change(a,?b);
            ????}
            }

            int?Query(int?a,?int?b,?int?kind)
            {
            ????
            int?ret1,?ret2;
            ????
            //ACCESS(a)
            ????SplayTree?*u?=?&tree[a?-?1],?*v?=?0;
            ????
            while?(u)?{
            ????????u
            ->Splay();
            ????????u
            ->right?=?v;
            ????????
            if?(v)?v->father?=?u;
            ????????u
            ->UpDate();
            ????????v?
            =?u;
            ????????u?
            =?u->father;
            ????}
            ????
            //ACCESS(b)
            ????u?=?&tree[b?-?1],?v?=?0;
            ????
            while?(u)?{
            ????????u
            ->Splay();
            ????????
            if?(!u->father)?{
            ????????????ret1?
            =?ret2?=?u->cost;
            ????????????
            if?(v)?ret1?>?=?v->maxCost,?ret2?+=?v->sum;
            ????????????
            if?(u->right)?ret1?>?=?u->right->maxCost,?ret2?+=?u->right->sum;
            ????????}
            ????????u
            ->right?=?v;
            ????????
            if?(v)?v->father?=?u;
            ????????u
            ->UpDate();
            ????????v?
            =?u;
            ????????u?
            =?u->father;
            ????}
            ????
            if?(!kind)?return?ret1;
            ????
            else????return?ret2;
            }???

            void?Change(int?i,?int?ti)
            {
            ????tree[i?
            -?1].cost?=?ti;
            ????tree[i?
            -?1].UpDate();
            ????SplayTree?
            *tem?=?&tree[i?-?1];?
            ????
            while?(tem->father?&&?(tem->father->left?==?tem?||?tem->father->right?==?tem))?{
            ????????tem?
            =?tem->father;
            ????????tem
            ->UpDate();
            ????}
            }

            posted on 2009-03-14 18:43 250 閱讀(202) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            留言簿(6)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            伊人久久大香线蕉精品| 色欲久久久天天天综合网| 久久久九九有精品国产| 亚洲国产二区三区久久| 久久天天日天天操综合伊人av| 狠狠久久综合伊人不卡| 日本五月天婷久久网站| 久久91精品国产91久久小草| 久久国产午夜精品一区二区三区| 欧美伊人久久大香线蕉综合| 狠狠狠色丁香婷婷综合久久俺| 亚洲国产香蕉人人爽成AV片久久 | 日韩人妻无码精品久久免费一| 久久国产高潮流白浆免费观看| 久久精品国产精品亜洲毛片| 少妇久久久久久久久久| 欧美性大战久久久久久| 久久精品国产精品青草app| 久久精品国产AV一区二区三区| 99国内精品久久久久久久| 久久精品夜夜夜夜夜久久| 久久久久99这里有精品10| 久久成人18免费网站| 韩国无遮挡三级久久| 久久99精品久久久久久hb无码 | 精品久久久久久无码国产| 亚洲第一极品精品无码久久| 久久国产AVJUST麻豆| 91久久精品国产91性色也| 国产精品久久久久无码av | 久久99亚洲综合精品首页| 国产精品久久永久免费| 99久久精品国产免看国产一区| 中文字幕乱码人妻无码久久| 性做久久久久久免费观看 | 久久国产精品无码HDAV| 亚洲va久久久噜噜噜久久男同| 久久精品青青草原伊人| 欧美亚洲国产精品久久| 亚洲精品tv久久久久久久久| 亚洲va久久久噜噜噜久久男同|