AtCoder Regular Contest 071 D

 题目:http://arc071.contest.atcoder.jp/tasks/arc071_b

题意:

    有一个二维的平面,给你xn根竖线和ym根横线,问这些线围成的长方形(正方形)的面积和(要求mod)。

    例子:

      3 3
      1 3 4
      1 3 6

    

    构成了9个长方体。

    

    可以算出ans = 60;

题解:

        很容易就可以想到暴击枚举 i,j,k,l,对应的每个值然后求面积。

     

        但是毫无疑问n4是会TLE的。

        同样的答案等价于

    

        但是很不好意思,这样还是会TLE。

        所以我们就可以把它化简为

        

       ————————————证明————————————

        展开 ∑(xj-xi)为

        (x2-x1)+(x3-x1)+····+(xn-x1)

        (x3-x2)+(x4-x2)+···+(xn-x1

        ···

        不难发现当为第k个x的时候,在它前面有(k-1)个x要选择它,所以是 +(k-1)*x。而在k的后面有(n-k)个x。xk 要选它们,所以是 -(n-k)*xk 。

        就可以化简成∑((k-1)xk-(n-k)xk)。把复杂度从n2降到n。

        同理y也是这样。

        总的复杂度为O(n+m)。

       ——————————————————————————

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <string>
 6 #include <vector>
 7 #include <map>
 8 #include <set>
 9 #include <queue>
10 #include <sstream>
11 #include <algorithm>
12 using namespace std;
13 #define pb push_back
14 #define mp make_pair
15 #define ms(a, b)  memset((a), (b), sizeof(a))
16 //#define LOCAL
17 typedef long long LL;
18 const int inf = 0x3f3f3f3f;
19 const int maxn = 100000+10;
20 const int mod = 1e9+7;
21 LL x[maxn];
22 LL y[maxn];
23 int main()
24 {
25     #ifdef LOCAL
26         freopen("input.txt" , "r", stdin);
27     #endif // LOCAL
28     int n, m;
29     scanf("%d%d", &n, &m);
30     for(int i=1;i<=n;i++)   scanf("%lld", &x[i]);
31     for(int i=1;i<=m;i++)   scanf("%lld", &y[i]);
32     LL ans =0;
33     LL sumx = 0, sumy=0;
34     for(int i=1;i<=n;i++)
35         sumx =(sumx+ ( (i-1)*x[i] - (n-i)*x[i] )%mod)%mod;
36     for(int i=1;i<=m;i++)
37         sumy =(sumy+ ( (i-1)*y[i] - (m-i)*y[i] )%mod)%mod;
38 //    printf("%lld %lld
", sumx, sumy);
39     printf("%lld
", (sumx * sumy) %mod);
40     return 0;
41 }
View Code
原文地址:https://www.cnblogs.com/denghaiquan/p/6691591.html