LightOJ 1369 Answering Queries(找规律)

题目链接: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:\n",++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\n",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 }

 

posted @ 2017-08-29 11:44  Yeader  阅读(281)  评论(0编辑  收藏  举报