• <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>
            隨筆 - 97, 文章 - 22, 評(píng)論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            Pku 3468 A Simple Problem With Integers(線段樹(shù))

             

            /*

            很早以前著手的題,采用了和Pku 2528 的做法做,可惜一直超時(shí),原因是這題如果覆蓋次數(shù)一多,
            可能最后真正被完全覆蓋的區(qū)間可能就沒(méi)了,是的查詢的時(shí)候全部結(jié)點(diǎn)都需要遍歷,使得
            原來(lái)O(log(n))可以解決的問(wèn)題退化為O(n),金工實(shí)習(xí)和匡劍兄一起,于是決定請(qǐng)教一下他,經(jīng)過(guò)匡劍兄的指點(diǎn),
            終于明白了,一共維護(hù)兩個(gè)域,一個(gè)是當(dāng)前結(jié)點(diǎn)的增量值,另外一個(gè)是以該結(jié)點(diǎn)為根的總和,(注:
            祖先的分?jǐn)?shù)不算在內(nèi))
            那么一共兩個(gè)操作:插入和詢問(wèn)可以這樣:
            插入:到達(dá)尾部結(jié)點(diǎn)時(shí)將增量加在該結(jié)點(diǎn)上,并且把該區(qū)間總增量返還給它父親,一直到根
            詢問(wèn):一路走下去,并且將父親的增量按權(quán)值分配給它的兒子,最后回溯。如此一來(lái),插入和詢問(wèn)都是O(log(n))
            */

            #include 
            <iostream>

            using namespace std;

            __int64 tree[
            2000010];
            __int64 inc[
            2000010];
            bool flag[2000010];

            __int64 a[
            100010];
            int n, m;
            int i;

            __int64 Build(
            int p, int l, int r) {
                
            if(l == r) {
                    tree[p] 
            = a[l];
                    
            return tree[p];
                }

                
            int mid = (l + r) / 2;
                tree[
            2*p] = Build(2*p, l, mid);
                tree[
            2*p+1= Build(2*p+1, mid+1, r);
                
            return tree[2*p] + tree[2*p+1];
            }


            __int64 Query(
            int p, int s, int e, int l, int r) {
                
            int mid = (l + r) / 2;
                __int64 temp 
            = 0;

                
            if(s == l && e == r) {
                    
            return tree[p];
                }


                temp 
            = (__int64)(e-s+1)*inc[p];

                
            if(e <= mid) {
                    
            return Query(2*p, s, e, l, mid) + temp;
                }
            else if(mid + 1 <= s) {
                    
            return Query(2*p+1, s, e, mid+1, r) + temp;
                }
            else {    
                    
            return Query(2*p, s, mid, l, mid) + Query(2*p+1, mid+1, e, mid+1, r) + temp;
                }

            }


            __int64 Insert(
            int p, int s, int e, int l, int r, __int64 value) {
                
                
            if(s == l && e == r) {
                    inc[p] 
            += value;
                    tree[p] 
            += value * (r - l + 1);
                    
            return value * (r - l + 1);
                }


                
            int mid = (l + r) / 2;
                __int64 buf 
            = 0;


                
            if(e <= mid) {
                    buf 
            += Insert(2*p, s, e, l, mid, value);
                }
            else if(mid + 1 <= s) {
                    buf 
            += Insert(2*p+1, s, e, mid+1, r, value);
                }
            else {
                    buf 
            += Insert(2*p, s, mid, l, mid, value);
                    buf 
            += Insert(2*p+1, mid+1, e, mid+1, r, value);
                }

                tree[p] 
            += buf;
                
            return buf;
            }


            int main() {

                
            int i, x, y;
                __int64 z;
                
            char str[5];
                
            while(scanf("%d %d"&n, &m) != EOF) {
                    
            for(i = 1; i <= n; i++{
                        scanf(
            "%I64d"&a[i]);
                    }

                    tree[
            1= Build(11, n);
                    memset(inc, 
            0sizeof(inc));
                    
            while(m --{
                        scanf(
            "%s", str);
                        
            if(str[0== 'Q'{
                            scanf(
            "%d %d"&x, &y);
                            printf(
            "%I64d\n", Query(1, x, y, 1, n) );
                        }
            else {
                            scanf(
            "%d %d %I64d"&x, &y, &z);
                            tree[
            1= Insert(1, x, y, 1, n, z);
                        }

                    }

                }

                
            return 0;
            }

            posted on 2009-04-07 16:31 英雄哪里出來(lái) 閱讀(630) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACM

            久久人人爽人人爽人人爽 | 国产精品久久久久蜜芽| 亚洲一本综合久久| 国产精品狼人久久久久影院| 久久AⅤ人妻少妇嫩草影院| 香蕉aa三级久久毛片| 久久人人爽人人爽人人片AV东京热| 99久久精品国产综合一区| 国产精品无码久久综合网| 国内精品久久久久久久久| 久久国产成人| 亚洲一级Av无码毛片久久精品| 久久综合亚洲欧美成人| 韩国三级中文字幕hd久久精品| 国产99久久久国产精品~~牛| 中文字幕亚洲综合久久| 久久久久亚洲AV成人网| 蜜臀久久99精品久久久久久| 久久亚洲国产成人精品无码区| 思思久久精品在热线热| 色欲久久久天天天综合网| 精品久久久久久无码国产| 青青青青久久精品国产h久久精品五福影院1421 | 7国产欧美日韩综合天堂中文久久久久 | 久久人人爽人人爽人人AV东京热 | 国产精品天天影视久久综合网| 久久婷婷五月综合97色直播| 伊人久久大香线蕉综合5g| 国产精品99久久免费观看| 欧美日韩精品久久免费| 久久精品国产网红主播| 亚洲中文字幕无码久久综合网| 日日狠狠久久偷偷色综合0| 久久精品国产亚洲AV影院| 精品久久久久久| 久久91精品国产91久久小草| 久久99精品国产99久久6| 国产成人精品综合久久久| 伊人丁香狠狠色综合久久| 伊人久久综合精品无码AV专区| 国产国产成人久久精品|