青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

HDU 3308 LCIS

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3308

/*
題意:
    給出一個長度為N(N <= 100000)的數列,然后是兩種操作:
U A B: 將第A個數替換為B (下標從零開始)
Q A B: 輸出區間[A, B]的最長連續遞增子序列
注意:操作的數目m <= 100000。

解法:
線段樹

思路:
    做慣了區間最值、求和、修改、染色的等問題,這題算比較新穎
的了,由這題可以看出線段樹的一般解法,因為這題要求保存的信息
比較多,每個線段樹的結點要求保存的信息有以下幾個:

    int lMax;       // 包含結點左端點的最長連續遞增子序列的長度
    int rMax;       // 包含結點右端點的最長連續遞增子序列的長度
    int Max;        // 當前結點的最長連續遞增子序列的長度
    int lVal, rVal; // 當前結點管轄的區間左右端點的數值
    int l, r;       // 當前結點管轄的區間

我們用以下函數從左右兒子中得到當前結點的信息:
void UpdateBy(Tree* ls, Tree* rs);
之所以把它寫成函數是因為這里的處理比較麻煩,很容易出錯,并且需要
調用多次,這個函數的作用就是通過左右兒子的信息填充本身的信息。

lVal、rVal、l、r等信息比較容易求得。
lMax和rMax的值就比較麻煩了,需要分情況討論(下面的len表示區間長度):
1. 左兒子最右邊的值 < 右兒子最左邊的值

    lMax = (左兒子的lMax == 左兒子的len) ? 左兒子的len + 右兒子的lMax : 左兒子的lMax;
    rMax = (右兒子的rMax == 右兒子的len) ? 右兒子的len + 左兒子的rMax : 右兒子的rMax;
    Max  = MAX(左兒子的rMax + 右兒子的lMax, 左兒子的Max, 右兒子的Max, lMax, rMax);

2. 左兒子最右邊的值 >= 右兒子最左邊的值

    lMax = 左兒子的lMax;
    rMax = 右兒子的rMax;
    Max  = MAX(左兒子的Max, 右兒子的Max);

一開始讀入的時候有一連串數字,需要建樹,建樹的時候每次回歸時需要
將兒子的信息傳遞給父親,調用UpdateBy(Tree* ls, Tree* rs)函數,每
次插入完畢后回歸時,信息會更新,也需要調用。詢問時,返回的也是一
個線段樹結點,并且需要將答案合并,還是需要調用UpdateBy函數,所以
總的來說需要調用三次,把它寫成一個函數還是勢在必行的。
*/



#include 
<iostream>

using namespace std;

#define maxn 100010

