[USACO15DEC] Counting Haybale P题解

题目描述

Farmer John 正在尝试雇佣承包商来帮助他重新安排农场,但到目前为止,所有承包商在看到 FJ 希望他们遵循的复杂指令序列后都辞职了。FJ 不得不自己完成这个项目,他意识到自己可能把项目搞得比必要的还要复杂。请帮助他按照指令完成农场的升级。

FJ 的农场由一排 N 个田地组成,编号为 1…N。每个田地里可以有任意数量的干草堆。Farmer John 的指令包含三种类型的条目:

  1. 给定一个连续的田地区间,向每个田地添加 C 个新的干草堆。

  2. 给定一个连续的田地区间,确定该区间内田地中干草堆的最小数量。

  3. 给定一个连续的田地区间,计算该区间内干草堆的总数。

输入格式

第一行包含两个正整数,N(1≤N≤200,000)和 Q(1≤Q≤100,000)。

第二行包含 N 个非负整数,每个整数最多为 100,000,表示每个田地中初始的干草堆数量。

接下来的 Q 行每行包含一个大写字母,可能是 M、P 或 S,后跟两个正整数 A 和 B(1≤A≤B≤N),或者三个正整数 A、B 和 C(1≤A≤B≤N;1≤C≤100,000)。只有当大写字母是 P 时,才会有三个正整数。

如果字母是 M,输出从 A…B 的田地区间内干草堆的最小数量。

如果字母是 P,向从 A…B 的田地区间内的每个田地添加 C 个新的干草堆。

如果字母是 S,输出从 A…B 的田地区间内干草堆的总数。

输出格式

对于 FJ 指令中的每一个 'M' 或 'S' 条目,输出一行相应的结果。

隐藏翻译

题意翻译

题目描述

Farmer John 正在尝试雇佣承包商来帮助他重新安排农场,但到目前为止,所有承包商在看到 FJ 希望他们遵循的复杂指令序列后都辞职了。FJ 不得不自己完成这个项目,他意识到自己可能把项目搞得比必要的还要复杂。请帮助他按照指令完成农场的升级。

FJ 的农场由一排 N 个田地组成,编号为 1…N。每个田地里可以有任意数量的干草堆。Farmer John 的指令包含三种类型的条目:

  1. 给定一个连续的田地区间,向每个田地添加一个新的干草堆。

  2. 给定一个连续的田地区间,确定该区间内田地中干草堆的最小数量。

  3. 给定一个连续的田地区间,计算该区间内干草堆的总数。

输入格式

第一行包含两个正整数,N(1≤N≤200,000)和 Q(1≤Q≤100,000)。

第二行包含 N 个非负整数,每个整数最多为 100,000,表示每个田地中初始的干草堆数量。

接下来的 Q 行每行包含一个大写字母,可能是 M、P 或 S,后跟两个正整数 A 和 B(1≤A≤B≤N),或者三个正整数 A、B 和 C(1≤A≤B≤N;1≤C≤100,000)。只有当大写字母是 P 时,才会有三个正整数。

如果字母是 M,输出从 A…B 的田地区间内干草堆的最小数量。

如果字母是 P,向从 A…B 的田地区间内的每个田地添加 C 个新的干草堆。

如果字母是 S,输出从 A…B 的田地区间内干草堆的总数。

输出格式

对于 FJ 指令中的每一个 'M' 或 'S' 条目,输出一行相应的结果。

输入输出样例

输入 #1复制

4 5
3 1 2 4
M 3 4
S 1 3
P 2 3 1
M 3 4
S 1 3

输出 #1复制

2
6
3
8

思路

用线段树维护即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,q,a[200005],aa,bb,cc;
long long te[800005],te2[800005],siz[800005],lz[800005];
char ch;
void ac(long long a1,long long v){
    te[a1]+=v;
    lz[a1]+=v;
    te2[a1]+=v*siz[a1];
}
void down(long long a1){
    ac(a1*2,lz[a1]);
    ac(a1*2+1,lz[a1]);
    lz[a1]=0;
}
void bu(long long a1,long long l,long long r){
    siz[a1]=r-l+1;
    if(l==r){
        te[a1]=a[l];
        te2[a1]=a[l];
        lz[a1]=0;
        return ;
    }
    long long mid=(l+r)/2;
    bu(a1*2,l,mid);
    bu(a1*2+1,mid+1,r);
    te[a1]=min(te[a1*2],te[a1*2+1]);
    te2[a1]=te2[a1*2]+te2[a1*2+1];
    return ;
}
void ci(long long a1,long long l,long long r,long long x,long long y,long long v){
    if(l>=x&&r<=y){
        te[a1]+=v;
        te2[a1]+=v*siz[a1];
        lz[a1]+=v;
        return ;
    }
    down(a1);
    long long mid=(l+r)/2;
    if(mid>=x){
        ci(a1*2,l,mid,x,y,v);
    }
    if(mid+1<=y){
        ci(a1*2+1,mid+1,r,x,y,v);
    }
    te[a1]=min(te[a1*2],te[a1*2+1]);
    te2[a1]=te2[a1*2]+te2[a1*2+1];
    return ;
}
long long co(long long a1,long long l,long long r,long long x,long long y){
    if(l>=x&&r<=y){
        return te[a1];
    }
    down(a1);
    long long mid=(l+r)/2,dbdb=1e18+7;
    if(mid>=x){
        dbdb=min(dbdb,co(a1*2,l,mid,x,y));
    }
    if(mid+1<=y){
        dbdb=min(dbdb,co(a1*2+1,mid+1,r,x,y));
    }
    te[a1]=min(te[a1*2],te[a1*2+1]);
    te2[a1]=te2[a1*2]+te2[a1*2+1];
    return dbdb;
}
long long co2(long long a1,long long l,long long r,long long x,long long y){
    if(l>=x&&r<=y){
        return te2[a1];
    }
    down(a1);
    long long mid=(l+r)/2,dbdb=0;
    if(mid>=x){
        dbdb+=co2(a1*2,l,mid,x,y);
    }
    if(mid+1<=y){
        dbdb+=co2(a1*2+1,mid+1,r,x,y);
    }
    te[a1]=min(te[a1*2],te[a1*2+1]);
    te2[a1]=te2[a1*2]+te2[a1*2+1];
    return dbdb;
}
int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    bu(1,1,n);
    for(int i=1;i<=q;i++){
        cin>>ch;
        if(ch=='M'){
            cin>>aa>>bb;
            cout<<co(1,1,n,aa,bb)<<endl;
        }
        else if(ch=='P'){
            cin>>aa>>bb>>cc;
            ci(1,1,n,aa,bb,cc);
        }
        else{
            cin>>aa>>bb;
            cout<<co2(1,1,n,aa,bb)<<endl;
        }
    }
	return 0;
}

posted @ 2025-10-16 20:38  bz02_2023f2  阅读(10)  评论(0)    收藏  举报  来源