牛客小白月赛5 I题 区间
链接:https://www.nowcoder.com/acm/contest/135/I
来源:牛客网
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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
说明
用差分数组写了一发:
#include <bits/stdc++.h> using namespace std; #define ll long long ll sum[1000005]; ll a[1000005]; ll d[1000005]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int p,l,r; ll q; memset(d,0,sizeof(d)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } while(m--) { scanf("%d%d%d%lld",&p,&l,&r,&q); if(p==1) { d[l]+=-q; d[r+1]-=-q; } else { d[l]+=q; d[r+1]-=q; } } scanf("%d%d",&l,&r); for(int i=2;i<=n;i++) { d[i]+=d[i-1]; } for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+d[i]+a[i]; } printf("%lld\n",sum[r]-sum[l-1]); } }