結果
| 問題 |
No.177 制作進行の宮森あおいです!
|
| コンテスト | |
| ユーザー |
evima
|
| 提出日時 | 2015-04-02 23:52:20 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 2,000 ms |
| コード長 | 2,768 bytes |
| コンパイル時間 | 1,558 ms |
| コンパイル使用メモリ | 169,640 KB |
| 実行使用メモリ | 7,040 KB |
| 最終ジャッジ日時 | 2024-07-04 01:28:43 |
| 合計ジャッジ時間 | 2,293 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 |
ソースコード
// Enjoy your stay.
#include <bits/stdc++.h>
#define long long long
#define LOOPVAR_TYPE long
#define all(x) (x).begin(), (x).end()
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
#define sz(x) ((LOOPVAR_TYPE)(x).size())
#define foreach(it, X) for(__typeof((X).begin()) it = (X).begin(); it != (X).end(); it++)
#define GET_MACRO(_1, _2, _3, NAME, ...) NAME
#define _rep(i, n) _rep2(i, 0, n)
#define _rep2(i, a, b) for(LOOPVAR_TYPE i = (LOOPVAR_TYPE)(a); i < (LOOPVAR_TYPE)(b); i++)
#define rep(...) GET_MACRO(__VA_ARGS__, _rep2, _rep)(__VA_ARGS__)
#define fir first
#define sec second
#define mp make_pair
#define mt make_tuple
#define pb push_back
const double EPS = 1e-9;
const double PI = acos(-1.0);
const long INF = 1070000000LL;
const long MOD = 1000000007LL;
using namespace std;
typedef istringstream iss;
typedef stringstream sst;
typedef pair<LOOPVAR_TYPE, LOOPVAR_TYPE> pi;
typedef vector<LOOPVAR_TYPE> vi;
const int MN = 100010;
struct dinic{
struct edge{
int to;long cap;int rev;
edge(int to,long cap,int rev): to(to),cap(cap),rev(rev){}
};
vector<edge> G[MN];
long level[MN];
int iter[MN];
void init(int N){
rep(i,N)G[i].clear();
}
void add_edge(int from,int to,long cap){
G[from].pb(edge(to,cap,sz(G[to])));
G[to].pb(edge(from,0,sz(G[from])-1));
}
void bfs(int s){
memset(level,-1,sizeof(level));
queue<int> que;
level[s]=0;
que.push(s);
while(!que.empty()){
int v=que.front(); que.pop();
rep(i,sz(G[v])){
edge &e = G[v][i];
if(e.cap>0 && level[e.to]<0){
level[e.to] = level[v]+1;
que.push(e.to);
}
}
}
}
long dfs(int v,int t,long f){
if(v==t)return f;
for(int &i=iter[v]; i<sz(G[v]); i++){
edge &e = G[v][i];
if(e.cap>0 && level[v] < level[e.to]){
long d=dfs(e.to,t,min(f,e.cap));
if(d>0){
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t){
long flow=0;
for(;;){
bfs(s);
if(level[t]<0)return flow;
memset(iter,0,sizeof(iter));
int f;
while((f=dfs(s,t,INF*INF))>0){
flow+=f;
}
}
}
};
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int W;
int N, M;
cin>>W>>N;
int J[55], C[55];
int Q[55], X[55][55];
rep(i,N)cin>>J[i];
cin>>M;
rep(i,M)cin>>C[i];
rep(i,M){
cin>>Q[i];
rep(j,Q[i])cin>>X[i][j],X[i][j]--;
}
dinic dnc;
dnc.init(N+M+2);
int s = N+M;
int t = s+1;
rep(i,N){
dnc.add_edge(s, i, J[i]);
}
rep(i,M){
dnc.add_edge(N+i, t, C[i]);
}
int ok[55][55];
rep(i,N)rep(j,M)ok[i][j] = 1;
rep(i,M){
rep(j,Q[i]){
ok[X[i][j]][i] = 0;
}
}
rep(i,N)rep(j,M){
if(ok[i][j]){
dnc.add_edge(i,N+j,INF);
}
}
cout<<(dnc.max_flow(s,t) >= W ? "SHIROBAKO" : "BANSAKUTSUKITA")<<endl;
}
evima