zoukankan      html  css  js  c++  java
  • [vijos 1659]: 河蟹王国 标签: vijos 2017-05-29 18:28 38人阅读 评论(0)

    河蟹王国
    描述
    河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀)。每个人都有一个初始的和谐值。羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人。而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一个相同的值C。羊驼国王想知道,对于每一次选择,他选出的最大和谐值是多少。
    格式
    输入格式
    第一行是一个数N(1<=N<=100000),表示人数。
    接下来的N行,每行一个数,表示排成的序列第i个人和谐值的初始值。
    接下来是一个数M(1<=M<=100000),表示羊驼国王或他的子民有所活动(羊驼国王选择一个区间算一次,某区间里的人增长和谐值算一次)的总次数。
    接下来的M行,每行第一个是一个数K,K是1或2,若K=1,接下来有三个数L,R,C,表示区间[L,R]的所有人增加C的和谐值;若K=2,接下来有两个数L,R,表示国王选择了区间[L,R]。
    输出格式
    每次对于国王选择区间,输出选择区间里的最大和谐值。
    样例1
    样例输入1
    5
    1
    2
    3
    4
    5
    3
    2 1 4
    1 1 3 3
    2 3 5
    样例输出1
    4
    6
    限制
    每个测试点1s。
    提示
    保证所有的数以及结果都在longint范围内。
    来源
    经典问题改编。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath> 
    #define N 1000100
    #define ls 2*p
    #define rs 2*p+1
    using namespace std;
    int w[N];
    struct node{
        int left;
        int right;
        int max;
        int addv;
    }a[4*N];
    void build(int l,int r,int p){
        a[p].left=l;a[p].right=r;
        if(a[p].left==a[p].right) {a[p].max=w[l];return;}
        if(l<r){
            int mid=(l+r)/2;
            build(l,mid,ls);
            build(mid+1,r,rs);
        }
        a[p].max=max(a[2*p].max,a[2*p+1].max);
    }
    void pushdown(int p){
        if(a[p].addv!=0){
            a[ls].addv+=a[p].addv;
            a[ls].max+=a[p].addv;
            a[rs].addv+=a[p].addv;
            a[rs].max+=a[p].addv;
            a[p].addv=0;
        }
    }
    void update(int l,int r,int p,int d){
        if(a[p].left==l&&a[p].right==r)
        {   a[p].max+=d;a[p].addv+=d;return ;}
        pushdown(p);
        int mid=(a[p].left+a[p].right)/2;
        if(r<=mid) update(l,r,ls,d);
        else if(l>mid) update(l,r,rs,d);
        else {
            update(l,mid,ls,d);
            update(mid+1,r,rs,d);
        }
        a[p].max=max(a[ls].max,a[rs].max);
    }
    int query(int l,int r,int p){
        if(a[p].left==l&&a[p].right==r)
            return a[p].max;
        pushdown(p);
        int mid=(a[p].left+a[p].right)/2;
        if(r<=mid) return query(l,r,ls);
        else if(l>mid) return query(l,r,rs);
        else return max(query(l,mid,ls),query(mid+1,r,rs));
    }
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        build(1,n,1);
        int m;
        scanf("%d",&m);
        while(m--){
            int k,l,r,c;
            scanf("%d",&k);
            if(k==1){
                scanf("%d%d%d",&l,&r,&c);
                update(l,r,1,c);
            }
            else {
                scanf("%d%d",&l,&r);
                printf("%d
    ",query(l,r,1));
            }
        }
        return 0;
    }
  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183636.html
Copyright © 2011-2022 走看看