• <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>
            算法學社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            題目描述:
               給長度為20000的序列。求左端點在[a,b]和右端點在[c,d]中所有的子序列,最大的中位數。
            吐槽:
                1. 照著CLJ的標程和題解一點點看,終于弄懂了主席樹。。。。(即可持久化線段樹)
                2. 函數式編程V5。。。。。
                3. 劃分樹已經成為時代的眼淚了。。。。
            算法分析:
                大家自己去看CLJ的論文吧。。。。。。
            #include<iostream>
            #include<cstdio>
            #include<algorithm>
            #include<cstring>
            using namespace std;
            const int N = 20005;
            struct info{
                int sum, mxl, mxr;
                info(){}
                info(int val){
                    sum = mxl = mxr = val;
                }
            };
            info operator + (const info l, const info r){
                info mid ;
                mid .sum = l.sum + r.sum;
                mid .mxl = max(l.mxl , l.sum + max(r.mxl, 0 ));
                mid .mxr = max(r.mxr , r.sum + max(l.mxr, 0 ));
                return mid;
            }
            struct tree{
                int l,r;
                tree *pl, *pr;
                info v;
                tree (int _l, int _r, tree *_pl, tree *_pr)
                : l(_l), r(_r), pl (_pl), pr(_pr){
                    v = pl->v + pr->v;
                }
                tree (int _l, int _r, int val): l(_l), r(_r){
                    if(_l == _r) {
                        v = info(val);
                        return ;
                    }
                    int mid = l + r >>1;
                    pl = new tree(l, mid, val);
                    pr = new tree(mid+1, r, val);
                    v = pl->v + pr->v;
                }
                info ask(int L,int R){
            //        cout<<L<<" "<<R<<" "<<l<<" "<<r<<endl;
                    if(L <= l && R >= r){
            //            cout<<l<<" "<<r<<" "<<v.mxl<<" "<<v.sum<<" "<<v.mxr<<endl;
                        return v;
                    }
                    int mid = l + r >> 1;
                    if(mid < L) return pr->ask(L,R);
                    else if(mid >= R) return pl->ask(L,R);
                    else return pl ->ask(L,R) + pr ->ask(L,R);
                }
                tree* change(int pos, int val){
                    if(l == r){
                        return new tree(l,r,val);
                    }
                    int mid = l+r >>1;
                    if(pos <= mid) return new tree(l,r,pl->change(pos,val),pr);
                    return new tree(l,r,pl,pr->change(pos,val));
                }
                void OP(){
                    cout<<l<<" "<<r<<" "<<v.mxl<<" "<<v.sum<<" "<<v.mxr<<endl;
                    if(l==r) return;
                    pl->OP();
                    pr->OP();
                }
            };
            tree *root[N];
            pair<int,int> num[N];
            int a[N],n;
            bool chk(int m,int a,int b,int c,int d){
                tree *rt = root[m];
                int val =  rt->ask(a, b).mxr + (b+1<c ? rt->ask(b+1,c-1).sum : 0) + rt -> ask(c,d).mxl ;
                //cout<<val<<endl;
                return val >= 0;
            }
            int main(){
                scanf("%d",&n);
                for(int i=0;i<n;i++){
                    scanf("%d",&a[i]);
                    num[i] = make_pair(a[i],i);
                }
                sort(num,num+n);
                root[0] = new tree(0,n-1,1);
                //for(int i=0;i<n;i++) cout<<num[i].first <<" "<<num[i].second <<" "; cout<<endl;
                for(int i=1;i<n;i++){
            //        cout<<"i: "<<i<<" "<<num[i-1].second<<endl;
                    root[i] = root[i-1] -> change(num[i-1].second, -1);
            //        root[i]->OP();
                }
                int Q, last = 0;
                cin >>Q;
                while(Q--){
                    int q[4];
                    for(int i=0;i<4;i++){
                        scanf("%d",&q[i]);
                        q[i] = (q[i] + last) % n;
                    }
                    sort(q,q+4);
                    int l = 0, r = n;
                    while(l < r){
                        int m = l+ r>>1;
                //        cout<<m<<" "<<q[0]<<" "<<q[1]<<" "<<q[2]<<" "<<q[3]<<endl;
                        if(chk(m,q[0],q[1],q[2],q[3])) l = m+1;
                        else r = m;
                    }
                    printf("%d\n",num[l-1].first);
                    last = num[l-1].first;
                }
                return 0;
            }
            posted on 2012-06-20 16:44 西月弦 閱讀(1254) 評論(5)  編輯 收藏 引用 所屬分類: 解題報告

            FeedBack:
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹
            2012-07-14 21:36 | 蒟蒻
            CLJ的標程?請問大神在哪找的...  回復  更多評論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹
            2012-07-14 21:40 | 蒟蒻
            還有大神,我是P轉C
            這是什么語法啊
            tree (int _l, int _r, tree *_pl, tree *_pr)
            : l(_l), r(_r), pl (_pl), pr(_pr){
            v = pl->v + pr->v;
            }
            tree (int _l, int _r, int val): l(_l), r(_r){
            提一下名稱...我去百度一下...  回復  更多評論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹
            2012-07-14 22:44 | 西月弦
            @蒟蒻
            這個語法是C++構造函數
            CLJ的題解我的文章里不是有超鏈接么...  回復  更多評論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹
            2012-07-15 19:07 | 蒟蒻
            @西月弦
            只有PDF...沒有標程...  回復  更多評論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹
            2012-07-15 19:12 | 蒟蒻
            找到了...在homework2里...但還是謝謝了...  回復  更多評論
              
            久久久久无码精品| 国内精品久久久人妻中文字幕| 久久久久女人精品毛片| 中文字幕精品久久| 亚洲精品无码久久久| 久久久久亚洲av成人无码电影| 国产精品99久久久久久人| 久久99久久99精品免视看动漫| 久久夜色精品国产噜噜噜亚洲AV| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲精品tv久久久久久久久| 色综合久久中文字幕无码| 久久久久久毛片免费播放| 国产亚洲欧美成人久久片| 国产99久久九九精品无码| 久久亚洲欧洲国产综合| 久久婷婷五月综合色奶水99啪| 久久99精品久久久大学生| 久久久久人妻一区二区三区vr| 久久国产精品-国产精品| 精品国产一区二区三区久久蜜臀| 久久久久久一区国产精品| 97精品依人久久久大香线蕉97| 久久久久人妻精品一区二区三区| 91精品国产高清久久久久久国产嫩草| 99久久国产亚洲高清观看2024| 午夜精品久久影院蜜桃| 色综合久久无码五十路人妻| 91精品无码久久久久久五月天| 青青热久久国产久精品| 久久99精品久久久久久久久久| 精品乱码久久久久久夜夜嗨| 久久久久久精品久久久久| 色综合久久综精品| 伊人久久综合无码成人网| 久久噜噜电影你懂的| 久久精品卫校国产小美女| 久久婷婷久久一区二区三区| 国产A级毛片久久久精品毛片| 99久久综合国产精品二区| 一本色道久久88—综合亚洲精品|