バイトの競プロメモ

主に競技プログラミング

D - 井井井 / ### AtCoder Regular Contest 071

D - 井井井 / ###

問題概略
x軸と平行な直線がM本、y軸と平行な直線がN本ある 
このなかに存在する全ての長方形の面積の合計を109+7 で割ったあまりを出力してください。

 

制約

  • 2n,m105
  • 109x1<...<xn109
  • 109y1<...<ym109
  • xi,yi は整数である。

 

幅が1の物、2の物の時に足される区間を書いてみる

1 2 3  4 5  6  7 8  9

ーーーーーーーー  1 のとき

 

ーーーーーーーー  2のとき

   ーーーーーー

 

ーーーーーーーー  3のとき

   ーーーーーー

      ーーーー

 

ーーーーーーーー  4のとき

   ーーーーーー

      ーーーー

          ーー 

 

 

ーーーーーーーー  5のとき

   ーーーーーー

      ーーーー

          ーー

 

 

ーーーーーーーー  6のとき

   ーーーーーー

      ーーーー

 

 

ーーーーーーーー  7のとき

   ーーーーーー

 

 

ーーーーーーーー  8 のとき

 

真ん中に行くにつれて、区間が足される回数は2ずつへり、区間の長さも2ずつへる

 

public static void main(String[] args)
    {
        N = sc.nextInt();
        M = sc.nextInt();
        x = sc.nextIntArray(N);
        y = sc.nextIntArray(M);
        //x軸の合計を考える
        long sumx = 0;
        //間の辺が偶数個ある 辺のとり方も偶数個
        int l = 0;
        int r = N - 1;
        int kasa = N - 1;
        while (kasa > 0)
        {
            sumx = modSum(sumx, modMul(modDiff(x[r], x[l]), kasa));
            l++;
            r--;
            kasa -= 2;
        }
        long sumy = 0;
        //間の辺が偶数個ある 辺のとり方も偶数個
        l = 0;
        r = M - 1;
        kasa = M - 1;
        while (kasa > 0)
        {
            sumy = modSum(sumy, modMul(modDiff(y[r], y[l]), kasa));
            l++;
            r--;
            kasa -= 2;
        }
        long res = modMul(sumx, sumy);
        System.out.println(res);
    }