AOJ2015 Square Route

問題リンク Square Route

  • 解法

道路の数は各方向それぞれ1500、そして幅の最大は1000なので、最大の正方形でも1辺の長さは高々1500000です。
それぞれの方向に対して、作ることができる1辺の長さとその個数をカウントします。
カウントし終えたら、同じ長さ同士で積を取ったものの個数だけ正方形が作れます。例えば、横方向に長さ4の辺を2個、縦方向に長さ4を3個作れるとしたら、2*3個の面積16の正方形が作れることになります。

  • ソース
import java.util.Scanner;

//Square Route
public class AOJ2015 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			int m = sc.nextInt();
			if((n|m)==0)break;
			int[] h = new int[n];
			for(int i=0;i<n;i++)h[i]=sc.nextInt();
			int[] w = new int[m];
			for(int i=0;i<m;i++)w[i]=sc.nextInt();
			int[] wh = new int[1500001];
			int[] ww = new int[1500001];
			for(int i=0;i<n;i++){
				int s = 0;
				for(int j=i;j<n;j++){
					s+=h[j];
					wh[s]++;
				}
			}
			for(int i=0;i<m;i++){
				int s = 0;
				for(int j=i;j<m;j++){
					s+=w[j];
					ww[s]++;
				}
			}
			int c = 0;
			for(int i=0;i<1500001;i++)c+=wh[i]*ww[i];
			System.out.println(c);
		}
	}
}