标题:acm题树状数组解法
只看楼主
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
上面的不是求和的吧 是求区间最值啊0.0
2011-07-06 16:45
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:10 
这是我当时照着写的 希望对你有用
#include<iostream>
#include<cstdio>
using namespace std;

int n;
int num[200009];
int dismax[200009];
int dismin[200009];
int lowbit(int x){ return x&(-x); }
void init1(){
    for(int i=1; i<=n; ++i){
        if( dismax[i] < num [i])dismax[i]=num[i];
        for(int j=i; j<=n; j+=lowbit(j) ){
            if( dismax[j] < num[i] ) dismax[j]=num[i];
        }
    }
}
void init2(int x,int y){
    num[x]=y;
    for(int i=x; i<=n; i+=lowbit(i)){
        if(dismax[i] < y) dismax[i]=y;
        for(int j=i; j<=n; j+=lowbit(j) ){
            if(dismax[j] < num[x] ) dismax[j]=num[x];
        }
    }
}
int wen1(int x, int y){
    int ans=num[y];
    while(1){
        if(ans < num[y] ) ans=num[y];
        if(x==y) return ans;
        for(y-=1;y-x>=lowbit(y); y-=lowbit(y))
            if(ans < dismax[y] ) ans=dismax[y];
    }
}

int main(){
    int m;
    while( ~scanf("%d%d",&n,&m) ){
        for(int i=1; i<=n; ++i ){
            scanf("%d",&num[i]);
            dismax[i]=-1;
        }
        init1();
        getchar();
        for(int i=0; i<m; ++i ){
            int a,b;
            char c;
            scanf("%c%d%d%*c",&c,&a,&b);
            if(c=='Q') cout << wen1(a,b) <<endl;
            else if(c=='U'){
                init2(a,b);
            }
        }
    }
    return 0;
}
2011-07-06 16:47
神少年
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2010-12-22
得分:0 
回复 12楼 草狼
太感谢你了,我慢慢理解吧。。
2011-07-06 17:41
神少年
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2010-12-22
得分:0 
回复 11楼 草狼
能有c语言版本的么。。我没学过c++。。。
2011-07-06 21:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-344857-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033800 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved