Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

|

2012-08-23

SRM 553 Div1 500 TwoConvexShapes

00:50 |  SRM 553 Div1 500 TwoConvexShapes - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 553 Div1 500 TwoConvexShapes - kojingharangの日記  SRM 553 Div1 500 TwoConvexShapes - kojingharangの日記 のブックマークコメント

  • W x H のグリッドに 'B' 'W' '?' のどれかが書いてある。? を B か W にする。何通りの方法があるか。
  • ただし各 B, W 同士は連結じゃないといけない。あと同じ行/同じ列内では B-W-B とか W-B-W になっちゃだめ。
  • W, H ≦ 50
  • ...
  • B と W でなんか境界線が引けそうだ
  • なんか自由度がありすぎてどう数えたらいいかわからん。
  • ? を B/W と仮定してそこから他の ? が自動的に B/W に決まるなら全部決めて、仮定した直後と同じならその ? は他と独立なので 2 をかけて残りを計算... かなと思いつつ終了
  • あとで
  • flowlight さんの回答がシンプルで美しい
  • 他人様の 500 を勝手に解説するシリーズ
  • 左 B 右 W となるように境界線を定める。矛盾しないような境界線が何本ひけるか数える。
  • ただし、重複を数えないようにするため、境界線は下か左にしか曲がらないものとする。また、縦にまっすぐな境界線は除く。また、縦が1行しかない場合も除く。
  • カウントは DP で。dp[境界線の行][境界線の列][これまで(ここを含めて上の行全部)が真っ直ぐかどうか] == その行/列から始まるそれ以降の行の境界線の個数
  • これを90度ずつ回転させて4回行う
  • さらに全部 W か B にできるならそれぞれ 1 ずつ足す
  • これは思いつかないというか これで漏れ/重複がないかどうかもよくわからない
  • 境界線 → 解の構造からしてDPで求められる くらいは気づくべき

↓実装練習 (passed system test in practice room)

(...)
#define VS vector<string>
#define VI vector<ll>
#define VVI vector<vector<ll> >
#define VVVI vector<vector<vector<ll> > >
#define REP(i,n) for(int i=0,_n=(n);(i)<(int)_n;++i)
#define RANGE(i,a,b) for(int i=(int)a,_b=(int)(b);(i)<_b;++i)

#define MOD 1000000007LL

int W, H;
VS rot(const VS& g) {
	VS o(W, string(H, '?'));
	REP(y, H) REP(x, W) o[W-1-x][y] = g[y][x];
	return o;
}

VVVI dp;
ll f(int y, int splitx, int co, const VS& g) {
	if(y==H) return co;
	if(dp[y][splitx][co]!=-1) return dp[y][splitx][co];
	ll ans = 0;
	REP(ns, splitx+1) {
		int ok=1;
		RANGE(x, 0, ns) if(g[y][x]=='W') ok=0;
		RANGE(x, ns, W) if(g[y][x]=='B') ok=0;
		if(!ok) continue;
		ans += f(y+1, ns, co || (0<y && ns < splitx), g);
		ans %= MOD;
	}
	return dp[y][splitx][co]=ans;
}

ll all_(char notc, VS& g) {
	ll ok=1;
	REP(y, H) REP(x, W) if(g[y][x]==notc) ok=0;
	return ok;
}

class TwoConvexShapes {
	public:
	int countWays(vector <string> g) {
		W=g[0].size();
		H=g.size();
		ll ans = all_('B', g)+all_('W', g);
		REP(loop, 4) {
			W=g[0].size();
			H=g.size();
			dp = VVVI(H, VVI(W+1, VI(2, -1)));
			ll r = f(0, W, 0, g);
			cout<<r<<endl;
			ans += r;
			ans %= MOD;
			g = rot(g);
		}
		return ans;
	}
};

2012-08-17

SRM 552 Div1 250 FoxPaintingBalls

