HDU 4027 Can you answer these queries? (선분 수 + 폭력)

1730 단어 데이터 구조
제목:
한 단락 의 서열 과 두 가지 조작 을 제시 하고 첫 번 째 조작 은 x, y 구간 의 수 를 모두 제곱 으로 하고 두 번 째 조작 은 x, y 구간 을 구 합 니 다.
분석:
처음에는 선분 나무 로 만 들 지 못 했다. 순 선분 나무 밑 에 있 는 폭력 매 거 진 복잡 도 는 얼마 차이 가 나 지 않 았 지만 처방 이 나 기 때문에 적은 순환 에서 1 에 이 를 수 있 기 때문에 직접 이렇게 할 수 있 었 다.그러나 제목 은 인내 치 의 범 위 를 말 하지 않 았 고 0 이 너무 많 으 면 이 방법 도 쉽 지 않다.
#include

using namespace std;

const int maxn=1e5+10;

typedef long long ll;

ll tree[maxn<<2];

void build(int l,int r,int i){
    if(l==r){
        scanf("%lld",&tree[i]);
        return;
    }
    int mid=l+r>>1;
    build(l,mid,i<<1);
    build(mid+1,r,i<<1|1);
    tree[i]=tree[i<<1]+tree[i<<1|1];
}

void change(int tl,int tr,int l,int r,int i){
    if(tl>r||tr>1;
    change(tl,tr,l,mid,i<<1);
    change(tl,tr,mid+1,r,i<<1|1);
    tree[i]=tree[i<<1]+tree[i<<1|1];
}

ll query(int tl,int tr,int l,int r,int i){
    if(tl>r||tr>1;
    return query(tl,tr,l,mid,i<<1)+query(tl,tr,mid+1,r,i<<1|1);
}

int main(){
    int n,m,cs=1;
    while(scanf("%d",&n)!=EOF){
        memset(tree,0,sizeof tree);
        build(1,n,1);
        scanf("%d",&m);
        printf("Case #%d:
",cs++); while(m--){ int f,x,y; scanf("%d%d%d",&f,&x,&y); if(x>y) swap(x,y); // 。 if(f==1){ printf("%lld
",query(x,y,1,n,1)); }else{ change(x,y,1,n,1); } } printf("
"); } }

좋은 웹페이지 즐겨찾기