牛客小白月賽5 I-區間 C++
阿新 • • 發佈:2019-02-16
題目描述
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
說明
思路:
全部模擬的話會超時,所以就處理要求的區間就好了。
程式碼:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn=1000001; int a[maxn]; int q[maxn],l[maxn],r[maxn],p[maxn]; int main() { int n,M; while(scanf("%d%d",&n,&M)!=EOF) { memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=0;i<M;i++) { scanf("%d%d%d%d",&q[i],&l[i],&r[i],&p[i]); } int L,R; scanf("%d%d",&L,&R); long long int sum=0; for(int j=L;j<=R;j++) { sum=sum+a[j]; } for(int i=0;i<M;i++) { if(R<l[i])continue; if(L>r[i])continue; if(q[i]!=1) { sum=sum+(min(R,r[i])-max(L,l[i])+1)*p[i]; } if(q[i]==1) { sum=sum-(min(R,r[i])-max(L,l[i])+1)*p[i]; } } printf("%lld\n",sum); } return 0; }