제출 #1225274

#제출 시각아이디문제언어결과실행 시간메모리
1225274g4yuhgWalk (CEOI06_walk)C++20
0 / 100
128 ms10380 KiB
//Huyduocdithitp
#include <bits/stdc++.h>
typedef long long ll;
#define endl '\n'
#define yes cout<<"YES"<<endl;
#define no cout<<"NO"<<endl;
#define fi first
#define se second
#define pii pair<ll, ll>
#define inf 1e18
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define MP make_pair
#define TASK "ghuy4g"
#define start if(fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin);freopen(TASK".out","w",stdout);}
#define LOG 19
#define N 100005
using namespace std;

bool ghuy4g;

ll en_x, en_y, n;
ll d[N][2], st[6 * N], f[6 * N], m;

map<ll, ll> bit;
ll mx = 2e6 + 5, base = 1e6 + 1;

ll dist(ll x1, ll y1, ll x2, ll y2) {
	return abs(x1 - x2) + abs(y1 - y2);
}

void lazy(ll id) {
	if (f[id] == 0) return;
	st[id] = f[id];
	f[id * 2] = f[id];
	f[id * 2 + 1] = f[id];
	f[id] = 0;
}
void update(ll id, ll l, ll r, ll L, ll R, ll v) {
	lazy(id);
	if (l > R || r < L) return;
	if (L <= l && r <= R) {
		f[id] = v;
		lazy(id);
		return;
	}
	ll mid = (l + r) / 2;
	update(id * 2, l, mid, L, R, v);
	update(id * 2 + 1, mid + 1, r, L, R, v);
	st[id] = st[id * 2] + st[id * 2 + 1];
}
ll get(ll id, ll l, ll r, ll i) {
	lazy(id);
	if (i > r || i < l) return 0;
	if (l == r) return st[id];
	ll mid = (l + r) / 2;
	return get(id * 2, l, mid, i) + get(id * 2 + 1, mid + 1, r, i);
}

vector<ll> nenSo;
ll id(ll i) {
	return lower_bound(nenSo.begin(), nenSo.end(), i) - nenSo.begin() + 1;
}

void upd(ll l, ll r, ll v) {
	update(1, 1, m, id(l), id(r), v);	
}
ll get(ll x) {
	return get(1, 1, m, id(x));
}

struct vuong {
	ll x1, y1, x2, y2;
} p[N];

bool cmp(vuong a, vuong b) {
	return a.x2 < b.x2;
}

bool klinh;

signed main(void) {
    faster;
    cin >> en_x >> en_y;
    nenSo.push_back(en_y);
	cin >> n;
	    
	for (int i = 1; i <= n; i ++) {
		cin >> p[i].x1 >> p[i].y1 >> p[i].x2 >> p[i].y2;
		nenSo.push_back(p[i].y2);
		nenSo.push_back(p[i].y1);
		nenSo.push_back(p[i].y2 + 1);
		nenSo.push_back(p[i].y1 - 1);
	}    
	
    sort(p + 1, p + 1 + n, cmp);
    sort(nenSo.begin(), nenSo.end());
    nenSo.resize(unique(nenSo.begin(), nenSo.end()) - nenSo.begin());
    m = nenSo.size();
    
    for (int i = 1; i <= n; i ++) {
    	ll x1 = p[i].x1, x2 = p[i].x2, y1 = p[i].y1, y2 = p[i].y2;
    	//cout << i << " : " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    	if (x2 > en_x) break;
    	// xet 2 diem 
    	if (1) {
    		ll x = x2, y = y2 + 1;
    		ll xet = get(y);
    		if (xet == 0) {
    			d[i][0] = dist(0, 0, x, y);
    		}
    		else {
    			d[i][0] = min(dist(x, y, p[xet].x2, p[xet].y2 + 1) +d[xet][0], dist(x, y, p[xet].x2, p[xet].y1 - 1) +d[xet][1]);
    		}
    	}
    	if (1) {
    		ll x = x2, y = y1 - 1;
    		ll xet = get(y);
    		if (xet == 0) {
    			d[i][1] = dist(0, 0, x, y);
    		}
    		else {
    			d[i][1] = min(dist(x, y, p[xet].x2, p[xet].y2 + 1) +d[xet][0], dist(x, y, p[xet].x2, p[xet].y1 - 1) +d[xet][1]);
    		}
    	}
    	upd(y1, y2, i);
    }
    
    ll xet = get(en_y);
    //cout << "xet: " << xet << endl;
    if (xet == 0) {
    	cout << dist(0, 0, en_x, en_y) << endl;
    	return 0;
    	cout << 2 << endl;
    	cout << 0 << " " << en_x << endl;
    	cout << en_y << " " << 0 << endl;
    }
    else {
    	cout << min(dist(en_x, en_y, p[xet].x2, p[xet].y2 + 1) + d[xet][0], 
    		dist(en_x, en_y, p[xet].x2, p[xet].y1 - 1) + d[xet][1]) << endl;
    	
    }
    
    
    cerr << fabs(&klinh - &ghuy4g) / 1048576.0;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...