01:06 |  SRM 552 Div1 250 FoxPaintingBalls - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 552 Div1 250 FoxPaintingBalls - kojingharangの日記  SRM 552 Div1 250 FoxPaintingBalls - kojingharangの日記 のブックマークコメント

  • N段の三角形が無限にある。1つ1つはi段目にi個の球を置く形でビリヤードみたいになっている
  • 各球を赤緑青の三色どれかで塗る。接する球は同じ色には塗れない。
  • 赤緑青の色はそれぞれ R, G, B 回使える。
  • 全部が塗られた三角形は最大何個作れるか。
  • N≦10^9, R, G, B≦10^18
  • 1コの三角形について、1番上と(もしあれば)2番目の色を決めるとあとは全部一意に決まる。
  • その三角形で使う各色の回数 (a, b, c) を求めるのにしばらく苦労して謎の複雑な関数が完成
  • その回数(a, b, c)を赤緑青に最適に割り振って R, G, B を超えなければいい
  • 最適な割り振り方がわからず、謎の貪欲法でサンプルが通ったので提出
  • →failed system test
  • あとで
  • M = N(N+1)/2 として、(a, b, c) = (M/3, M/3, M/3 + M%3) となるらしい。(証明できず)
  • さらに解を仮定した2分探索をするらしい。
  • (そういえばこないだの高さを調整する問題も2分探索が思いつかなかったなぁ)
  • 解を mid として
  • どんな割り振り方でも最低 M/3 ずつは消費するので、R, G, B からそれぞれ mid * M/3 を引いて
  • 大丈夫なら、mid * M%3 の分を残りの R, G, B でまかなえるか判定する。

↓あとで (passed system test in practice room)

class FoxPaintingBalls {
	public:
	long long theMax(long long R, long long G, long long B, int N) {
		ll tot = (ll)N*(N+1)/2;
		ll to3 = tot/3;
		ll lo=0, hi=(R+G+B)/tot+1;
		while(lo+1<hi) {
			ll mid = (lo+hi)/2;
			ll r=R-mid*to3;
			ll g=G-mid*to3;
			ll b=B-mid*to3;
			//cout<<mid<<" "<<r<<" "<<g<<" "<<b<<endl;
			if(r>=0 && g>=0 && b>=0 && (tot%3 ? (mid <= (r+g+b)/(tot%3)) : 1)) lo=mid;
			else hi=mid;
		}
		return lo;
	}
};

SRM 552 Div1 500 FoxAndFlowerShopDivOne

01:06 |  SRM 552 Div1 500 FoxAndFlowerShopDivOne - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 552 Div1 500 FoxAndFlowerShopDivOne - kojingharangの日記  SRM 552 Div1 500 FoxAndFlowerShopDivOne - kojingharangの日記 のブックマークコメント

  • 残り 25 分くらい。
  • grid に L or P or . が入っている。
  • 2つの重ならない矩形内にて L の数(nL)と P の数(nP)の差が M 以内であるような最大の nL + nP を求める。
  • grid の最大サイズ 30x30, M≦900
  • 累積和を使ったとしても矩形1と矩形2をそれぞれ決めて判定すると 30^8 = 656*10^9 とかなのでだめ
  • わからんね
  • nL-nP ってそんなに種類ないからそれを使うんではないかと気づく
  • nL-nP でソートして lower/upper bound とか使うのか??
  • 終了
  • cafelier さんのをみると
  • 分割軸を決めて(W+H通り)
  • その左右or上下で全通り nL-nP, nL+nP を求めて
  • その際 nL-nP が同じなら nL+nP が最大のものだけ残せばいいので map に記録していって
  • 左右or上下から1コずつ全通りとってきて判定
  • 最大でも (W+H)*(2*W^2*H^2 + 2*WH) ということで O(W^5) 程度に収まる模様。
  • ↓実装練習 (passed system test in practice room)
