結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2015-09-24 19:18:34 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 100 ms / 2,000 ms |
コード長 | 4,292 bytes |
コンパイル時間 | 1,630 ms |
コンパイル使用メモリ | 175,960 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-19 09:03:44 |
合計ジャッジ時間 | 2,529 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
#define _CRT_SECURE_NO_WARNINGS// #define _GLIBCXX_DEBUG#include <bits/stdc++.h>using namespace std;typedef long long ll;// #define int lltypedef vector<int> vi;typedef vector<vi> vvi;typedef pair<int,int> pii;#define all(c) begin(c), end(c)#define range(i,a,b) for(ll i=a; i<ll(b); i++)#define rep(i,b) range(i,0,b)#define rangei(i,a,b) for(ll a=a;i<=ll(b);i++)#define repi(i,b) rangei(i,1,b)#define pb push_back#define eb emplace_back#define mp make_pair#define mt make_tupletemplate<class T> ostream & operator << (ostream &os, vector<T> const &);template<int n, class...T>typename enable_if<(n>=sizeof...(T))>::type_ot(ostream &, tuple<T...> const &){}template<int n, class...T>typename enable_if<(n< sizeof...(T))>::type_ot(ostream &os, tuple<T...> const &t){os << (n==0?"":" ") << get<n>(t); _ot<n+1>(os, t);}template<class...T>ostream & operator << (ostream &os, tuple<T...> const &t){_ot<0>(os, t); return os;}template<class T, class U>ostream & operator<<(ostream &os, pair<T,U> const &p){return os << "(" << p.first << ", " << p.second << ") ";}template<class T>ostream & operator<<(ostream &os, vector<T> const &v){rep(i,v.size()) os << v[i] << (i+1==(int)v.size()?"":" "); return os;}#ifdef DEBUG#define dump(...) (cerr << #__VA_ARGS__ << " = " << mt(__VA_ARGS__) \<< " [" << __LINE__ << "]" << endl)#else#define dump(...)#endifvoid fastios(){ios_base::sync_with_stdio(0);cin.tie(0);// #define endl '\n'}template<class T>size_t uniq(vector<T> &v){sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());return v.size();}template<class T>size_t uniq(T *l, size_t n){sort(l,l+n);return unique(l,l+n) - l;}#define mems(arr,val) memset(arr,val,sizeof(arr));int const mod = 1000000007;int const inf = numeric_limits<int>::max()/8;typedef int Capacity;struct Edge {int src, dst;Capacity cap;Edge(int src_, int dst_, int cap_) :src(src_), dst(dst_), cap(cap_) { }};typedef vector<Edge> Edges;typedef vector<Edges> Graph;typedef vector<int> Array;typedef vector<Array> Matrix;template<class Capacity = int> struct max_flow {typedef vector<vector<Capacity>> Matrix;size_t n;Matrix cap, flow;vector<bool> vis;Capacity res;max_flow(const int s, const int t, const Graph &g) : n(g.size()), cap(n, Array(n)), flow(n, Array(n)) {for(size_t i = 0; i < g.size(); i++){for(size_t j = 0; j < g[i].size(); j++){int u = g[i][j].src, v = g[i][j].dst;Capacity c = g[i][j].cap;cap[u][v] = cap[v][u] = flow[v][u] = c;}}res = solve(s, t);}Capacity augment(const int v, const int t, Capacity lim){vis[v] = true;if(v == t) return lim;for(size_t i = 0; i < n; i++){assert(flow[i][v] <= cap[i][v]);assert(flow[v][i] <= cap[v][i]);assert(flow[i][v] + flow[v][i] == cap[i][v]);if(vis[i] || cap[v][i] <= flow[v][i]) continue;Capacity f = augment(i, t, min(lim, cap[v][i] - flow[v][i]));flow[v][i] += f, flow[i][v] -= f;if(f) return f;}return 0;}Capacity solve(const int s, const int t){Capacity res = 0, f = -1;while(f) vis.assign(n,false), res += (f = augment(s,t,inf));return res;}};ll W,N;ll J[60];ll M;ll C[60];bool ok[60][60];int main(){while(cin >> W){cin >> N;rep(i,N) cin >> J[i];cin >> M;rep(i,M) cin >> C[i];rep(i,N)rep(j,M) ok[i][j] = true;rep(i,M){int Q; cin >> Q;rep(j,Q){int X; cin >> X;X--;ok[X][i] = false;}}int S = N+M, T = N+M+1;Graph g(N+M+2);rep(i,N){g[S].eb(S,i,J[i]);}rep(i,N)rep(j,M){if(ok[i][j]){g[i].eb(i,N+j,min(J[i],C[j]));}}rep(i,M){g[i+N].eb(i+N,T,C[i]);}ll f = max_flow<>(S,T,g).res;dump(f);puts(f >= W ? "SHIROBAKO" : "BANSAKUTSUKITA");}}