题目链接:
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1369
题目大意:给你N个数,还有Q次询问,这些数的结果是由一系列计算给出的
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;
}
就是由这个规律给出的,
思路:把这N个数写到一个N*N的矩阵的对角线上,然后后面的减出来的数就写在后面,类似于下面的图,这样就可以发现,如果你改变某个数的值,例如咱们增加了他的值A,那么影响就是:这一行的每个数都+A,这一列的数都-A,这样就可以了,我们只要统计增加的个数就可以了,别忘了把数组中的数保存了,我因为这个就WA了9发,最终也没找出错误,脑袋撞墙了
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
ll sum=0;
int a[1000050];
/*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];
//cout<<A[i] - A[j]<<endl;
}
return sum;
}*/
int main()
{
int t,kase=1;
scanf("%d",&t);
while(t--)
{
sum=0;
ll n,k,x,v;
scanf("%lld%lld",&n,&k);
for(ll i=0; i<n; i++)
{
scanf("%lld",&a[i]);
sum+=(n-i-1)*a[i]-i*a[i];
}
/*for( int i = 0; i < n; i++ )
for( int j = i + 1; j < n; j++ )
{
sum += a[i] - a[j];
//cout<<A[i] - A[j]<<endl;
}
*/
int ok;
printf("Case %d:\n",kase++);
while(k--)
{
scanf("%d",&ok);
if(ok==0)
{
scanf("%lld%lld",&x,&v);
int y=v-a[x];
sum+=(ll)((n-x-1)*y-x*y);
a[x]=v;
}
else
{
printf("%lld\n",sum);
}
}
}
}