O(20002log106) 的线段树“优秀”写法。
谢谢各位巨佬!
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 5,INF = 1e6 + 1;
struct Tree {
int Max,l,r;
}t[INF << 2];
struct bad_light {
int x,y;
bool operator < (const bad_light &A) const {
return x < A.x;
}
}a[N],b[N];
int Max[N];
void build (int p,int l,int r) {
t[p].l = l,t[p].r = r;
if (l == r) {
return ;
}
int mid = l + r >> 1;
build (p << 1,l,mid);
build (p << 1 | 1,mid + 1,r);
}
void modify (int p,int l,int r,int w) {
if (t[p].l >= l && t[p].r <= r) {
t[p].Max = max (t[p].Max,w);
return ;
}
int mid = t[p].l + t[p].r >> 1;
if (l <= mid) modify (p << 1,l,r,w);
if (r > mid) modify (p << 1 | 1,l,r,w);
}
int query (int p,int pos) {
if (t[p].l == t[p].r) {
return t[p].Max;
}
int mid = t[p].l + t[p].r >> 1;
if (pos <= mid) return max (t[p].Max,query (p << 1,pos));
else return max (t[p].Max,query (p << 1 | 1,pos));
}
int main () {
int n,m; cin >> n >> m;
for (int i = 1;i <= n;i ++) {
cin >> a[i].x >> a[i].y;
}
for (int i = 1;i <= m;i ++) {
cin >> b[i].x >> b[i].y;
}
sort (b + 1,b + 1 + m);
for (int i = m;i >= 1;i --) {
Max[i] = max (Max[i + 1],b[i].y);
}
build (1,0,INF);
for (int i = 1;i <= n;i ++) {
int lst = 0;
for (int j = 1;j <= m;j ++) {
if (a[i].x > b[j].x) continue;
int tmp_x = b[j].x - a[i].x + 1;
modify (1,lst,tmp_x - 1,Max[j] - a[i].y + 1);
lst = tmp_x;
}
modify (1,lst,INF,0);
}
int Min = 2 * INF;
for (int i = 0;i <= INF;i ++) {
Min = min (Min,i + query (1,i));
}
cout << Min << endl;
return 0;
}