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

            塊狀數(shù)組

            Posted on 2012-01-17 20:31 Mato_No1 閱讀(1140) 評論(2)  編輯 收藏 引用 所屬分類: 其它高級數(shù)據(jù)結(jié)構

            例題
            本沙茶覺得塊狀數(shù)組又好寫又有用(其實就是另一種樸素)……只是那個O(sqrt(n))的復雜度比較大而已(其實如果加上常數(shù)的話它并不比Segplaytree慢多少)
            編程技巧:
            (1)每塊長度設為m=floor(sqrt(n)),最后不足長度的不補值,設n0為總塊數(shù)(顯然n0=(n-1)/m+1);
            (2)設立LEN[i]=第i塊的實際長度(顯然除了最后一塊都是m),可以在建立塊狀數(shù)組(真正搞成塊狀,也就是二維)的時候得到;
            (3)對于區(qū)間[l, r],要注意:<1>l、r位于同一塊(l/m==r/m)的情況;<2>r位于最后一塊的情況;
            (4)別忘了同時更新原數(shù)組與塊狀數(shù)組;

            另外,本例題需要二分+找多少個比它小的這樣的操作,總時間復雜度是O(N*sqrt(N)*log2N*log2N)(幸虧N只有10000……)。

            如果有插入刪除元素,就需要用動態(tài)的塊狀鏈表了……極其難搞,本沙茶不敢試了……遇到這種題還是寫Segplaytree吧囧……

            #include <iostream>
            #include 
            <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <math.h>
            using namespace std;
            #define re(i, n) for (int i=0; i<n; i++)
            #define re1(i, n) for (int i=1; i<=n; i++)
            #define re2(i, l, r) for (int i=l; i<r; i++)
            #define re3(i, l, r) for (int i=l; i<=r; i++)
            #define rre(i, n) for (int i=n-1; i>=0; i--)
            #define rre1(i, n) for (int i=n; i>0; i--)
            #define rre2(i, r, l) for (int i=r-1; i>=l; i--)
            #define rre3(i, r, l) for (int i=r; i>=l; i--)
            const int MAXN = 100002, MAXM = 320, INF = ~0U >> 2;
            int n, m, n0, A[MAXN], T[MAXM][MAXM], LEN[MAXM], res;
            int cmp(const void *s1, const void *s2)
            {
                
            return *(int *)s1 - *(int *)s2;
            }
            void prepare()
            {
                m 
            = (int) floor(sqrt(n) + 1e-7); n0 = (n - 1/ m + 1; re(i, n0) LEN[i] = 0;
                re(i, n) T[i 
            / m][LEN[i / m]++= A[i];
                re(i, n0) qsort(T[i], LEN[i], 
            sizeof(int), cmp);
            }
            void opr0(int No, int x)
            {
                A[No] 
            = x; int S = No / m; re(i, LEN[S]) T[S][i] = A[S * m + i]; qsort(T[S], LEN[S], sizeof(int), cmp);
            }
            int opr1(int l, int r, int x)
            {
                
            int S0 = l / m, l0 = l % m, S1 = r / m, r0 = r % m, l1, r1, mid, res0 = 0;
                
            if (S0 == S1) re3(i, l0, r0) {if (A[S0 * m + i] < x) res0++;} else {
                    re2(i, l0, LEN[S0]) 
            if (A[S0 * m + i] < x) res0++;
                    re3(i, 
            0, r0) if (A[S1 * m + i] < x) res0++;
                    re2(i, S0
            +1, S1) {
                        l1 
            = 0; r1 = LEN[i];
                        
            while (l1 < r1) {
                            mid 
            = l1 + r1 >> 1;
                            
            if (T[i][mid] >= x) r1 = mid; else l1 = mid + 1;
                        }
                        res0 
            += l1;
                    }
                }
                
            return res0;
            }
            int main()
            {
                
            int M, a0, b0, x0, l, r, mid; char ss[20];
                scanf(
            "%d%d"&n, &M);
                re(i, n) scanf(
            "%d"&A[i]); prepare();
                re(i, M) {
                    scanf(
            "%s", ss);
                    
            if (ss[0== 'C') {
                        scanf(
            "%d%d"&a0, &x0); opr0(--a0, x0);
                    } 
            else {
                        scanf(
            "%d%d%d"&a0, &b0, &x0); a0--; b0--;
                        l 
            = 0; r = 1000000000;
                        
            while (l < r) {
                            mid 
            = l + r + 1 >> 1;
                            
            if (opr1(a0, b0, mid) < x0) l = mid; else r = mid - 1;
                        }
                        printf(
            "%d\n", l);
                    }
                }
                
            return 0;
            }



             

            Feedback

            # re: 塊狀數(shù)組  回復  更多評論   

            2013-05-25 20:57 by mato
            求什么是Segplaytree

            # re: 塊狀數(shù)組  回復  更多評論   

            2013-05-29 16:57 by Mato_No1
            LS不要山寨……
            Segplaytree就是用來當Segtree的Splaytree。
            久久人人爽人人人人爽AV| 无码人妻精品一区二区三区久久久 | 日本福利片国产午夜久久| 久久国产精品久久久| 91亚洲国产成人久久精品| 综合久久精品色| 久久天天躁狠狠躁夜夜网站| 久久96国产精品久久久| 国产69精品久久久久观看软件 | 久久久久亚洲av无码专区导航| 久久国产精品成人片免费| 国产免费久久精品99久久| 精品熟女少妇AV免费久久| 亚洲国产成人久久精品影视| 日本加勒比久久精品| 久久精品午夜一区二区福利 | 伊人久久综合热线大杳蕉下载| 香港aa三级久久三级老师2021国产三级精品三级在 | 偷偷做久久久久网站| 99久久夜色精品国产网站| 国内精品综合久久久40p| 91久久精品国产成人久久| 69久久夜色精品国产69| 久久久午夜精品福利内容| 国产精品午夜久久| 久久99中文字幕久久| 久久精品aⅴ无码中文字字幕重口| 久久av免费天堂小草播放| 国产精品久久久久久久久免费| 欧美激情一区二区久久久| 日韩影院久久| 久久影视国产亚洲| 久久九九免费高清视频| 久久国产精品免费一区| 国产农村妇女毛片精品久久| 久久99精品久久久久久| 精品九九久久国内精品| 精品久久久久久国产| 国产—久久香蕉国产线看观看| 国产亚洲欧美成人久久片| 国产69精品久久久久777|