結果
| 問題 |
No.2897 2集合間距離
|
| コンテスト | |
| ユーザー |
momoyuu
|
| 提出日時 | 2024-09-20 21:51:49 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,540 bytes |
| コンパイル時間 | 1,664 ms |
| コンパイル使用メモリ | 127,552 KB |
| 実行使用メモリ | 73,232 KB |
| 最終ジャッジ日時 | 2024-09-20 21:51:57 |
| 合計ジャッジ時間 | 7,233 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 TLE * 1 -- * 7 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
#include<atcoder/fenwicktree>
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin>>n;
vector<ll> x(n),y(n);
for(int i = 0;i<n;i++) cin>>x[i]>>y[i];
for(int i = 0;i<n;i++){
ll a = x[i] + y[i];
ll b = x[i] - y[i];
x[i] = a;
y[i] = b;
}
int m;
cin>>m;
vector<ll> z(m),w(m);
for(int i = 0;i<m;i++){
cin>>z[i]>>w[i];
ll a = z[i] + w[i];
ll b = z[i] - w[i];
z[i] = a;
w[i] = b;
}
ll right = 3e6;
ll left = -1;
while(right-left>1){
ll mid = (right+left) / 2;
vector<ll> dy;
vector<pair<pair<ll,int>,pair<ll,ll>>> que;
for(int i = 0;i<n;i++){
dy.push_back(y[i]);
que.push_back(make_pair(make_pair(x[i],100),make_pair(y[i],0)));
}
vector<ll> cnt(m,0);
vector<int> vis(m,0);
for(int i = 0;i<m;i++){
dy.push_back(w[i]-mid);
dy.push_back(w[i]+mid+1);
que.push_back(make_pair(make_pair(z[i]-mid,-i),make_pair(w[i]-mid,w[i]+mid+1)));
que.push_back(make_pair(make_pair(z[i]+mid+1,-i),make_pair(w[i]-mid,w[i]+mid+1)));
}
sort(dy.begin(),dy.end());
dy.erase(unique(dy.begin(),dy.end()),dy.end());
int mm = dy.size();
atcoder::fenwick_tree<ll> bit(mm);
sort(que.begin(),que.end());
for(int i = 0;i<que.size();i++){
//cout<<i<<endl;
auto now = que[i];
int t = now.first.second;
//cout<<i<<endl;
if(t==100){
ll want = now.second.first;
int ni = lower_bound(dy.begin(),dy.end(),want) - dy.begin();
bit.add(ni,1);
}else{
ll w1 = now.second.first;
ll w2 = now.second.second;
int ni = lower_bound(dy.begin(),dy.end(),w1) - dy.begin();
int nj = lower_bound(dy.begin(),dy.end(),w2) - dy.begin();
int u = -now.first.second;
// cout<<u<<endl;
if(vis[u]++){
cnt[u] += bit.sum(ni,nj);
}else{
cnt[u] -= bit.sum(ni,nj);
}
}
}
bool fn = false;
for(int i = 0;i<m;i++) if(cnt[i]>0) fn = true;
if(fn) right = mid;
else left = mid;
}
cout<<right<<endl;
}
momoyuu