struct Tree {
    
int lMax;       // 包含結點左端點的最長連續遞增子序列
    int rMax;       // 包含結點右端點的最長連續遞增子序列
    int Max;        // 當前結點的最長連續遞增子序列
    int lVal, rVal; // 當前區間左右端點的值
    int l, r;       // 當前結點管轄的區間
    int son[2];

    
void clear() {
        son[
0= son[1= -1;
    }

    
void UpdateBy(Tree* ls, Tree* rs);
    
void Unit(int nl, int nr, int nv);
    
int len() {
        
return r - l + 1;
    }

}
T[maxn*4];
int root, tot;
int val[ maxn ];

int MAX(int a, int b) {
    
return a > b ? a : b;
}


int MAX(int a, int b, int c) {
    
return MAX(MAX(a, b), c);
}


int MAX(int a, int b, int c, int d) {
    
return MAX( MAX(a, b), MAX(c, d) );
}


void Tree::UpdateBy(Tree* ls, Tree* rs) {
    lVal 
= ls->lVal;
    rVal 
= rs->rVal;
    l    
= ls->l;
    r    
= rs->r;
    
if(ls->rVal < rs->lVal) {
        lMax 
= (ls->lMax == ls->len()) ? ls->len() + rs->lMax : ls->lMax;
        rMax 
= (rs->rMax == rs->len()) ? rs->len() + ls->rMax : rs->rMax;
        
        Max  
= MAX(ls->rMax + rs->lMax, ls->Max, rs->Max);
        Max  
= MAX(Max, lMax, rMax);

    }
else {
        lMax 
= ls->lMax;
        rMax 
= rs->rMax;
        Max  
= MAX(ls->Max, rs->Max);
    }

}


void Tree::Unit(int nl, int nr, int nv) {
    lMax 
= rMax = 1; Max = 1;
    lVal 
= rVal = nv;
    l 
= nl; r = nr;
}


int GetID(int& root) {
    
if(root == -1{
        root 
= tot++;
        T[root].clear();
    }

    
return root;
}


void Build(int& root, int l, int r) {
    GetID(root);
    
if(l == r) {
        T[root].Unit(l, r, val[l]);
        
return ;
    }

    
int mid = (l + r) >> 1;
    Build(T[root].son[
0], l, mid);
    Build(T[root].son[
1], mid+1, r);

    T[root].UpdateBy(
&T[ T[root].son[0] ], &T[ T[root].son[1] ]);
}


void Insert(int root, int nPos, int val) {
    
if(nPos < T[root].l || nPos > T[root].r)
        
return ;
    
if(T[root].l == nPos && nPos == T[root].r) {
        T[root].Unit(nPos, nPos, val);
        
return ;
    }

    Insert(T[root].son[
0], nPos, val);
    Insert(T[root].son[
1], nPos, val);

    T[root].UpdateBy(
&T[ T[root].son[0] ], &T[ T[root].son[1] ]);
}


Tree Query(
int root, int nl, int nr) {
    
if(nl > T[root].r || nr < T[root].l) {
        Tree tmp;
        tmp.Max 
= -1;
        
return tmp;
    }


    
if(nl <= T[root].l && T[root].r <= nr) {
        
return T[root];
    }

    Tree A, B;
    A 
= Query(T[root].son[0], nl, nr);
    B 
= Query(T[root].son[1], nl, nr);
    
if(A.Max == -1)
        
return B;
    
else if(B.Max == -1)
        
return A;
    
else {
        Tree X;
        X.UpdateBy(
&A, &B);
        
return X;
    }

}


int n, m;
int main() {
    
int t, i;
    scanf(
"%d"&t);

    
while(t--{
        scanf(
"%d %d"&n, &m);
        
for(i = 1; i <= n; i++{
            scanf(
"%d"&val[i]);
        }

        tot 
= 0;
        root 
= -1;
        Build(root, 
1, n);
        
while(m--{
            
char str[10];
            
int A, B;
            scanf(
"%s %d %d", str, &A, &B);
            
if(!strcmp(str, "U")) {
                Insert(root, A
+1, B);
            }
else {
                Tree tmp 
= Query(root, A+1, B+1);
                printf(
"%d\n", tmp.Max);
            }

        }

    }

    
return 0;
}

posted on 2011-04-01 02:36 英雄哪里出來 閱讀(2036) 評論(2)  編輯 收藏 引用 所屬分類: 線段樹

評論

# re: HDU 3308 LCIS  回復  更多評論   

受教了!狂膜拜!
2011-08-15 10:36 | Now_I

# re: HDU 3308 LCIS  回復  更多評論   

新生,敢問,為什么這樣區分是對的呢??
還是沒有想明白,請大神解析一下。
1. 左兒子最右邊的值 < 右兒子最左邊的值

lMax = (左兒子的lMax == 左兒子的len) ? 左兒子的len + 右兒子的lMax : 左兒子的lMax;
rMax = (右兒子的rMax == 右兒子的len) ? 右兒子的len + 左兒子的rMax : 右兒子的rMax;
Max = MAX(左兒子的rMax + 右兒子的lMax, 左兒子的Max, 右兒子的Max, lMax, rMax);

謝謝了。
2013-04-27 18:57 | ni hao
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩国产123| 欧美在线二区| 欧美视频一区| 欧美日韩另类在线| 欧美精品成人在线| 欧美日韩成人综合| 国产精品国产三级国产普通话蜜臀| 欧美大片在线观看| 欧美日本在线播放| 国产精品婷婷| 伊人色综合久久天天| 亚洲啪啪91| 性亚洲最疯狂xxxx高清| 久久综合网络一区二区| 亚洲国产国产亚洲一二三| 亚洲黄一区二区| 亚洲图片欧洲图片日韩av| 欧美一区2区视频在线观看 | 中日韩美女免费视频网站在线观看 | 欧美制服丝袜第一页| 久久疯狂做爰流白浆xx| 久久精品一区二区三区不卡| 欧美中文字幕在线视频| 欧美一区二区三区电影在线观看| 一区二区三区视频观看| 亚洲欧美综合国产精品一区| 一区二区三区国产精华| 依依成人综合视频| 国产亚洲欧美一区二区| 葵司免费一区二区三区四区五区| 在线午夜精品自拍| 日韩一级视频免费观看在线| 久久精品在线观看| 久久亚洲春色中文字幕久久久| 国产精品一二一区| 亚洲欧美日韩精品一区二区| 久久se精品一区二区| 在线精品国产成人综合| 国产精品日韩在线一区| 久久人人爽人人爽| 久久久久久一区二区| 一区二区激情视频| 午夜亚洲性色视频| 欧美一区二区三区在线观看| 翔田千里一区二区| 欧美成人综合一区| 欧美天堂亚洲电影院在线观看| 亚洲第一精品夜夜躁人人躁| 亚洲欧美综合国产精品一区| 久久av一区| 亚洲欧洲日本专区| 亚洲先锋成人| 蜜桃久久av| 国产精品一区二区三区四区| 一色屋精品亚洲香蕉网站| 亚洲少妇中出一区| 欧美成人黄色小视频| 国产精品99久久99久久久二8| 欧美在线观看天堂一区二区三区 | 欧美人在线视频| 国产伦理一区| 亚洲无亚洲人成网站77777 | 亚洲第一精品夜夜躁人人爽| 午夜国产精品影院在线观看| 欧美激情女人20p| 国产自产高清不卡| 亚洲欧美一区二区在线观看| 亚洲全部视频| 免费黄网站欧美| 国产一区二区黄色| 欧美一级免费视频| 亚洲先锋成人| 国产精品爽爽ⅴa在线观看| 99精品视频免费| 欧美激情视频在线免费观看 欧美视频免费一 | 免费欧美在线| 国产一级一区二区| 欧美在线免费观看| 亚洲专区欧美专区| 国产精品免费看久久久香蕉| 在线综合亚洲| 99riav国产精品| 欧美日韩在线另类| 一区二区三区视频在线观看| 亚洲精品乱码久久久久久蜜桃91| 老巨人导航500精品| 永久域名在线精品| 欧美69wwwcom| 欧美电影电视剧在线观看| 亚洲国产欧美在线人成| 欧美成人激情视频免费观看| 久久视频在线免费观看| 在线成人激情| 亚洲电影免费观看高清完整版| 久久综合五月| 99国产精品久久久久久久成人热| 亚洲国产综合在线| 国产精品久久久久久久久久ktv| 亚洲欧美日韩在线播放| 亚洲男人的天堂在线观看 | 永久久久久久| 亚洲国产精品电影| 欧美日韩一区二区三区高清| 亚洲午夜黄色| 欧美在线三级| 9l国产精品久久久久麻豆| 亚洲香蕉网站| 亚洲盗摄视频| 欧美+亚洲+精品+三区| 久久久人成影片一区二区三区| 国产精品中文字幕在线观看| 亚洲欧美精品一区| 亚洲一区二区三区视频| 久久久久se| 激情亚洲网站| 亚洲乱亚洲高清| 国产欧美一区二区精品忘忧草 | 国产麻豆视频精品| 欧美高清视频免费观看| 国产精品成人免费视频| 麻豆亚洲精品| 欧美网站在线观看| 免费观看成人| 国产精品裸体一区二区三区| 欧美a级大片| 国产精品视频一区二区三区| 欧美国产一区视频在线观看| 欧美伦理91| 免费日韩av片| 国产拍揄自揄精品视频麻豆| 亚洲国产日韩一区| 国内成+人亚洲+欧美+综合在线| 欧美高清视频在线| 亚洲国产精品久久久| 一区二区三区日韩在线观看| 国产在线不卡精品| 一区二区免费在线观看| 亚洲国产精品一区制服丝袜| 亚洲午夜精品福利| 亚洲另类视频| 美女视频网站黄色亚洲| 久久国产精品久久国产精品| 欧美日韩免费在线观看| 欧美黄色aa电影| 国产主播精品在线| 性8sex亚洲区入口| 亚洲经典自拍| 亚洲自拍偷拍色片视频| 在线中文字幕一区| 欧美日本不卡| 日韩一本二本av| 99精品欧美一区| 欧美巨乳在线观看| 亚洲高清不卡av| 亚洲电影中文字幕| 久久一区亚洲| 免费欧美日韩国产三级电影| 国产一区二区三区免费观看| 亚洲欧美视频在线观看视频| 亚洲一区三区电影在线观看| 欧美日本国产视频| 91久久精品国产91久久性色| 亚洲区欧美区| 欧美福利在线| 亚洲免费成人av| 亚洲视频一区在线| 国产精品久久中文| 午夜精品久久久久久久久| 久久精品欧美日韩| 国内精品模特av私拍在线观看| 午夜在线视频观看日韩17c| 久久av资源网站| 一区二区亚洲| 欧美激情a∨在线视频播放| 亚洲精品一区二区三区99| 日韩视频免费| 国产精品久久97| 欧美在线中文字幕| 欧美成人精品一区二区| 亚洲开发第一视频在线播放| 欧美日本不卡高清| 亚洲欧美日韩直播| 麻豆精品传媒视频| 一本色道久久88精品综合| 欧美午夜无遮挡| 欧美一区二区视频免费观看| 欧美69视频| 午夜精品一区二区三区在线 | 国产精品狼人久久影院观看方式| 亚洲网站在线播放| 久久久夜夜夜| 99精品国产热久久91蜜凸| 欧美精品亚洲精品| 亚洲男女自偷自拍| 欧美大片一区| 久久福利精品| 亚洲另类视频| 国产一区二区三区黄| 欧美国产91| 亚洲国内自拍|