日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]問題描述 有n個格子,從左到右放成一排,編號為1-n。 共有m次操作,有3種操作類型: 1.修改一個格子的權值, 2.求連續(xù)一段格子權值和, 3.求連續(xù)一段格子的最大值。 對于每個2、3

問題描述

有n個格子,從左到右放成一排,編號為1-n。

共有m次操作,有3種操作類型:

1.修改一個格子的權值,

2.求連續(xù)一段格子權值和,

3.求連續(xù)一段格子的最大值。

對于每個2、3操作輸出你所求出的結果。

輸入格式

第一行2個整數n,m。

接下來一行n個整數表示n個格子的初始權值。

接下來m行,每行3個整數p,x,y,p表示操作類型,p=1時表示修改格子x的權值為y,p=2時表示求區(qū)間[x,y]內格子權值和,p=3時表示求區(qū)間[x,y]內格子最大的權值。

輸出格式

有若干行,行數等于p=2或3的操作總數。

每行1個整數,對應了每個p=2或3操作的結果。

樣例輸入 4 3
1 2 3 4
2 1 3
1 4 3
3 1 4 樣例輸出 6
3 數據規(guī)模與約定

對于20%的數據n <= 100,m <= 200。

對于50%的數據n <= 5000,m <= 5000。

對于100%的數據1 <= n <= 100000,m <= 100000,0 <= 格子權值 <= 10000。

自己感覺這個問題有點像士兵殺敵問題,當初自己想到了樹狀數組,但是在求最值問題似乎不能成功,后來只能用到線段樹,代碼自己不會寫,java的更不會,先用C語言嘗試了下,做了半天沒有成功,編譯成功的代碼是基于數據結構專題--線段樹,感謝你。

#include 
#include 
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 4000000;
int MAX[maxn<<2];
int sum[maxn<<2];
void PushUP(int rt)
{
    MAX[rt] = max(MAX[rt<<1] , MAX[rt<<1|1]);
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int l,int r,int rt) {
    if (l == r) {
        scanf("%d",&MAX[rt]);
        sum[rt]=MAX[rt];
        return ;
    }
    int m = (l + r) >> 1;
    build(lson);
    build(rson);
    PushUP(rt);
}
void update(int p,int sc,int l,int r,int rt)
{
    if (l == r)
    {
        MAX[rt] = sc;
        sum[rt] = sc;
        return ;
    }
    int m = (l + r) >> 1;
    if (p <= m)
    update(p , sc , lson);
    else
    update(p , sc , rson);
    PushUP(rt);
}
int query(int L,int R,int l,int r,int rt) {
    if (L <= l && r <= R) {
        return MAX[rt];
    }
    int m = (l + r) >> 1;
    int ret = 0;
    if (L <= m) ret = max(ret , query(L , R , lson));
    if (R > m) ret = max(ret , query(L , R , rson));
    return ret;
}
int querysum(int L,int R,int l,int r,int rt)
{
    if( L <= l && r <= R )
    {
        return sum[rt];
    }
    int m = ( l + r ) >> 1;
    int ans=0;
    if(L<=m )
        ans+=querysum(L,R,lson);
    if(R>m)
        ans+=querysum(L,R,rson);

    return ans;
}
int main()
{
   int n , m;
   int s_val,ss_val;
   FILE *fp;
    scanf("%d%d",&n,&m);
    {
        build(1 , n , 1);
        while (m --)
        {
            int op;
            int a , b;
            scanf("%d %d %d",&op,&a,&b);
            if (op==1)
            {
                 update(a , b , 1 , n , 1);
            }
            else if(op==2)
            {
                    printf("%dn",querysum(a,b,1,n,1));
            }
            else if(op==3)
            {
                    printf("%dn",query(a,b,1,n,1));
            }
        }
    }
    return 0;
}










本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