結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
|
提出日時 | 2023-09-18 18:09:11 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 9,956 bytes |
コンパイル時間 | 2,892 ms |
コンパイル使用メモリ | 221,380 KB |
最終ジャッジ日時 | 2025-02-16 23:23:59 |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
コンパイルメッセージ
main.cpp: In function ‘void scan(int&)’: main.cpp:59:25: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 59 | void scan(int& a){ scanf("%d", &a); } | ~~~~~^~~~~~~~~~ main.cpp: In function ‘void scan(unsigned int&)’: main.cpp:60:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 60 | void scan(unsigned& a){ scanf("%u", &a); } | ~~~~~^~~~~~~~~~ main.cpp: In function ‘void scan(long long int&)’: main.cpp:61:31: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 61 | void scan(long long& a){ scanf("%lld", &a); } | ~~~~~^~~~~~~~~~~~ main.cpp: In function ‘void scan(long long unsigned int&)’: main.cpp:62:40: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 62 | void scan(unsigned long long& a){ scanf("%llu", &a); } | ~~~~~^~~~~~~~~~~~ main.cpp: In function ‘void scan(float&)’: main.cpp:64:27: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 64 | void scan(float& a){ scanf("%f", &a); } | ~~~~~^~~~~~~~~~ main.cpp: In function ‘void scan(double&)’: main.cpp:65:28: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 65 | void scan(double& a){ scanf("%lf", &a); } | ~~~~~^~~~~~~~~~~ main.cpp: In function ‘void scan(long double&)’: main.cpp:66:33: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;using ld = long double;using ull = unsigned long long;using uint = unsigned int;using pii = pair<int, int>;using pll = pair<ll, ll>;using pdd = pair<double, double>;using tuplis = array<ll, 3>;template<class T> using pq = priority_queue<T, vector<T>, greater<T>>;const int INF = 0x3fffffff;const ll MINF = 0x7fffffffffff;const ll LINF = 0x1fffffffffffffff;const ld DINF = numeric_limits<ld>::infinity();const int MOD = 1000000007;const int MODD = 998244353;const ld EPS = 1e-9;const ld PI = 3.1415926535897932;const ll four[] = {0, 1, 0, -1, 0};const ll eight[] = {0, 1, 1, 0, -1, -1, 1, -1, 0};#define overload4(_1, _2, _3, _4, name, ...) name#define rep1(n) for(ll i = 0; i < (n); ++i)#define rep2(i, n) for(ll i = 0; i < (n); ++i)#define rep3(i, a, b) for(ll i = (a); i < (b); ++i)#define rep4(i, a, b, c) for(ll i = (a); i < (b); i += (c))#define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)#define rrep1(n) for(ll i = (n); i --> 0; )#define rrep2(i, n) for(ll i = (n); i --> 0; )#define rrep3(i, a, b) for(ll i = (b); i --> (a); )#define rrep4(i, a, b, c) for(ll i = (b); (i -= (c)) >= (a); )#define rrep(...) overload4(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)#define each(i,...) for(auto&& i:__VA_ARGS__)#define all(...) begin(__VA_ARGS__), end(__VA_ARGS__)#define vec(type,name,...) vector<type> name(__VA_ARGS__)#define vv(type,name,h,...) vector<vector<type>>name(h,vector<type>(__VA_ARGS__))#define vvv(type,name,h,w,...) vector<vector<vector<type>>>name(h,vector<vector<type>>(w,vector<type>(__VA_ARGS__)))#define INT(...) int __VA_ARGS__; in(__VA_ARGS__)#define LL(...) ll __VA_ARGS__; in(__VA_ARGS__)#define ULL(...) ull __VA_ARGS__; in(__VA_ARGS__)#define STR(...) string __VA_ARGS__; in(__VA_ARGS__)#define CHR(...) char __VA_ARGS__; in(__VA_ARGS__)#define DBL(...) double __VA_ARGS__; in(__VA_ARGS__)#define LD(...) ld __VA_ARGS__; in(__VA_ARGS__)#define VEC(type,name,size) vector<type> name(size); in(name)#define VV(type, name, h, w) vector<vector<type>> name(h, vector<type>(w)); in(name)template<class T> bool chmin(T &a, const T &b){ if(a > b){ a = b; return 1; } else return 0; }template<class T> bool chmax(T &a, const T &b){ if(a < b){ a = b; return 1; } else return 0; }template<class T> ll sum(const T& a){ return accumulate(all(a), 0LL); }template<class T> ld dsum(const T& a){ return accumulate(all(a), 0.0L); }template<class T> auto min(const T& a){ return *min_element(all(a)); }template<class T> auto max(const T& a){ return *max_element(all(a)); }ll gcd(ll a, ll b){ while(b){ ll c = b; b = a % b; a = c; } return abs(a); }ll lcm(ll a, ll b){ if(!a || !b) return 0; return a * b / gcd(a, b); }ll intpow(ll a, ll b){ ll ans = 1; while(b){ if(b & 1) ans *= a; a *= a; b /= 2; } return ans; }vector<pll> factor(ll x){ vector<pll> ans; for(ll i = 2; i * i <= x; i++) if(x % i == 0){ ans.push_back({i, 1}); while((x /= i) % i == 0) ans.back().second++; } if(x != 1) ans.push_back({x, 1}); return ans; }vector<ll> divisor(ll x){ vector<ll> ans; for(ll i = 1; i * i <= x; i++) if(x % i == 0) ans.push_back(i); rrep(ans.size() - (ans.back() * ans.back()== x)) ans.push_back(x / ans[i]); return ans; }int scan(){ return getchar(); }void scan(int& a){ scanf("%d", &a); }void scan(unsigned& a){ scanf("%u", &a); }void scan(long long& a){ scanf("%lld", &a); }void scan(unsigned long long& a){ scanf("%llu", &a); }void scan(char& a){ do{ a = getchar(); }while(a == ' ' || a == '\n'); }void scan(float& a){ scanf("%f", &a); }void scan(double& a){ scanf("%lf", &a); }void scan(long double& a){ scanf("%Lf", &a); }void scan(vector<bool>& a){ for(unsigned i = 0; i < a.size(); i++) { int b; scan(b); a[i] = b; } }void scan(char a[]){ scanf("%s", a); }void scan(string& a){ cin >> a; }template<class T> void scan(vector<T>&);template<class T> void scan(deque<T>&);template<class T, size_t size> void scan(array<T, size>&);template<class T, class L> void scan(pair<T, L>&);template<class T, size_t size> void scan(T(&)[size]);template<class T> void scan(vector<T>& a){ for(auto& i : a) scan(i); }template<class T> void scan(deque<T>& a){ for(auto& i : a) scan(i); }template<class T, size_t size> void scan(array<T, size>& a){ for(auto& i : a) scan(i); }template<class T, class L> void scan(pair<T, L>& p){ scan(p.first); scan(p.second); }template<class T, size_t size> void scan(T (&a)[size]){ for(auto& i : a) scan(i); }template<class T> void scan(T& a){ cin >> a; }void in(){}template <class Head, class... Tail> void in(Head& head, Tail&... tail){ scan(head); in(tail...); }void print(){ putchar(' '); }void print(bool a){ printf("%d", a); }void print(int a){ printf("%d", a); }void print(unsigned a){ printf("%u", a); }void print(long long a){ printf("%lld", a); }void print(unsigned long long a){ printf("%llu", a); }void print(char a){ printf("%c", a); }void print(char a[]){ printf("%s", a); } //void print(float a){ printf("%.15f", a); }void print(double a){ printf("%.15f", a); }void print(long double a){ printf("%.15Lf", a); }void print(const string& a){ for(auto&& i : a) print(i); }template<class T> void print(const vector<T>&);template<class T, size_t size> void print(const array<T, size>&);template<class T, class L> void print(const pair<T, L>& p);template<class T, size_t size> void print(const T (&)[size]);template<class T> void print(const vector<T>& a){ if(a.empty()) return; print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ putchar(' '); print(*i); } }template<class T> void print(const deque<T>& a){ if(a.empty()) return; print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ putchar(' '); print(*i); } }template<class T, size_t size> void print(const array<T, size>& a){ print(a[0]); for(auto i = a.begin(); ++i != a.end(); ){ putchar(' '); print(*i);} }template<class T, class L> void print(const pair<T, L>& p){ print(p.first); putchar(' '); print(p.second); }template<size_t size> void print(const char (&a)[size]){ for(auto&& i : a) if(i!=EOF)print(i); } //template<class T, size_t size> void print(const T (&a)[size]){ print(a[0]); for(auto i = a; ++i != end(a); ){ putchar(' '); print(*i); } }template<class T> void print(const T& a){ cout << a; }int out(){ putchar('\n'); return 0; }template<class T> int out(const T& t){ print(t); putchar('\n'); return 0; }template<class Head, class... Tail> int out(const Head& head, const Tail&... tail){ print(head); putchar(' '); out(tail...); return 0; }int first(bool i = true){ return out(i?"first":"second"); }int yes(bool i = true){ return out(i?"yes":"no"); }int Yes(bool i = true){ return out(i?"Yes":"No"); }int No(){ return out("No"); }int YES(bool i = true){ return out(i?"YES":"NO"); }int NO(){ return out("NO"); }int Yay(bool i = true){ return out(i?"Yay!":":("); }int possible(bool i = true){ return out(i?"possible":"impossible"); }int Possible(bool i = true){ return out(i?"Possible":"Impossible"); }int POSSIBLE(bool i = true){ return out(i?"POSSIBLE":"IMPOSSIBLE"); }void Case(ll i){ printf("Case #%lld: ", i); }struct Graph {struct Edge {int rev, from, to, cap;Edge(int r, int f, int t, int c) : rev(r), from(f), to(t), cap(c) {}};vector<vector<Edge>> list;Graph(int N) : list(N) {}size_t size() {return list.size();}vector<Edge>& operator [] (int i) {return list[i];}Edge& redge(const Edge& e) {return list[e.to][e.rev];}void run_flow(Edge& e, int f) {e.cap -= f;redge(e).cap += f;}void addedge(int from, int to, int cap) {int fromrev = (int)list[from].size();int torev = (int)list[to].size();list[from].push_back(Edge(torev, from, to, cap));list[to].push_back(Edge(fromrev, to, from, 0));}void addedge2(int from, int to, int cap) {int fromrev = (int)list[from].size();int torev = (int)list[to].size();list[from].push_back(Edge(torev, from, to, cap));list[to].push_back(Edge(fromrev, to, from, cap));}};struct Dinic {static const int INF = 1 << 30;vector<int> seen, level;Dinic() {}void dibfs(Graph& G, int s) {level.assign((int)G.size(), -1);queue<int> que;level[s] = 0;que.push(s);while (!que.empty()) {int v = que.front(); que.pop();for (auto& e : G[v]) {if (e.cap > 0 && level[e.to] < 0) {level[e.to] = level[v] + 1;que.push(e.to);}}}}int didfs(Graph& G, int v, int t, int f) {if (v == t) return f;seen[v] = true;for (auto& e : G[v]) {if (seen[e.to]) continue;if (e.cap > 0 && level[v] < level[e.to]) {int flow = didfs(G, e.to, t, min(f, e.cap));if (flow == 0) continue;G.run_flow(e, flow);return flow;}}return 0;}int solve(Graph& G, int s, int t) {int res = 0;while (true) {dibfs(G, s);if (level[t] < 0) return res;seen.assign((int)G.size(), false);int flow;while ((flow = didfs(G, s, t, INF)) > 0) {res += flow;}}return res;}};int main() {INT(W,N);VEC(int,J,N);INT(M);VEC(int,C,M);Graph G(N+M+2);rep(i,N) G.addedge(N+M,i,J[i]);rep(i,M) G.addedge(N+i,N+M+1,C[i]);rep(i,M) {INT(Q);set<int> s;rep(j,N) s.insert(j);rep(Q) {INT(X); X--;s.erase(X);}each(x,s) {G.addedge(x,N+i,INF);}}out(Dinic().solve(G,N+M,N+M+1)>=W ? "SHIROBAKO" : "BANSAKUTSUKITA");}