• <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>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            題目描述:
               給長(zhǎng)度為20000的序列。求左端點(diǎn)在[a,b]和右端點(diǎn)在[c,d]中所有的子序列,最大的中位數(shù)。
            吐槽:
                1. 照著CLJ的標(biāo)程和題解一點(diǎn)點(diǎn)看,終于弄懂了主席樹(shù)。。。。(即可持久化線段樹(shù))
                2. 函數(shù)式編程V5。。。。。
                3. 劃分樹(shù)已經(jīng)成為時(shí)代的眼淚了。。。。
            算法分析:
                大家自己去看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) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 解題報(bào)告

            FeedBack:
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹(shù)
            2012-07-14 21:36 | 蒟蒻
            CLJ的標(biāo)程?請(qǐng)問(wèn)大神在哪找的...  回復(fù)  更多評(píng)論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹(shù)
            2012-07-14 21:40 | 蒟蒻
            還有大神,我是P轉(zhuǎn)C
            這是什么語(yǔ)法啊
            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){
            提一下名稱...我去百度一下...  回復(fù)  更多評(píng)論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹(shù)
            2012-07-14 22:44 | 西月弦
            @蒟蒻
            這個(gè)語(yǔ)法是C++構(gòu)造函數(shù)
            CLJ的題解我的文章里不是有超鏈接么...  回復(fù)  更多評(píng)論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹(shù)
            2012-07-15 19:07 | 蒟蒻
            @西月弦
            只有PDF...沒(méi)有標(biāo)程...  回復(fù)  更多評(píng)論
              
            # re: bzoj 2653 二分枚舉 + 可持久化線段樹(shù)
            2012-07-15 19:12 | 蒟蒻
            找到了...在homework2里...但還是謝謝了...  回復(fù)  更多評(píng)論
              
            久久精品黄AA片一区二区三区| 久久免费精品视频| 中文字幕乱码久久午夜| 一本一本久久A久久综合精品| 丰满少妇人妻久久久久久| 99久久免费国产精品| 思思久久99热只有频精品66| 精品免费tv久久久久久久| 性做久久久久久免费观看| 久久99国产亚洲高清观看首页| 婷婷久久综合九色综合九七| 99久久中文字幕| 2020国产成人久久精品| 精品久久久久久99人妻| 99精品国产在热久久| 久久99精品国产麻豆宅宅| 久久久久久亚洲精品不卡| 久久免费高清视频| 2021久久国自产拍精品| 新狼窝色AV性久久久久久| 久久丫忘忧草产品| 一本色综合久久| 久久99精品国产麻豆婷婷| 久久精品国产69国产精品亚洲| 亚洲精品乱码久久久久66| 精品一二三区久久aaa片| 2021国产精品午夜久久| 日韩人妻无码一区二区三区久久99 | 久久精品亚洲男人的天堂 | 免费国产99久久久香蕉| MM131亚洲国产美女久久| 狠狠色丁香婷婷综合久久来| 国产精品久久午夜夜伦鲁鲁| 久久精品亚洲日本波多野结衣| 国产69精品久久久久久人妻精品| 99久久国产亚洲综合精品| 久久亚洲精品无码VA大香大香| 囯产精品久久久久久久久蜜桃| 精品一二三区久久aaa片| 久久无码人妻一区二区三区| 久久久精品午夜免费不卡|