class FoxAndFlowerShopDivOne {
	public:
	int theMaxFlowers(vector <string> F, int M) {
		int W=F[0].size();
		int H=F.size();
		
		// sum[y][x] is sum of [0, x) x [0, y)
		VVI sum(H+1, VI(W+1));
		VVI dif(H+1, VI(W+1));
		REP(x, W) REP(y, H) {
			sum[y+1][x+1] = (F[y][x]!='.' ? 1 : 0) + sum[y][x+1]+sum[y+1][x]-sum[y][x];
			dif[y+1][x+1] = (F[y][x]=='L' ? 1 : (F[y][x]=='P' ? -1 : 0)) + dif[y][x+1]+dif[y+1][x]-dif[y][x];
		}
		//cout<<sum<<endl;
		//cout<<dif<<endl;
		
		int ans = -1;
		REP(X, W) {
			map<int, int> hi0, hi1;
			// [0, X) x [0, H)
			for(int x0=0;x0<X;x0++) {
				for(int x1=x0;x1<X;x1++) {
					// [x0, x1] x [y0, y1]
					for(int y0=0;y0<H;y0++) {
						for(int y1=y0;y1<H;y1++) {
							int S = sum[y1+1][x1+1] - sum[y1+1][x0] - sum[y0][x1+1] + sum[y0][x0];
							int D = dif[y1+1][x1+1] - dif[y1+1][x0] - dif[y0][x1+1] + dif[y0][x0];
							hi0[D] = max(hi0[D], S);
							//cout<<MP(x0, MP(x1, MP(y0, y1)))<<" "<<S<<" "<<D<<endl;
						}
					}
				}
			}
			// [X, W) x [0, H)
			for(int x0=X;x0<W;x0++) {
				for(int x1=x0;x1<W;x1++) {
					// [x0, x1] x [y0, y1]
					for(int y0=0;y0<H;y0++) {
						for(int y1=y0;y1<H;y1++) {
							int S = sum[y1+1][x1+1] - sum[y1+1][x0] - sum[y0][x1+1] + sum[y0][x0];
							int D = dif[y1+1][x1+1] - dif[y1+1][x0] - dif[y0][x1+1] + dif[y0][x0];
							hi1[D] = max(hi1[D], S);
						}
					}
				}
			}
			FOR(e0, hi0) FOR(e1, hi1) if(abs(e0->first+e1->first)<=M) ans=max(ans, e0->second+e1->second);
		}
		
		REP(Y, H) {
			map<int, int> hi0, hi1;
			// [0, W) x [0, Y)
			for(int x0=0;x0<W;x0++) {
				for(int x1=x0;x1<W;x1++) {
					// [x0, x1] x [y0, y1]
					for(int y0=0;y0<Y;y0++) {
						for(int y1=y0;y1<Y;y1++) {
							int S = sum[y1+1][x1+1] - sum[y1+1][x0] - sum[y0][x1+1] + sum[y0][x0];
							int D = dif[y1+1][x1+1] - dif[y1+1][x0] - dif[y0][x1+1] + dif[y0][x0];
							hi0[D] = max(hi0[D], S);
						}
					}
				}
			}
			// [0, W) x [Y, H)
			for(int x0=0;x0<W;x0++) {
				for(int x1=x0;x1<W;x1++) {
					// [x0, x1] x [y0, y1]
					for(int y0=Y;y0<H;y0++) {
						for(int y1=y0;y1<H;y1++) {
							int S = sum[y1+1][x1+1] - sum[y1+1][x0] - sum[y0][x1+1] + sum[y0][x0];
							int D = dif[y1+1][x1+1] - dif[y1+1][x0] - dif[y0][x1+1] + dif[y0][x0];
							hi1[D] = max(hi1[D], S);
						}
					}
				}
			}
			FOR(e0, hi0) FOR(e1, hi1) if(abs(e0->first+e1->first)<=M) ans=max(ans, e0->second+e1->second);
		}
		return ans;
	}
};

2012-07-22

SRM 550 Div1 300 RotatingBot

11:55 |  SRM 550 Div1 300 RotatingBot - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 550 Div1 300 RotatingBot - kojingharangの日記  SRM 550 Div1 300 RotatingBot - kojingharangの日記 のブックマークコメント

  • ロボットが長方形の壁の中のどこかにいて、東を向いていて、壁かすでに訪れたとこに当たったら左に回転する。動けなくなったらおわり。
  • 連続して進んだ回数が配列 M で与えられるので、動いた範囲を含む長方形の面積の最小値をもとめる。ありえない場合は-1を返す
  • |M| in [1, 50], M の要素 in [1, 50]
  • |M|≦3のときは無矛盾。
  • |M|>3のときは M[0]~M[3] で壁の幅と高さが決まる。
  • (M[0]~M[3]が正しくないとするとそもそもいずれM[0]~M[3]の動き検証で矛盾になるので正しいとしていい)
  • 以降シミュレートして矛盾がないか確かめる。
  • 最後以外は止まった時目の前に既に訪れたフラグがないとだめ
  • challenge phase
  • n≧3 のときにM[0]≧M[2]なら矛盾としてるコードを見つけたので 10 6 3 的な無矛盾のテストを投げたところ失敗 -25
  • 実際のところ n>3 と書いてあって、投げる0.2秒くらい前にいや n>3 と書いてあるぞなんか変だぞと思ったが右人差し指を止めることはできなかった orz
  • チャレンジは焦るべからずってどっかに書いておこうかなw
  • passes system test
