列表

详情


NC16722. 区间 (interval)

描述

    Apojacsleam喜欢数组。

    他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:

        操作一:将a[L]-a[R]内的元素都加上P

        操作二:将a[L]-a[R]内的元素都减去P

    最后询问a[l]-a[r]内的元素之和?
    请认真看题干及输入描述。

输入描述

输入共M+3行:

第一行两个数,n,M,意义如“题目描述”

第二行n个数,描述数组。

第3-M+2行,共M行,每行四个数,q,L,R,P,若q为1则表示执行操作2,否则为执行操作1

第4行,两个正整数l,r

输出描述

一个正整数,为a[l]-a[r]内的元素之和

示例1

输入:

10 5
1 2 3 4 5 6 7 8 9 10
1 1 5 5
1 2 3 6
0 2 5 5 
0 2 5 8
1 4 9 6
2 7

输出:

23

说明:

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 802ms, 内存消耗: 15960K, 提交时间: 2018-07-23 19:23:58

#include<cstdio>
long long a[1000001],c[1000001],n,m,l,r,p,q;
int main() {
    scanf("%lld%lld",&n,&m);
    for(  int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(  int i=1;i<=m;i++)
    { scanf("%lld%lld%lld%lld",&q,&l,&r,&p);
     if(q==1) p=-p; c[l]+=p;c[r+1]-=p; }
    for( int i=1;i<=n;i++)
    { c[i]+=c[i-1]; a[i]+=c[i]+a[i-1]; }
    scanf("%lld%lld",&l,&r);
    printf("%lld\n",a[r]-a[l-1]);
    return 0; }

C++(clang++11) 解法, 执行用时: 1243ms, 内存消耗: 22968K, 提交时间: 2020-11-29 11:44:02

#include<iostream>
using namespace std;
int main(){
	long long q,L,R,p;
	long long n,m;
	long long a[1000005],b[1000005]={0};
	long long i;
	cin>>n>>m;
	for(i=0;i<n;i++)
		cin>>a[i];
	for(i=0;i<m;i++){
		cin>>q>>L>>R>>p;
		if(q==1) p=-p;
		b[L-1]+=p;
		b[R]-=p;
	}
	for(i=1;i<n;i++){
		b[i]+=b[i-1];
	}
	long long t1,t2,t3=0;
	cin>>t1>>t2;
	for(i=t1-1;i<t2;i++)
		t3+=a[i]+b[i];
	cout<<t3;
}

上一题