結果
問題 | No.200 カードファイト! |
ユーザー |
![]() |
提出日時 | 2022-03-25 18:37:41 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,336 bytes |
コンパイル時間 | 1,989 ms |
コンパイル使用メモリ | 145,848 KB |
実行使用メモリ | 9,984 KB |
最終ジャッジ日時 | 2024-10-14 03:03:40 |
合計ジャッジ時間 | 3,036 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 WA * 5 |
ソースコード
#include <cassert>#include <cmath>#include <algorithm>#include <iostream>#include <iomanip>#include <limits.h>#include <map>#include <queue>#include <set>#include <string.h>#include <vector>using namespace std;typedef long long ll;const int MAX_V = 200010;const ll INF = LLONG_MAX;typedef pair<ll, int> P;int V;struct Edge {int to;ll cap;ll cost;int rev;Edge(int to = -1, ll cap = -1, ll cost = -1, int rev = -1) {this->to = to;this->cap = cap;this->cost = cost;this->rev = rev;}};ll h[MAX_V];ll dist[MAX_V];int prevv[MAX_V];int preve[MAX_V];vector <Edge> G[MAX_V];class MinCostFlow {public:int V;MinCostFlow(int V) {this->V = V;}void add_edge(int from, int to, ll cap, ll cost) {G[from].push_back(Edge(to, cap, cost, G[to].size()));G[to].push_back(Edge(from, 0, -cost, G[from].size() - 1));}ll min_cost_flow(int s, int t, ll flow_limit) {ll f = 0;ll totalCost = 0;fill(h, h + MAX_V, 0);while (f < flow_limit) {// fprintf(stderr, "f: %lld, limit: %lld\n", f, flow_limit);priority_queue<P, vector<P>, greater<P>> pque;fill(dist, dist + V, INF);dist[s] = 0;pque.push(P(0, s));while (!pque.empty()) {P p = pque.top();pque.pop();int v = p.second;if (dist[v] < p.first) continue;for (int i = 0; i < (int) G[v].size(); ++i) {Edge *edge = &G[v][i];if (edge->cap <= 0) continue;ll cost = edge->cost + h[v] - h[edge->to];if (dist[edge->to] - dist[v] > cost) {dist[edge->to] = dist[v] + cost;prevv[edge->to] = v;preve[edge->to] = i;pque.push(P(dist[edge->to], edge->to));}}}if (dist[t] == INF) {return -1;}for (int v = 0; v < V; ++v) {h[v] += dist[v];}ll c = flow_limit - f;for (int v = t; v != s; v = prevv[v]) {c = min(c, G[prevv[v]][preve[v]].cap);}f += c;totalCost += c * h[t];// fprintf(stderr, "h[s]: %d, h[t]: %d, cost: %d, prev_cost: %d\n", h[s], h[t], cost, prev_cost);for (int v = t; v != s; v = prevv[v]) {Edge *edge = &G[prevv[v]][preve[v]];edge->cap -= c;G[v][edge->rev].cap += c;}}return totalCost;}};int main() {int N;cin >> N;int A;cin >> A;vector<int> B(A);for (int i = 0; i < A; ++i) {cin >> B[i];}int C;cin >> C;vector<int> D(C);for (int i = 0; i < C; ++i) {cin >> D[i];}sort(B.begin(), B.end(), greater<int>());sort(D.begin(), D.end());V = 2 * N + 2;MinCostFlow mcf(V);int s = 2 * N;int t = 2 * N + 1;vector<int> cards_A;vector<int> cards_C;for (int i = 0; i < N; ++i) {int b = B[i % A];int d = D[i % C];cards_A.push_back(b);cards_C.push_back(d);mcf.add_edge(s, i, 1, 0);mcf.add_edge(i + N, t, 1, 0);}for (int i = 0; i < N; ++i) {int a = cards_A[i];for (int j = 0; j < N; ++j) {int b = cards_C[j];if (a > b) {mcf.add_edge(i, j + N, 1, 0);} else {mcf.add_edge(i, j + N, 1, 1);}}}cout << N - mcf.min_cost_flow(s, t, N) << endl;return 0;}