結果
| 問題 | No.177 制作進行の宮森あおいです! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-11-05 02:08:45 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 2 ms / 2,000 ms |
| + 312µs | |
| コード長 | 2,247 bytes |
| 記録 | |
| コンパイル時間 | 4,201 ms |
| コンパイル使用メモリ | 215,084 KB |
| 実行使用メモリ | 9,904 KB |
| 最終ジャッジ日時 | 2026-11-05 02:08:58 |
| 合計ジャッジ時間 | 4,795 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 |
ソースコード
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
using ll = long long;
struct Dinic{
struct Edge{
int to; //行き先
ll cap; //容量
int rev; //逆辺のindex
Edge(int to, ll cap, int rev):to(to), cap(cap), rev(rev){}
};
int n;
vector<vector<Edge>> graph;
vector<int> level, iter;
Dinic(int n): n(n), graph(n), level(n), iter(n) {}
void addEdge(int u, int v, ll cap){
graph[u].emplace_back(v, cap, graph[v].size());
graph[v].emplace_back(u, 0, (int)graph[u].size()-1);
}
void bfs(int st){
fill(level.begin(), level.end(), -1);
queue<int> p;
p.push(st);
level[st]=0;
while(p.size()){
int idx=p.front(); p.pop();
for(auto& e:graph[idx]){
if(e.cap>0&&level[e.to]<0){
level[e.to]=level[idx]+1;
p.emplace(e.to);
}
}
}
}
ll dfs(int from, int to, ll flow){
if(from==to) return flow;
for(int &i=iter[from]; i<graph[from].size(); i++){
auto& e=graph[from][i];
if(e.cap>0&&level[e.to]==level[from]+1){
ll d=dfs(e.to, to, min(flow, e.cap));
if(d>0){
e.cap-=d;
graph[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
//O(V^2E) 二部マッチングならO((V+E)sqrt(V))
ll maxFlow(int st, int to){
ll flow=0, inf=1e18;
while(1){
bfs(st);
if(level[to]<0) break;
fill(iter.begin(), iter.end(), 0);
ll f;
while(1){
ll f=dfs(st, to, inf);
if(f==0) break;
flow+=f;
}
}
return flow;
}
};
int main(void){
int w, n; cin >> w >> n;
vector<int> j(n);
for(auto&x:j) cin >> x;
int m; cin >> m;
vector<int> c(m);
for(auto&x:c) cin >> x;
vector ng(n, vector<int>(m));
for(int i=0; i<m; i++){
int q; cin >> q;
while(q--){
int x; cin >> x; x--;
ng[x][i]=1;
}
}
Dinic din(n+m+2);
for(int i=0; i<n; i++) din.addEdge(n+m, i, j[i]);
for(int i=0; i<m; i++) din.addEdge(n+i, n+m+1, c[i]);
for(int i=0; i<n; i++)for(int j=0; j<m; j++)if(ng[i][j]==0){
din.addEdge(i, n+j, w);
}
int x=din.maxFlow(n+m, n+m+1);
cout << (x>=w?"SHIROBAKO":"BANSAKUTSUKITA") << endl;
return 0;
}