• <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
            A:
            簽名題 ... 任何字符串匹配算法都可以 ... 略
            B:
            ...
            C:
            ...
            D:
            ...
            E:
            ...
            F:
            給一個(gè)'0'-'9'的串,要求支持兩種操作
            1: 查詢整段區(qū)間的最長不下降子串
            2: 讓某個(gè)區(qū)間[l,r]的所有值Si = 9-Si
            可以當(dāng)線段樹模板題
            維護(hù)最長不下降子串,需要維護(hù)下面幾個(gè)值以滿足“區(qū)間的和”的性質(zhì)
            最長不下降和最長不上升子串簡稱為"LIS"和"LDS",雖然不準(zhǔn)確,但是你們?nèi)塘税?/div>
            (1) 這個(gè)區(qū)間的全局LIS長度與LDS (mx數(shù)組)
            (2) 這個(gè)區(qū)間包含最左端點(diǎn)的LIS和LDS長,包含最右端點(diǎn)的LIS和LDS長 (seg數(shù)組,分別對應(yīng)什么意思自己看吧 )
            (3) 這個(gè)區(qū)間是否是完全不下降(上升)的 (full數(shù)組)
            (4) 這個(gè)區(qū)間的最左端點(diǎn)和最右端點(diǎn)的值 (side數(shù)組)
              再來一個(gè)數(shù)組記錄區(qū)間是否被修改過...
            上面的這些域完全可以支持操作2(見upt函數(shù))和維護(hù)LIS了(見sumup函數(shù))....
            詢問直接返回mx[1][0]就可以了
             1 #include<iostream>
             2 #include<cstring>
             3 #include<cstdio>
             4 #include<cassert>
             5 using namespace std;
             6 const int N = 100005;
             7 template <typename T> inline void chkmax(T &a,T b){if(a<b) a=b;}
             8 int seg[N<<2][2][2], side[N<<2][2], mx[N<<2][2], full[N<<2][2],chg[N<<2];
             9 int upt(int pos){
            10     for(int i=0;i<2;i++) side[pos][i] = 9- side[pos][i];
            11     swap(mx[pos][0],mx[pos][1]);
            12     swap(full[pos][0],full[pos][1]);
            13     for(int i=0;i<2;i++){
            14         swap(seg[pos][0][i],seg[pos][1][i]);
            15     }
            16 }
            17 void pushdown(int pos,int L,int R){
            18     if(chg[pos]){
            19         upt(pos);
            20         chg[pos] = 0;
            21         if(L==R) return ;
            22         chg[pos<<1] ^=1;
            23         chg[pos<<1|1]^=1;
            24     }
            25 }
            26 void sumup(int pos,int L,int R){
            27     int mid = L+R >>1;
            28     pushdown(pos<<1 , L, mid);
            29     pushdown(pos<<1|1,mid+1,R);
            30     side[pos][0] = side[pos<<1][0];
            31     side[pos][1] = side[pos<<1|1][1];
            32     full[pos][0] = full[pos<<1][0] && full[pos<<1|1][0] && side[pos<<1][1] <= side[pos<<1|1][0];
            33     full[pos][1] = full[pos<<1][1] && full[pos<<1|1][1] && side[pos<<1][1] >= side[pos<<1|1][0];
            34     seg[pos][0][0] = seg[pos<<1][0][0] + (full[pos<<1][0] && side[pos<<1][1] <= side[pos<<1|1][0] ? seg[pos<<1|1][0][0] : 0);
            35     seg[pos][1][0] = seg[pos<<1][1][0] + (full[pos<<1][1] && side[pos<<1][1] >= side[pos<<1|1][0] ? seg[pos<<1|1][1][0] : 0);
            36     seg[pos][0][1] = seg[pos<<1|1][0][1] + (full[pos<<1|1][0] && side[pos<<1][1] <= side[pos<<1|1][0] ? seg[pos<<1][0][1] : 0);
            37     seg[pos][1][1] = seg[pos<<1|1][1][1] + (full[pos<<1|1][1] && side[pos<<1][1] >= side[pos<<1|1][0] ? seg[pos<<1][1][1] : 0);
            38 //    cout<<seg[pos][0][1]<<" "<<seg[pos<<1][0][1]<<" "<<seg[pos<<1|1][0][1]<<" "<<full[pos<<1|1]
            39     for(int i=0;i<2;i++){
            40         mx[pos][i] = max(seg[pos][i][0],seg[pos][i][1]);
            41         chkmax(mx[pos][i], max(mx[pos<<1][i] , mx[pos<<1|1][i]) );
            42         if( i ? side[pos<<1][1] >= side[pos<<1|1][0]:side[pos<<1][1] <= side[pos<<1|1][0])
            43         chkmax(mx[pos][i], seg[pos<<1][i][1] + seg[pos<<1|1][i][0]);
            44     }
            45 }
            46 char num[N];
            47 int last;
            48 void update(int l,int r,int pos,int L,int R,int flag){
            49     if(l<=L && r>=R){
            50         if(flag){
            51             chg[pos] ^=1;
            52         }
            53         else {
            54             side[pos][0] = side[pos][1] = num[last++] - '0';
            55             mx[pos][0] = mx[pos][1] = full[pos][0] = full[pos][1] = 1;
            56             for(int i=0;i<2;i++) for(int j=0;j<2;j++) seg[pos][i][j] =1;
            57         }
            58         return ;
            59     }
            60     pushdown(pos,L,R);
            61     int mid = L+ R >>1;
            62     if(l<=mid) update(l,r,pos<<1, L, mid, flag);
            63     if(r > mid)update(l,r,pos<<1|1,mid+1,R, flag);
            64     sumup(pos,L,R);
            65 //    cout<<L<<" "<<R<<" "<<seg[pos][0][1]<<" "<<mx[pos][0]<<endl;
            66 }
            67 int main(){
            68     int t;
            69     scanf("%d",&t);
            70     while(t--){
            71         int n,m;last = 0;
            72         scanf("%d%d",&n,&m);
            73         scanf("%s",num);
            74         memset(chg,0,sizeof(chg));
            75         for(int i=0;i<n;i++){
            76             update(i,i,1,0,n-1,0);
            77         }
            78         assert(last==n);
            79         char cmd[10];
            80         while(m--){
            81             scanf("%s",cmd);
            82             if(cmd[0]=='q'){
            83                 pushdown(1,0,n-1);
            84                 printf("%d\n",mx[1][0]);
            85             }
            86             else {
            87                 int l,r;
            88                 scanf("%d%d",&l,&r);
            89                 l--;r--;
            90                 update(l,r,1,0,n-1,1);
            91             }
            92         }
            93         puts("");
            94     }
            95     return 0;
            96 }
            97 
            G:
            ...
            H:
            ...
            I:
            ...
            J:
            ...
            posted on 2012-05-30 10:33 西月弦 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告
            久久AAAA片一区二区| 久久久SS麻豆欧美国产日韩| 久久精品a亚洲国产v高清不卡| 亚洲国产精品无码久久久秋霞2| 99久久人妻无码精品系列蜜桃| 久久精品国产亚洲AV嫖农村妇女 | 69久久精品无码一区二区| 伊人久久大香线蕉影院95| 中文字幕久久精品| 精品久久久噜噜噜久久久| 久久精品免费大片国产大片| 97香蕉久久夜色精品国产| 久久九九全国免费| 久久久久av无码免费网| 亚洲一区二区三区日本久久九| 欧美伊人久久大香线蕉综合| 久久久久久亚洲AV无码专区| 欧美日韩成人精品久久久免费看| 精品久久久久久国产| 久久婷婷人人澡人人| 久久国产免费观看精品| 亚洲精品乱码久久久久久按摩 | 久久夜色精品国产噜噜亚洲a| 国产精品久久久久影院嫩草 | 久久久久久夜精品精品免费啦| 色婷婷狠狠久久综合五月| 国产999精品久久久久久| 婷婷综合久久中文字幕| 久久婷婷国产麻豆91天堂| 精品久久久中文字幕人妻| 精品久久久久久无码国产| 国产欧美久久一区二区| 久久偷看各类wc女厕嘘嘘| 亚洲综合伊人久久综合| 久久99热这里只频精品6| 人妻中文久久久久| 国产精品无码久久久久| 国产成人精品久久亚洲高清不卡 | 99久久久精品| 久久婷婷久久一区二区三区| 天天爽天天爽天天片a久久网|