class RotatingBot {
	public:
	int minArea(vector <int> M) {
		ll N=M.size();
		if(N==1) return M[0]+1;
		if(N==2) return (M[0]+1)*(M[1]+1);
		if(N==3) return max(M[0]+1, M[2]+1)*(M[1]+1);
		ll W=max(M[0]+1, M[2]+1);
		ll H=max(M[1]+1, M[3]+1);
		ll sX = W-M[0]-1;
		ll sY = M[1];
		VVI w(H+2, VI(W+2));
		REP(x, W+2) w[0][x]=w[H+1][x]=1;
		REP(y, H+2) w[y][0]=w[y][W+1]=1;
		w[sY+1][sX+1]=1;
		int dx[4]={1,0,-1,0};
		int dy[4]={0,-1,0,1};
		REP(i, N) {
			int dir=i%4;
			REP(j, M[i]) {
				sX += dx[dir];
				sY += dy[dir];
				if(w[sY+1][sX+1]) return -1;
				w[sY+1][sX+1]=1;
			}
			if(i!=N-1 && w[sY+dy[dir]+1][sX+dx[dir]+1]==0) return -1;
		}
		return W*H;
	}
};

SRM 550 Div1 500 CheckerExpansion

11:55 |  SRM 550 Div1 500 CheckerExpansion - kojingharangの日記 を含むブックマーク はてなブックマーク -  SRM 550 Div1 500 CheckerExpansion - kojingharangの日記  SRM 550 Div1 500 CheckerExpansion - kojingharangの日記 のブックマークコメント

  • 残り47分ほど
  • シミュレートしてみてフラクタルっぽい
  • フラクタルで検索
  • いくつか名前が出たので全部クリック
  • 図からしてシェルピンスキーのギャスケットである
  • どうやって描くんだこれ
  • 超でかい三角形から始めて再帰的に分割しながら出力範囲に入ってる時だけ書き込んでいくのだろうか
  • BVH みたいに出力範囲と重ならない場合はそれ以上深掘りしなくてよくて出力範囲は充分小さいからそれでいけるんだと思う
  • カタカタカタカタ
  • おわり
  • あとで→ nCr とか偶奇とかそんな方法もあるらすぃ

see

http://d.hatena.ne.jp/kusano_prog/20120721/1342897977

2012-07-12

Codeforces Round #129 Div1 A - Little Elephant and Interval

22:48 |  Codeforces Round #129 Div1 A - Little Elephant and Interval - kojingharangの日記 を含むブックマーク はてなブックマーク -  Codeforces Round #129 Div1 A - Little Elephant and Interval - kojingharangの日記  Codeforces Round #129 Div1 A - Little Elephant and Interval - kojingharangの日記 のブックマークコメント

  • 整数 A, B が与えられる。A≦X≦B な整数 X で、X を10進表記したときに最初と最後の桁が同じものの個数を求める問題。
  • 1≦A, B≦10^18
  • 1~x の範囲で条件にあうものの個数を計算する f(x) を書いて f(B) - f(A-1) すればよさげ
  • 1桁ずつ見ていけばいいのでは
  • x が N 桁として N-1 桁以下のものは [1-9]???[1-9] の形なので簡単そう
  • N 桁のやつは最上位が x のやつ(これに大ハマリ)とそれ未満のやつに分けるかも
  • naive なリファレンスを書いて一致を確認するがどうにも合わない
  • 気づいたら90分...
  • リファレンスと高速版で 10000 まで一致してることを確認してるので提出後の精神状態は良好
  • Accepted
  • 上位陣は5分くらいの模様。簡潔なのが多いなぁ
ll ff(ll d) {
	if(d==0) return 0;
	if(d==1) return 1;
	ll ans=1;
	REP(i, d-2) ans*=10;
	return ans;
}

