欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UPC-###

程序员文章站 2022-03-26 11:29:23
...

学习犹如逆水行舟,不进则退

UPC-###

题目描述

On a two-dimensional plane, there are m lines drawn parallel to the x axis, and n lines drawn parallel to the y axis. Among the lines parallel to the x axis, the i-th from the bottom is represented by y=yi. Similarly, among the lines parallel to the y axis, the i-th from the left is represented by x=xi.
For every rectangle that is formed by these lines, find its area, and print the total area modulo 109+7.
That is, for every quadruple (i,j,k,l) satisfying 1≤i<j≤n and 1≤k<l≤m, find the area of the rectangle formed by the lines x=xi, x=xj, y=yk and y=yl, and print the sum of these areas modulo 109+7.
Constraints
2≤n,m≤105
−109≤x1<…<xn≤109
−109≤y1<…<ym≤109
xi and yi are integers.

翻译

在一个二维的平面上,被画上了m条平行于x轴的平行线,与n条平行于y轴的平行线。在平行于x轴的直线中,从底部向上第i个平行于x的直线由yi来表示,同样,从左边向右第i个平行于x的直线由xi来表示。
对于每一个由这些直线围城的矩形,求出他们的面积,并且输出所有的对109+7取余后的总面积和。
也就是说,对于每四个满足1≤i<j≤n,1≤k<l≤m的(i,j,k,l)求出每个x=xi, x=xj, y=yk 和 y=yl, 所组成的面积的和,并且对109+7取余。
限制条件
−109≤x1<…<xn≤109
−109≤y1<…<ym≤109
xi 和 yi 都是整数

输入

Input is given from Standard Input in the following format:
n m
x1 x2 … xn
y1 y2 … ym

翻译

输入来自标准输入,格式如下:
n m
x1 x2 … xn
y1 y2 … ym

输出

Print the total area of the rectangles, modulo 109+7.

翻译

输出对109+7取模后的所有面积。

Sample Input

3 3
1 3 4
1 3 6

Sample Output

60

Hint

下图说明了这个输入:
UPC-###
下面是9个矩形的总面积A, B,…,如下图所示,为60。下图说明了这个输入:
UPC-###

思路解析
UPC-###
总结一下就是一个公式
1a<b41c<d4(ba)(dc) \sum_{1≤a<b≤4}\sum_{1≤c<d≤4}\left ( b-a \right )\left ( d-c \right )\,
如果还是不明白怎么一回事,接下的动态图足以说明一切
UPC-###
然后就用美味可口的数学芝士把公式拆开就可以得到
1a<b4(ba)1c<d4(dc) \sum_{1≤a<b≤4}\left ( b-a \right )*\sum_{1≤c<d≤4}\left ( d-c \right )\,

之后就根据这个公式求除所有的面积
但是这是有规律的,画一下图寻找一下
UPC-###
OK,附上代码
AC时间到!!

#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<string>
#include<math.h>
#include<stdio.h>
#pragma GCC optimize(2)
#define Swap(a,b)  a ^= b ^= a ^= b
using namespace std;
typedef long long ll;
const int MAXN=10010;
const ll long_inf=9223372036854775807;
const int int_inf=2147483647;
inline ll read() {
	ll c=getchar(),Nig=1,x=0;
	while(!isdigit(c)&&c!='-')c=getchar();
	if(c=='-')Nig=-1,c=getchar();
	while(isdigit(c))x=((x<<1)+(x<<3))+(c^'0'),c=getchar();
	return Nig*x;
}
ll N=1e9+7;
ll x[100005],y[100005];
int main() {
	ll a,b;
	cin>>a>>b;
	for(ll i=0; i<a; i++)
		x[i]=read();
	for(ll j=0; j<b; j++)
		y[j]=read();
	ll sumx=0,sumy=0;
	for(ll i=1; i<a; i++) {
		sumx+=(((((a-i)%N)*i)%N)*((x[i]-x[i-1])%N));
		sumx%=N;
	}
	for(ll i=1; i<b; i++) {
		sumy+=(((((b-i)%N)*i)%N)*((y[i]-y[i-1])%N));
		sumy%=N;
	}
	cout<<(sumx*sumy)%N<<endl;
}

如果不算(n-i)*i而是跑遍所有的话一定会超时,所以这个地方起到优化的作用,避免重复计算.

书山有路勤为径,学海无涯苦作舟。

By-轮月

推荐阅读