TopCoder SRM 581 Div1 Easy SurveillanceSystem

問題

長さnの部屋が一直線上に並んでいる。
containers[i]はi番目の部屋にコンテナが置いてあるとき'X'で、そうでないときは'-'である。
監視カメラがいくつかあり、一つの監視カメラは連続するL個の部屋を監視している。


それぞれの監視カメラに写っているコンテナの数が与えられる。
複数の監視カメラが同じ部屋の集合を監視していることはない。(一つの部屋を複数の監視カメラが監視することはありえる)


各部屋について、

  • 一つ以上の監視カメラが監視していることが保証されている
  • どの監視カメラも監視していないことが保証されている
  • 上のどちらでもない

のどれであるかを出力せよ。

制約条件

n≦50
L≦n

方針

ソースコード

int n, m, L;
vi cnt, reports;

bool mustuse(int idx){
	
	int l = n - L + 1;
	int s = l + m, t = s + 1;
	
	flowGraph g(t + 1);
	
	rep(i, m){
		g.add(s, i, 1);
		rep(j, l) if(cnt[j] == reports[i]) g.add(i, j + m, 1);
	}
	rep(i, l){
		if(i <= idx && idx < i + L) continue;
		g.add(i + m, t, 1);
	}
	return g.max_flow(s, t) < m;
}
bool mustnotuse(int idx){
	
	int l = n - L + 1;
	int s = l + m, tt = s + 1, t = s + 2;
	
	flowGraph g(t + 1);
	
	rep(i, m){
		g.add(s, i, 1);
		rep(j, l) if(cnt[j] == reports[i]) g.add(i, j + m, 1);
	}
	rep(i, l){
		if(i <= idx && idx < i + L) g.add(i + m, t, 1);
		else g.add(i + m, tt, 1);
	}
	g.add(tt, t, m - 1);
	
	return g.max_flow(s, t) < m;
}

class SurveillanceSystem {
	public:
	string getContainerInfo(string containers, vector <int> reports, int L) {
		
		n = containers.size();
		m = reports.size();
		cnt.clear();
		::reports = reports;
		::L = L;
		string ans;
		
		rep(i, n - L + 1){
			int k = 0;
			rep(j, L) k += containers[i + j] == 'X';
			
			cnt.pb(k);
		}
		rep(i, n){
			if(mustuse(i)) ans.pb('+');
			else if(mustnotuse(i)) ans.pb('-');
			else ans.pb('?');
		}
		return ans;
	}
};