ll ref(ll v) {
	ll co=0;
	for(int i=1;i<=v;i++) {
		ll msd=i;
		while(msd/10>0) {msd/=10;}
		if(msd==i%10) co++;
	}
	return co;
}

ll f(ll v) {
	if(v<10) return ref(v);
	if(v==0) return 0;
	ll msd=v, co=0;
	while(msd/10>0) {msd/=10;co++;}
	ll msdd=msd;
	REP(i, co) msd*=10;
	ll t=v, di=0;
	while(t>0) {t/=10;di++;}
	ll X = 0;
	int xok=0;
	{
		ll mm = (v-msd)/10;
		while(msd+(mm*10+msdd) > v && mm > 0) {
			mm--;
		}
		X = msd+(mm*10+msdd);
		if(X<=v) xok = 1;
	}
	ll vv= xok ? (X-msd)/10 +1 : 0;
	ll lower=0;
	REP(i, di) lower += 9*ff(i);
	ll ans= vv+(msdd-1)*ff(di)+lower;
	return ans;
}

int main() {
	//REP(i, 10000) {
	//	ll ra=ref(i);
	//	ll fa=f(i);
	//	if(ra!=fa) {cout<<"ERR"<<i<<" "<<ra<<" "<<fa<<endl;return 0;}
	//}
	
	ll L,R;
	while(cin>>L>>R) {
		cout<<f(R)-f(L-1)<<endl;
	}
	
	return 0;
}

Codeforces Round #129 Div1 B - Little Elephant and Cards

22:48 |  Codeforces Round #129 Div1 B - Little Elephant and Cards - kojingharangの日記 を含むブックマーク はてなブックマーク -  Codeforces Round #129 Div1 B - Little Elephant and Cards - kojingharangの日記  Codeforces Round #129 Div1 B - Little Elephant and Cards - kojingharangの日記 のブックマークコメント

  • 10^5 個までの表を向いたカードがあって表裏にそれぞれ 10^9 までの整数が書いてある。
  • カードの半分以上が同じ数字になるようにするには最小で何枚ひっくり返せばいいか。
  • 半分以上揃う数字はせいぜい 4 つくらいしかない
  • map で出現個数を数えて、あてはまるものについて「全体の半分 - すでに表をむいてる枚数」の最小を求める。
  • 表裏同じ数字の場合は1回だけカウントするところで 1WA
  • 表の枚数も map で数えたが count(ALL(F), c) でも大丈夫だと思う
  • Accepted
#define INF (1LL<<60)

int main() {
	ll N;
	while(cin>>N) {
		ll half=(N+1)/2;
		map<ll, ll> hi;
		map<ll, ll> hiF;
		VI F(N), B(N);
		REP(i, N) {
			cin>>F[i]>>B[i];
			hi[F[i]]++;
			if(F[i]!=B[i]) hi[B[i]]++;
			hiF[F[i]]++;
		}
		//cout<<F<<B<<endl;
		//cout<<hi<<endl;
		VI cand;
		FOR(e, hi) {
			if(e->second >= half) cand.PB(e->first);
		}
		//cout<<cand<<endl;
		ll ans = INF;
		REP(i, cand.size()) {
			ll c = cand[i];
			//ll rest = half - count(ALL(F), c);
			ll rest = half - hiF[c];
			ans = min(ans, max(0LL, rest));
		}
		
		cout<<(cand.size() ? ans : -1LL)<<endl;
	}
	
	return 0;
}

2012-06-30

Codeforces Round #127 Div1 A - Clear Symmetry

10:39 |  Codeforces Round #127 Div1 A - Clear Symmetry - kojingharangの日記 を含むブックマーク はてなブックマーク -  Codeforces Round #127 Div1 A - Clear Symmetry - kojingharangの日記  Codeforces Round #127 Div1 A - Clear Symmetry - kojingharangの日記 のブックマークコメント

  • 1 が隣り合わない and 上下左右対称 and 1 の個数が X 個になるように 0 か 1 を NxN グリッドに入れたい。最小の N を求める問題。
  • X ≦ 100
  • X==2 とか配置できんの??と思ったけど真ん中の列の上下に置けばいいのか
  • 真ん中を含む左上の領域を考えて、そこに1を置いて上下左右対称になるように展開すると全体として何個1が増えるかを考える。
