【LightOJ】 1369(思维)

题目链接:

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);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/wentong_Xu/article/details/86544539