2018徐州网络赛H

正式比赛线段树第一题。

很裸的线段树,维护一个区间和及答案,答案由左右两边的答案及左边的区间和乘上右边的长度可得。

求答案的时候要线段树合并。

 

 

 

#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define rep(i,x,y) for(i=x;i<=y;i++)
#define rep1(i,x,y) for(i=x;i<y;i++)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define up rt,rt<<1,rt<<1|1
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
using namespace std;
typedef long long ll;
typedef double db;
const int M = 1e5+7;
const double pi = acos(-1);
const int inf = 2147483647;
const int mod = 1e9+7;

int n,q,i,pos,tmp;ll a[M];
struct Tree
{
    ll l,r;
    ll sum,presum;
}tree[M<<3];
void pushup(int rt,int l,int r){
    tree[rt].l=tree[l].l;tree[rt].r=tree[r].r;
    tree[rt].presum=tree[l].presum+tree[r].presum;
    tree[rt].sum=tree[l].presum*(tree[r].r-tree[r].l+1)+tree[l].sum+tree[r].sum;
}
void build(int l,int r,int rt){
    tree[rt].l=l;tree[rt].r=r;
    if(l==r){
        tree[rt].presum=tree[rt].sum=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(up);
}
void update(int l,int r,int rt,ll v){
    if(l==r){
        tree[rt].presum=tree[rt].sum=v;
        return ;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) update(lson,v);
    else update(rson,v);
    pushup(up);
}
int query(int L,int R,int l,int r,int rt){
    if(L==l&&R==r){
        return rt;
    }
    int mid=(l+r)>>1,res;
    if(L>mid){
        res=query(L,R,rson);
        return res;
    }
    else if(R<=mid){
        res=query(L,R,lson);
        return res;
    }
    else{
        int ll=query(L,mid,lson),rr=query(mid+1,R,rson);
        pushup(++tmp,ll,rr);
        return tmp;
    }
}
int main(){
    #ifdef LMissher
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
    #endif
    scanf("%d%d",&n,&q);
    rep(i,1,n) scanf("%lld",&a[i]);
    build(1,n,1);
    int op,l,r;ll v;
    while(q--){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&l,&r);
            tmp=M<<2+1;
            printf("%lld\n",tree[query(l,r,1,n,1)].sum);
        }
        else{
            scanf("%d%lld",&pos,&v);
            update(1,n,1,v);
        }
    }
    return 0;
}
View Code

 

posted @ 2018-09-09 21:54  LMissher  阅读(258)  评论(0)    收藏  举报