// N==3
42
21

4のとこに置くと以下のように1が4つになる
101
000
101

右上の2のとこに置くと以下のように1が2つになる
010
000
010

// N==4
44
44

// N==5
442
442
221
  • そこから 1 が隣り合わないように市松模様の黒のとこにある数字だけ抜き出す。X がその数字の和で表せたら OK。
  • 黒と白で2通り試しながら N を大きくしていくといつか終わる。
  • この抜き出し方でいい証明はできてない
// X==9 N==5 のばあい
 4 
4 2
 2 
→4 4 2 2 じゃ 9 にならないので skip

4 2
 4 
2 1
→4+4+1==9 なので N==5 で OK

// X==3 N==5 のばあい
 4 
4 2
 2 
→4 4 2 2 じゃ 3 にならないので skip

4 2
 4 
2 1
→2+1==3 なので N==5 で OK

  • Accepted
int main() {
	int X;
	
	while(cin>>X) {
		for(int n=1;;n++) {
			//cout<<n<<endl;
			{
				int x = X;
				int n4 = (n-1)*(n-1)/2;
				int n2 = ((n-1)/2 + ((n-1)&1))*2;
				int n1 = 0;
				//cout<<n4<<" "<<n2<<" "<<n1<<endl;
				while(n4-->0 && x>=4) x-=4;
				while(n2-->0 && x>=2) x-=2;
				while(n1-->0 && x>=1) x-=1;
				if(x==0) { cout<<2*n-1<<endl; break; }
			}
			{
				int x = X;
				int n4 = (n-1)*(n-1)/2 + ((n-1)*(n-1)&1);
				int n2 = (n-1)/2*2;
				int n1 = 1;
				//cout<<n4<<" "<<n2<<" "<<n1<<endl;
				while(n4-->0 && x>=4) x-=4;
				while(n2-->0 && x>=2) x-=2;
				while(n1-->0 && x>=1) x-=1;
				if(x==0) { cout<<2*n-1<<endl; break; }
			}
		}
	}
	
	return 0;
}

Codeforces Round #127 Div1 B - Guess That Car!

10:39 |  Codeforces Round #127 Div1 B - Guess That Car! - kojingharangの日記 を含むブックマーク はてなブックマーク -  Codeforces Round #127 Div1 B - Guess That Car! - kojingharangの日記  Codeforces Round #127 Div1 B - Guess That Car! - kojingharangの日記 のブックマークコメント

  • Σy Σx Cxy * ( (4x+2 - 4px)**2 + (4y+2 - 4py)**2 ) を最小にする 0≦px≦M, 0≦py≦N とその最小値を求める問題
  • M, N ≦1000
  • 縦横独立にできそう
  • Σy Σx Cxy * (4x+2 - 4px)**2 + Σy Σx Cxy * (4y+2 - 4py)**2
  • Σx (Σy Cxy) * (4x+2 - 4px)**2 + Σy (Σx Cxy) * (4y+2 - 4py)**2
  • (Σy Cxy) と (Σx Cxy) を予め求めておけば全 px に対して1項を計算して O(N^2) で最小値がわかる。py も同じ
  • Accepted
#define INF (1LL<<60)

int main() {
	int N, M;
	while(cin>>N>>M) {
		VVI w(N, VI(M));
		REP(y, N) REP(x, M) cin>>w[y][x];
		VI cx(M);
		REP(x, M) REP(y, N) cx[x] += w[y][x];
		VI cy(N);
		REP(y, N) REP(x, M) cy[y] += w[y][x];
		ll minxv = INF, minx = 10000;
		REP(px, M+1) {
			ll a=0;
			REP(x, M) {
				ll d = ( x*4+2 - px*4 );
				a += cx[x] * d * d;
			}
			if(a < minxv) { minxv = a; minx = px; }
		}
		ll minyv = INF, miny = 10000;
		REP(py, N+1) {
			ll a=0;
			REP(y, N) {
				ll d = ( y*4+2 - py*4 );
				a += cy[y] * d * d;
			}
			if(a < minyv) { minyv = a; miny = py; }
		}
		
		cout<<minxv+minyv<<endl;
		cout<<miny<<" "<<minx<<endl;
	}
	
	return 0;
}
|