1369 - Answering Queries(规律)
Time Limit: 3 second(s) | Memory Limit: 32 MB |
The problem you need to solve here is pretty simple. You are give a function f(A, n), where A is an array of integers and n is the number of elements in the array. f(A, n) is defined as follows:
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;
}
Given the array A and an integer n, and some queries of the form:
1) 0 x v (0 ≤ x < n, 0 ≤ v ≤ 106), meaning that you have to change the value of A[x] to v.
2) 1, meaning that you have to find f as described above.
Input
Input starts with an integer T (≤ 5), denoting the number of test cases.
Each case starts with a line containing two integers: n and q (1 ≤ n, q ≤ 105). The next line contains n space separated integers between 0 and 106 denoting the array A as described above.
Each of the next q lines contains one query as described above.
Output
For each case, print the case number in a single line first. Then for each query-type "1" print one single line containing the value of f(A, n).
Sample Input |
Output for Sample Input |
1 3 5 1 2 3 1 0 0 3 1 0 2 1 1 |
Case 1: -4 0 4 |
题解:我的思路本来是针对每次的修改,都在询问里面找值,不出意外肯定超时了,出来看了大神的题解,是针对每次修改再修改sum就妥了,比赛的时候就没想到。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define mem(x,y) memset(x,y,sizeof(x)) 7 using namespace std; 8 const int INF=0x3f3f3f3f; 9 const int MAXN=1e5+100; 10 typedef long long LL; 11 LL a[MAXN],b[MAXN]; 12 int main(){ 13 int T,n,q,cnt=0; 14 scanf("%d",&T); 15 while(T--){ 16 scanf("%d%d",&n,&q); 17 LL sum=0; 18 for(int i=0;i<n;i++)scanf("%lld",a+i); 19 sum=0; 20 for(int i=n-1;i>=1;i--)sum+=a[i],b[i-1]=sum; 21 //for(int i=0;i<n;i++)printf("%d ",b[i]);puts(""); 22 b[n-1]=0; 23 sum=0; 24 for(int i=0;i<n-1;i++)sum+=(a[i]*(n-i-1)-b[i]); 25 mem(b,0); 26 printf("Case %d:\n",++cnt); 27 while(q--){ 28 int t,x,v; 29 scanf("%d",&t); 30 if(t){ 31 printf("%lld\n",sum); 32 } 33 else{ 34 scanf("%d%d",&x,&v); 35 sum=sum+(v-a[x])*(n-x-1)-x*(v-a[x]); 36 a[x]=v; 37 } 38 } 39 } 40 return 0; 41 }