제출 #289613

#제출 시각아이디문제언어결과실행 시간메모리
289613ngotienhung운세 보기 2 (JOI14_fortune_telling2)C++14
35 / 100
158 ms11940 KiB
#include <bits/stdc++.h>

#define pb push_back
#define ll long long
#define ff first
#define ss second

using namespace std;

const int maxN = 2e5 + 5;
const int inf = 1e9;

int a[maxN], b[maxN], t[maxN], st[maxN * 4], fen[maxN], n, k, sz;
vector<int> q[maxN];

void update(int v, int l, int r, int idx, int x)
{
	if(l > idx || r < idx)
        return;

	if(l == idx && r == idx){
		st[v] = x;
		return;
	}

	int mid = (l + r) / 2;
	update(v * 2, l, mid, idx, x);
	update(v * 2 + 1, mid + 1, r, idx, x);
	st[v] = max(st[v * 2], st[v * 2 + 1]);
}

int query(int v, int l, int r, int ql, int qr)
{
	if(l > qr || r < ql)
        return 0;
	if(l >= ql && r <= qr)
        return st[v];
	int mid = (l + r) / 2;
	return max(query(v * 2, l, mid, ql, qr), query(v * 2 + 1, mid + 1, r, ql, qr));
}

void add(int i){
	if(!i) return;
	while(i <= sz){
		fen[i]++;
		i += (i & (-i));
    }
}

int sum(int i){
	int res = 0;
	while(i > 0){
		res += fen[i];
		i -= (i & (-i));
	}
	return res;
}

int rangesum(int l, int r){
	return sum(r) - sum(l - 1);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> k;

	vector<int> v;
	for(int i = 1; i <= n; i++){
		cin >> a[i] >> b[i];
		v.pb(a[i]);
		v.pb(b[i]);
	}
	for(int i = 1; i <= k; i++){
		cin >> t[i];
		v.pb(t[i]);
	}

	sort(v.begin(), v.end());
	v.resize(distance(v.begin(), unique(v.begin(), v.end())));
	sz = v.size();

	for(int i = 1; i <= k; i++){
		t[i] = lower_bound(v.begin(), v.end(), t[i]) - v.begin() + 1;
		update(1, 1, v.size(), t[i], i);
	}

	ll res = 0;
	for(int i = 1; i <= n; i++){
		if(a[i] == b[i]){
			res += a[i];
			continue;
		}
		a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
		b[i] = lower_bound(v.begin(), v.end(), b[i]) - v.begin() + 1;
		int mx = query(1, 1, v.size(), min(a[i], b[i]), max(a[i], b[i]) - 1);
		if(mx && a[i] < b[i])
            swap(a[i], b[i]);
		q[mx].pb(i);
	}

	for(int i = k; i >= 0; --i){
		for(auto x : q[i]){
			int cnt = sum(sz) - sum(max(a[x], b[x]) - 1);
			if(cnt & 1)
				swap(a[x], b[x]);
			res += v[a[x] - 1];
		}
		add(t[i]);
	}

	cout << res << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...