結果
問題 | No.2114 01 Matching |
ユーザー |
|
提出日時 | 2022-10-29 02:51:43 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 7,105 bytes |
コンパイル時間 | 3,737 ms |
コンパイル使用メモリ | 246,568 KB |
実行使用メモリ | 46,276 KB |
最終ジャッジ日時 | 2024-07-06 05:06:57 |
合計ジャッジ時間 | 12,475 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 45 WA * 6 |
ソースコード
#ifndef HIDDEN_IN_VS // 折りたたみ用// 警告の抑制#define _CRT_SECURE_NO_WARNINGS// ライブラリの読み込み#include <bits/stdc++.h>using namespace std;// 型名の短縮using ll = long long; // -2^63 ~ 2^63 = 9 * 10^18(int は -2^31 ~ 2^31 = 2 * 10^9)using pii = pair<int, int>; using pll = pair<ll, ll>; using pil = pair<int, ll>; using pli = pair<ll, int>;using vi = vector<int>; using vvi = vector<vi>; using vvvi = vector<vvi>;using vl = vector<ll>; using vvl = vector<vl>; using vvvl = vector<vvl>;using vb = vector<bool>; using vvb = vector<vb>; using vvvb = vector<vvb>;using vc = vector<char>; using vvc = vector<vc>; using vvvc = vector<vvc>;using vd = vector<double>; using vvd = vector<vd>; using vvvd = vector<vvd>;template <class T> using priority_queue_rev = priority_queue<T, vector<T>, greater<T>>;using Graph = vvi;// 定数の定義const double PI = acos(-1);const vi DX = { 1, 0, -1, 0 }; // 4 近傍(下,右,上,左)const vi DY = { 0, 1, 0, -1 };int INF = 1001001001; ll INFL = 4004004004004004004LL;double EPS = 1e-12;// 入出力高速化struct fast_io { fast_io() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(18); } } fastIOtmp;// 汎用マクロの定義#define all(a) (a).begin(), (a).end()#define sz(x) ((int)(x).size())#define lbpos(a, x) (int)distance((a).begin(), std::lower_bound(all(a), x))#define ubpos(a, x) (int)distance((a).begin(), std::upper_bound(all(a), x))#define Yes(b) {cout << ((b) ? "Yes\n" : "No\n");}#define rep(i, n) for(int i = 0, i##_len = int(n); i < i##_len; ++i) // 0 から n-1 まで昇順#define repi(i, s, t) for(int i = int(s), i##_end = int(t); i <= i##_end; ++i) // s から t まで昇順#define repir(i, s, t) for(int i = int(s), i##_end = int(t); i >= i##_end; --i) // s から t まで降順#define repe(v, a) for(const auto& v : (a)) // a の全要素(変更不可能)#define repea(v, a) for(auto& v : (a)) // a の全要素(変更可能)#define repb(set, d) for(int set = 0; set < (1 << int(d)); ++set) // d ビット全探索(昇順)#define repp(a) sort(all(a)); for(bool a##_perm = true; a##_perm; a##_perm = next_permutation(all(a))) // a の順列全て(昇順)#define smod(n, m) ((((n) % (m)) + (m)) % (m)) // 非負mod#define uniq(a) {sort(all(a)); (a).erase(unique(all(a)), (a).end());} // 重複除去#define EXIT(a) {cout << (a) << endl; exit(0);} // 強制終了// 汎用関数の定義template <class T> inline ll pow(T n, int k) { ll v = 1; rep(i, k) v *= n; return v; }template <class T> inline bool chmax(T& M, const T& x) { if (M < x) { M = x; return true; } return false; } // 最大値を更新(更新されたら trueを返す)template <class T> inline bool chmin(T& m, const T& x) { if (m > x) { m = x; return true; } return false; } // 最小値を更新(更新されたら trueを返す)// 演算子オーバーロードtemplate <class T, class U> inline istream& operator>>(istream& is, pair<T, U>& p) { is >> p.first >> p.second; return is; }template <class T> inline istream& operator>>(istream& is, vector<T>& v) { repea(x, v) is >> x; return is; }template <class T> inline vector<T>& operator--(vector<T>& v) { repea(x, v) --x; return v; }template <class T> inline vector<T>& operator++(vector<T>& v) { repea(x, v) ++x; return v; }// 手元環境(Visual Studio)#ifdef _MSC_VER#include "local.hpp"// 提出用(gcc)#elseinline int popcount(int n) { return __builtin_popcount(n); }inline int popcount(ll n) { return __builtin_popcountll(n); }inline int lsb(int n) { return n != 0 ? __builtin_ctz(n) : -1; }inline int lsb(ll n) { return n != 0 ? __builtin_ctzll(n) : -1; }inline int msb(int n) { return n != 0 ? (31 - __builtin_clz(n)) : -1; }inline int msb(ll n) { return n != 0 ? (63 - __builtin_clzll(n)) : -1; }#define gcd __gcd#define dump(...)#define dumpel(v)#define dump_list(v)#define input_from_file(f)#define output_to_file(f)#define Assert(b) { if (!(b)) while (1) cout << "OLE"; }#endif#endif // 折りたたみ用//--------------AtCoder 専用--------------#include <atcoder/all>using namespace atcoder;//using mint = modint1000000007;using mint = modint998244353;//using mint = modint; // mint::set_mod(m);istream& operator>>(istream& is, mint& x) { ll x_; is >> x_; x = x_; return is; }ostream& operator<<(ostream& os, const mint& x) { os << x.val(); return os; }using vm = vector<mint>; using vvm = vector<vm>; using vvvm = vector<vvm>;//----------------------------------------ll TLE(int n, int m, ll k, vl a, vl b) {unordered_map<ll, vector<pil>> r_to_tq;rep(i, n) r_to_tq[a[i] % k].push_back({ 0, a[i] / k });rep(j, m) r_to_tq[b[j] % k].push_back({ 1, b[j] / k });dump(r_to_tq);ll res = 0;bool a_greater = false, b_greater = false;repe(tmp, r_to_tq) {vl a, b;repe(tq, tmp.second) {int t; ll q;tie(t, q) = tq;if (t == 0) a.push_back(q);else b.push_back(q);}sort(all(a));sort(all(b));if (sz(a) > sz(b)) a_greater = true;else if (sz(a) < sz(b)) {b_greater = true;swap(a, b);}// n >= m;int n = sz(a), m = sz(b);dump(a); dump(b);// dp_i[j] : a[0..i) の中の j 個と b[0..j) をマッチさせる最小コストvl dp(m + 1, INFL);dp[0] = 0;dump(dp);rep(i, n) {repir(j, m, 1) {chmin(dp[j], dp[j - 1] + abs(a[i] - b[j - 1]));}dump(dp);}res += dp[m];}if (a_greater && b_greater) return -1;return res;}/*10 12 13 14 14 15 16 16 17 1851 53 54 57 590 999 999 999 999 9990 41 999 999 999 9990 39 82 999 999 9990 38 79 123 999 9990 37 77 119 166 9990 37 76 117 162 2110 36 75 115 159 2060 35 73 113 156 2020 35 72 111 154 1990 34 71 109 151 1960 33 69 107 148 192192*/ll solve(int n, int m, ll k, vl a, vl b) {unordered_map<ll, vector<pil>> r_to_tq;rep(i, n) r_to_tq[a[i] % k].push_back({ 0, a[i] / k });rep(j, m) r_to_tq[b[j] % k].push_back({ 1, b[j] / k });dump(r_to_tq);ll res = 0;bool a_greater = false, b_greater = false;repe(tmp, r_to_tq) {vl a, b;repe(tq, tmp.second) {int t; ll q;tie(t, q) = tq;if (t == 0) a.push_back(q);else b.push_back(q);}sort(all(a));sort(all(b));if (sz(a) > sz(b)) a_greater = true;else if (sz(a) < sz(b)) {b_greater = true;swap(a, b);}// n >= m;int n = sz(a), m = sz(b);dump(a); dump(b);// dp_i[j] : a[0..i) の中の j 個と b[0..j) をマッチさせる最小コストvl dp(m + 1, INFL);dp[0] = 0;dump(dp);rep(i, n) {int j0 = lbpos(b, a[i]);chmin(j0, i);chmax(j0, m - (n - i));repir(j, min(j0 + 20, m), max(j0 - 20, 1)) {chmin(dp[j], dp[j - 1] + abs(a[i] - b[j - 1]));}dump(dp);}res += dp[m];}if (a_greater && b_greater) return -1;return res;}int main() {// input_from_file("input.txt");// output_to_file("output.txt");int n, m; ll k;cin >> n >> m >> k;vl a(n), b(m);cin >> a >> b;// INFL = 999; dump(TLE(n, m, k, a, b));cout << solve(n, m, k, a, b) << endl;}