• <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ù)加載中……

            HDU 2688 Rotate

            題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2688
            /*
            題意:
                給定一串長(zhǎng)度為N的序列(N <= 3000000),然后是M(M<=10000)個(gè)操作,
            每個(gè)操作有兩種形式:
            1. Q 詢問當(dāng)前序列的順序數(shù)
            2. R S E (abs(E-S) <= 1000)將下標(biāo)S到E的數(shù)列向左循環(huán)旋轉(zhuǎn)一次

            題解:
                樹狀數(shù)組

            思路:
                經(jīng)典問題,首先將N個(gè)數(shù)的順序數(shù)用樹狀數(shù)組求出來,這個(gè)操作是nlogn
            的,然后對(duì)于每次R操作,統(tǒng)計(jì)在[S+1,E]區(qū)間中比v[S]大的數(shù)和小的數(shù)的個(gè)數(shù),
            將之前的順序數(shù) - 比它大的數(shù) + 比它小的數(shù),更新這個(gè)值。然后順序賦值即可。
            Q操作只需要直接輸出當(dāng)前順序數(shù)的值即可。
            */


            #include 
            <iostream>

            using namespace std;

            #define maxn 10001
            int ans[3000001];
            int n, m;

            #define ll __int64

            ll c[maxn];

            int lowbit(int x) {
                
            return x & (-x);
            }


            void add(int pos) {
                
            while(pos < maxn) {
                    c[pos] 
            ++;
                    pos 
            += lowbit(pos);
                }

            }


            ll sum(
            int pos) {
                ll s 
            = 0;
                
            while(pos > 0{
                    s 
            += c[pos];
                    pos 
            -= lowbit(pos);
                }

                
            return s;
            }


            int main() {
                
            int i;
                
            while(scanf("%d"&n) != EOF) {
                    
            for(i = 1; i <= 10000; i++)
                        c[i] 
            = 0;
                    ll val 
            = 0;
                    
            for(i = 0; i < n; i++{
                        scanf(
            "%d"&ans[i]);
                        val 
            += sum(ans[i] - 1);
                        add(ans[i]);
                    }

                    scanf(
            "%d"&m);

                    
            while(m--{
                        
            char str[10];
                        scanf(
            "%s", str);

                        
            if(str[0== 'Q'{
                            printf(
            "%I64d\n", val);
                        }
            else {
                            
            int s, e;
                            scanf(
            "%d %d"&s, &e);
                            
            if(s > e) {
                                
            int tmp = s;
                                s 
            = e;
                                e 
            = tmp;
                            }


                            
            if(s != e) {
                                
            int v = ans[s];
                                
            int lt = 0, bt = 0;
                                
            for(i = s; i < e; i++{
                                    ans[i] 
            = ans[i+1];
                                    
            if(v < ans[i+1]) {
                                        lt 
            ++;
                                    }

                                    
            if(v > ans[i+1]) {
                                        bt 
            ++;
                                    }


                                }

                                ans[e] 
            = v;
                                val 
            = val - lt + bt;
                            }

                        }

                    }

                }

                
            return 0;
            }

            posted on 2011-04-11 12:19 英雄哪里出來 閱讀(2089) 評(píng)論(3)  編輯 收藏 引用 所屬分類: 樹狀數(shù)組

            評(píng)論

            # re: HDU 2688 Rotate  回復(fù)  更多評(píng)論   

            我想問問學(xué)長(zhǎng)
            樹狀數(shù)組在這題是不是只是在求N對(duì)數(shù)的順序數(shù)時(shí)把時(shí)間復(fù)雜度
            從n^2降到了nlogn

            而在進(jìn)行變換的時(shí)候似乎是完全模擬的
            那么總的時(shí)間復(fù)雜度
            還是有O(M*abs(E-R))
            那么多
            差不多1000W是不是?
            2011-04-12 10:52 |

            # re: HDU 2688 Rotate  回復(fù)  更多評(píng)論   

            nlogn時(shí)間也有
            6000多W啊?
            怎么沒超時(shí)呢?
            2011-04-12 10:54 |

            # re: HDU 2688 Rotate  回復(fù)  更多評(píng)論   

            @略
            還是有O(M*abs(E-R)) 1000W
            nlogn時(shí)間也有 6000多W

            但這都是針對(duì)最大數(shù)據(jù)的~~大數(shù)據(jù)的組數(shù)應(yīng)該不多~~
            2011-04-12 11:13 | 英雄哪里出來
            色偷偷91久久综合噜噜噜噜| 久久五月精品中文字幕| 国产午夜精品久久久久免费视| 精品国产一区二区三区久久| 色成年激情久久综合| 亚洲欧洲中文日韩久久AV乱码| 久久无码人妻一区二区三区| 久久精品夜色噜噜亚洲A∨| 囯产极品美女高潮无套久久久| 久久一日本道色综合久久| 国产成人综合久久精品尤物| 欧美黑人激情性久久| 人人狠狠综合久久亚洲| 女人香蕉久久**毛片精品| 久久青青草原精品国产| 亚洲国产成人久久一区久久| 亚洲精品高清久久| 999久久久无码国产精品| 精品久久久久久中文字幕大豆网| 国产日韩久久免费影院| 国产午夜免费高清久久影院| 久久久噜噜噜久久中文字幕色伊伊 | 77777亚洲午夜久久多喷| 三级三级久久三级久久| 久久久久亚洲精品天堂久久久久久| 狠狠色丁香婷综合久久| jizzjizz国产精品久久| 国内精品久久久久久久97牛牛 | 国产成人精品久久二区二区| 伊人久久国产免费观看视频| 亚洲国产精品一区二区三区久久| 国产日韩久久久精品影院首页| 亚洲成人精品久久| 四虎国产精品免费久久久| 国产精品一久久香蕉产线看| 久久久久久亚洲Av无码精品专口 | 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久青草国产精品一区| 久久久久久免费一区二区三区| 1000部精品久久久久久久久| 久久99热只有频精品8|