ARC071_D 井井井 / ###
問題
x軸に水平な直線がm本、y軸に水平な直線がn本引いてある。この中に存在している全ての長方形の面積を求める。
方針
x軸、y軸をそれぞれ別々に考える。x軸y軸それぞれについて、すべてのx[i] - x[j] (i >j)(y軸の場合(y[i]-y[j])の値を計算し、その結果をかけ合わせれば良い。 愚直にやるとまにあわない。のですべての直線の座標について、何回足して、何回引けばよいか考える。(x軸、y軸を別々に) 足す回数はx[i] - x[j] でいうところの、x[i]として計算する回数。 引く回数はx[[j]として計算する回数。 ここである座標kについて考える。 x[k]を足す回数(x[i]のところがx[k]になる回数)は k-1回、x[k]を引く回数はn-k回である。 これをy軸についても計算し、それをかければ良い。
#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; typedef long long ll; ll mod = 1e9+7; int main() { int n, m; cin >> n >> m; vector<ll> x(n), y(m); for(int i=0;i<n;i++) cin >> x[i]; for(int i=0;i<m;i++) cin >> y[i]; ll sum_x = 0, sum_y = 0; for(int i=0;i<n;i++) { sum_x += i * x[i] - (n-i-1) * x[i]; sum_x %= mod; } for(int i=0;i<m;i++) { sum_y += i * y[i] - (m-i-1) * y[i]; sum_y %= mod; } cout << sum_x * sum_y % mod << endl; }