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

            poj 3468 A Simple Problem with Integers 線段樹成段延遲更新

               用線段樹成段更新不能立即全部更新,必須搞延遲操作。其實(shí),就是針對(duì)每個(gè)節(jié)點(diǎn),另外搞一個(gè)域表示延遲
            更新的數(shù)目。然后,在更新操作和查找操作的時(shí)候都把父親節(jié)點(diǎn)的延遲域往2個(gè)兒子走。
               這個(gè)題是要成段增加值,所以在寫PushDown函數(shù)的時(shí)候要注意,只能給兒子節(jié)點(diǎn)加上父親節(jié)點(diǎn)壓過來的值
            乘以兒子區(qū)間的長度。這題貌似用樹狀數(shù)組也可以做,不過解法肯定意思不是那么直白的。不過速度肯定會(huì)快。
            樹狀數(shù)組解法:http://kenby.iteye.com/blog/962159
               線段樹網(wǎng)上流行的解法都是開最多節(jié)點(diǎn)數(shù)目4倍的數(shù)組。以位置1作為根,每個(gè)位置其實(shí)代表的是一個(gè)區(qū)間。
            某人位置1代表1-N或者0-(N-1)區(qū)間,具體看題目了。那么2就代表區(qū)間1-(1+N)/2,3就代表區(qū)間(1+N)/2+1 - N了。
               至于lazy標(biāo)記還是搞個(gè)大數(shù)組,意義和線段樹數(shù)組一樣,搞清楚之后寫起來都比較簡單,最重要的是變形來
            解決一些要求奇怪的題目。

               
            #include <stdio.h>
            #include <string.h>
            #include <algorithm>
            using namespace std;
            typedef long long INT;

            const INT MAX_N = 100010;
            const INT INF = 0x7ffffffffffffffLL;
            INT nTree[MAX_N << 2];
            INT nAdd[MAX_N << 2];
            INT nN, nQ;

            void PushUp(INT nRt)
            {
                nTree[nRt] = nTree[nRt << 1] + nTree[nRt << 1 | 1];
            }

            void BuildTree(INT nL, INT nR, INT nRt)
            {
                nAdd[nRt] = 0;
                if (nL == nR)
                {
                    scanf("%I64d", &nTree[nRt]);
                    return;
                }
                
                INT nMid = (nL + nR) >> 1;
                BuildTree(nL, nMid, nRt << 1);
                BuildTree(nMid + 1, nR, nRt << 1 | 1);
                PushUp(nRt);
            }

            void PushDown(INT nL, INT nR, INT nRt)
            {
                INT nMid = (nL + nR) >> 1;
                INT nLs = nRt << 1;
                INT nRs = nLs | 1;
                
                if (nAdd[nRt])
                {
                    nAdd[nLs] += nAdd[nRt];
                    nAdd[nRs] += nAdd[nRt];
                    nTree[nLs] += (nMid - nL + 1) * nAdd[nRt];
                    nTree[nRs] += (nR - nMid) * nAdd[nRt];
                    nAdd[nRt] = 0;
                }
            }

            void Update(INT nL, INT nR, INT nRt, INT nX, INT nY, INT nV)
            {
                if (nL >= nX && nR <= nY)
                {
                    nTree[nRt] += nV * (nR - nL + 1);
                    nAdd[nRt] += nV;
                    return;
                }
                
                PushDown(nL, nR, nRt);
                INT nMid = (nL + nR) >> 1;
                if (nX <= nMid) Update(nL, nMid, nRt << 1, nX, nY, nV);
                if (nY > nMid) Update(nMid + 1, nR, nRt << 1 | 1, nX, nY, nV);
                PushUp(nRt);
            }

            INT Query(INT nL, INT nR, INT nRt, INT nX, INT nY)
            {
                if (nL >= nX && nR <= nY)
                {
                    return nTree[nRt];
                }
                PushDown(nL, nR, nRt);
                INT nAns = 0;
                INT nMid = (nL + nR) >> 1;
                if (nX <= nMid) nAns += Query(nL, nMid, nRt << 1, nX, nY);
                if (nY > nMid) nAns += Query(nMid + 1, nR, nRt << 1 | 1, nX, nY);
                return nAns;
            }

            int main()
            {
                INT nTemp;
                while (scanf("%I64d%I64d", &nN, &nQ) == 2)
                {
                    BuildTree(1, nN, 1);
                    
                    while (nQ--)
                    {
                        char szCmd[10];
                        INT nX, nY, nV;
                        scanf("%s", szCmd);
                        if (szCmd[0] == 'Q')
                        {
                            scanf("%I64d%I64d", &nX, &nY);
                            printf("%I64d\n", Query(1, nN, 1, nX, nY));
                        }
                        else
                        {
                            scanf("%I64d%I64d%I64d", &nX, &nY, &nV);
                            Update(1, nN, 1, nX, nY, nV);
                        }
                    }
                }
                
                return 0;
            }
               

            posted on 2012-09-16 20:42 yx 閱讀(1369) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            <2012年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            大香伊人久久精品一区二区| 99re这里只有精品热久久| 国内精品免费久久影院| A级毛片无码久久精品免费| 国产伊人久久| 国产精品久久婷婷六月丁香| 久久国产精品无码一区二区三区| 国产成人精品免费久久久久| 久久本道久久综合伊人| 人妻无码αv中文字幕久久| 久久精品国产亚洲AV麻豆网站 | 久久天天躁狠狠躁夜夜2020| 国产99久久久国产精品小说| 久久亚洲精品中文字幕三区| 亚洲一级Av无码毛片久久精品| 久久精品国产99久久无毒不卡| 日韩欧美亚洲综合久久影院Ds | 久久九九精品99国产精品| 久久99亚洲综合精品首页| 成人资源影音先锋久久资源网| 亚洲伊人久久成综合人影院| 久久精品一区二区三区中文字幕| 亚洲国产精品无码久久| 亚洲午夜福利精品久久| 99国内精品久久久久久久| 91精品国产综合久久婷婷| 综合人妻久久一区二区精品| 亚洲国产成人久久综合碰| 国产成人无码精品久久久久免费 | 99久久久久| 久久精品成人国产午夜| 久久天天躁狠狠躁夜夜躁2O2O| 亚洲综合精品香蕉久久网| 狠狠色丁香婷婷久久综合| 亚洲午夜福利精品久久| 一级a性色生活片久久无少妇一级婬片免费放 | 精品久久久久久无码免费| 国产激情久久久久影院老熟女免费| 日韩欧美亚洲综合久久影院d3| 国产Av激情久久无码天堂| 国产亚洲精品美女久久久|