結果
問題 | No.2743 Twisted Lattice |
ユーザー | kenken714 |
提出日時 | 2024-04-18 14:44:01 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,243 ms / 3,000 ms |
コード長 | 2,112 bytes |
コンパイル時間 | 2,994 ms |
コンパイル使用メモリ | 238,528 KB |
実行使用メモリ | 67,320 KB |
最終ジャッジ日時 | 2024-10-10 07:59:44 |
合計ジャッジ時間 | 15,144 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 8 |
ソースコード
#include "bits/stdc++.h" using namespace std; #define REP(i, n) for(ll i = 0;i < n;i++) #define REPR(i, n) for(ll i = n;i >= 0;i--) #define FOR(i, m, n) for(ll i = m;i < n;i++) #define FORR(i, m, n) for(ll i = m;i >= n;i--) #define REPO(i, n) for(ll i = 1;i <= n;i++) #define ll long long #define INF (ll)1ll << 60 #define MINF (-1 * INF) #define ALL(n) n.begin(),n.end() #define MOD (ll)1000000007 #define P pair<ll, ll> vector<P> v; map<ll, ll> to, fr; map<P, ll> pos; vector<ll> g[210000], ans(210000, INF); priority_queue<P, vector<P>, greater<P>> qf, qb; int main(){ ll h, w, n; cin >> h >> w >> n; REP(i, n){ ll a, b; cin >> a >> b; v.push_back(P(b, a)); fr[b]++; pos[P(b, a)] = i; } ll itr = 0; for (auto& i : fr) { to[itr] = i.first; i.second = itr; itr++; } sort(ALL(v)); REP(i, n) g[fr[v[i].first]].push_back(v[i].second); REP(i, 210000) sort(ALL(g[i])); REP(i, n) qb.push(P(v[i].second - 1 + v[i].first, fr[v[i].first])); REP(i, n){ ll row = fr[v[i].first]; //おなじれつ auto it = lower_bound(ALL(g[row]), v[i].second); if (it != g[row].begin()) ans[pos[v[i]]] = min(ans[pos[v[i]]], abs(*(it - 1) - v[i].second)); if (it + 1 != g[row].end()) ans[pos[v[i]]] = min(ans[pos[v[i]]], abs(*(it + 1) - v[i].second)); //となりれつ if (row >= 0 and to[row - 1] == v[i].first - 1 and g[row - 1].size()) ans[pos[v[i]]] = min(ans[pos[v[i]]], max(g[row - 1][0], v[i].second)); if (to[row + 1] == v[i].first + 1 and g[row + 1].size()) ans[pos[v[i]]] = min(ans[pos[v[i]]], max(g[row + 1][0], v[i].second)); //とおいれつ while(!qb.empty() and qb.top().second <= row) qb.pop(); if (!qb.empty()) ans[pos[v[i]]] = min(ans[pos[v[i]]], qb.top().first - v[i].first + v[i].second - 1); if (!qf.empty()) ans[pos[v[i]]] = min(ans[pos[v[i]]], qf.top().first + v[i].first + v[i].second - 1); qf.push(P(v[i].second - 1 - v[i].first, fr[v[i].first])); } REP(i, n)cout << ans[i] << endl; }