题目链接:https://vjudge.net/contest/28079#problem/P
题目大意:给你数组A[]以及如下所示的函数f:
long long f( int A[], int n ) { // n = size of A
long long sum = 0;
for( int i = 0; i < n; i++ )
for( int j = i + 1; j < n; j++ )
sum += A[i] - A[j];
return sum;
}
有两个操作:0 x v将A[x]转变成v。
1计算函数f的值
解题思路:①对于sum有规律:sum+=(n-1-2*i)*A[i]
②每次改变数组元素的值时,直接把sum的值也改变
③一定要记得强制转换long long,很重要
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long LL; 5 const int N=1e5+5; 6 int a[N]; 7 8 int main(){ 9 int T; 10 scanf("%d",&T); 11 int cas=0; 12 while(T--){ 13 int n,q; 14 scanf("%d%d",&n,&q); 15 for(int i=0;i<n;i++){ 16 scanf("%d",&a[i]); 17 } 18 printf("Case %d: ",++cas); 19 LL sum=0; 20 for(int i=0;i<n;i++){ 21 sum+=(LL)(n-1-2*i)*a[i]; 22 } 23 while(q--){ 24 int op; 25 scanf("%d",&op); 26 if(op==1){ 27 printf("%lld ",sum); 28 } 29 else{ 30 int pos,v; 31 scanf("%d%d",&pos,&v); 32 //改变数组元素时,把sum也改变 33 sum-=(LL)(n-2*pos-1)*a[pos]; 34 sum+=(LL)(n-2*pos-1)*v; 35 a[pos]=v; 36 } 37 } 38 } 39 }