Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2013-08-03

SRM 587 Div1 550 TriangleXor

08:46 |  SRM 587 Div1 550 TriangleXor - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 587 Div1 550 TriangleXor - kojingharangの日記  SRM 587 Div1 550 TriangleXor - kojingharangの日記 のブックマークコメント

  • 整数W, i in [0, W] に対して、(0, 1), (W, 1), (i, 0) で表される三角形の領域たちのXORの面積を求める。
  • 1≦W≦70,000
  • 図にしばし圧倒される
  • ベン図みたいに重なってるので (0, 1), (W, 1), (x, y) の三角形を足したり引いたりすればよさげ
  • (yが)一番下の三角形W+1個は +1倍
  • その上の三角形W個は -2倍
  • その上の三角形W-1個は +2倍
  • ...
  • 一番上の三角形1個は Wが奇数なら -2 倍、偶数なら 2 倍
  • したものを足してくと XOR になる
  • 各交点の高さは y=x/W と y=-x/i+1 の交点なので y=i/(i+W)
  • 最後のサンプルが合わない

(あとで)

  • 高さは上(y=1)からの距離なので 1-i/(i+W) なのであった。あと底辺 W をかけてなかった
  • 最後のサンプル以外は偶然一致していたらしい
  • accepted in practice
class TriangleXor {
	public:
	int theArea(int W) {
		long double ans = 0;
		REP(i, W+1) {
			long double h = i==0 ? 1 : 1-(long double)i/(i+W);
			long double K = i==0 ? 1 : 2*((i&1)?-1:1);
			ans += K * 0.5 * (W+1-i) * W * h;
		}
		return (int)ans;
	}
};
 |