Submission #1246012

#TimeUsernameProblemLanguageResultExecution timeMemory
1246012nguyenhuythachFortune Telling 2 (JOI14_fortune_telling2)C++20
0 / 100
3 ms5184 KiB

//cre: khanh nguyen
// luoi code qua -_-

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F first
#define S second
#define pb push_back
#define pii pair<int, int>
 
const int N = 2e5 + 5; 

struct SegTree {
	int n;
	vector<int> st;
	
	SegTree() {}
	
	SegTree(int n) : n(n) {
		st.resize(4 * n + 5); 
	}
	
	void update(int id, int l, int r, int i, int x) {
		if (l == r) {
			st[id] = max(st[id], x); 
			return; 
		}
		int mid = (l + r) / 2; 
		if (i <= mid) update(id * 2, l, mid, i, x); 
		else update(id * 2 + 1, mid + 1, r, i, x); 
		st[id] = max(st[id * 2], st[id * 2 + 1]); 
	}
	
	int get(int id, int l, int r, int u, int v) {
		if (u > v) return 0;
		if (l > v || r < u) return 0; 
		if (u <= l && r <= v) {
			return st[id]; 
		}
		int mid = (l + r) / 2;
		return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); 
	}
} st;

struct BIT {
	int n; 
	vector<int> bit;
	
	BIT() {}
	BIT(int n) : n(n) {
		bit.resize(n + 3); 
	}
	
	void update(int id, int val) {
		for (int i = id; i <= n; i += (i & -i)) bit[i] += val; 
	}
	
	int get(int id) {
		int ret = 0;
		for (int i = id; i; i -= (i & -i)) ret += bit[i]; 
		return ret;
	}
} bit;

int n, m; 
pii a[N]; 
int c[N]; 
vector<int> cmp; 
int t[N]; 
int res[N]; 
int sz;

struct Event {
	int x, sign, id;
};

vector<Event> ev[N]; 

signed main() {
	ios_base::sync_with_stdio(0); 
	cin.tie(0); 
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].F >> a[i].S;
		cmp.pb(a[i].F); 
		cmp.pb(a[i].S); 
	}
	for (int i = 1; i <= m; i++) {
		cin >> c[i];
		cmp.pb(c[i]); 
	}
	sort(cmp.begin(), cmp.end());
	cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end()); 
	sz = cmp.size(); 
	st = SegTree(sz);
	int sz = cmp.size(); 
	for (int i = 1; i <= m; i++) {
		int id = upper_bound(cmp.begin(), cmp.end(), c[i]) - cmp.begin(); 
		st.update(1, 1, sz, id, i); 
	}
	for (int i = 1; i <= n; i++) {
		int ida, idb;
		ida = upper_bound(cmp.begin(), cmp.end(), a[i].F) - cmp.begin(); 
		idb = upper_bound(cmp.begin(), cmp.end(), a[i].S) - cmp.begin(); 
		if (ida > idb) swap(ida, idb); 
		t[i] = st.get(1, 1, sz, ida, idb - 1);  
		//cout << t[i] << ' ';
		ev[t[i]].pb({idb, -1, i}); 
		ev[m].pb({idb, 1, i}); 
	} // cout << '\n';
	bit = BIT(sz);
	for (int i = 1; i <= m; i++) {
		int id = upper_bound(cmp.begin(), cmp.end(), c[i]) - cmp.begin(); 
		bit.update(id, 1); 
		for (auto it : ev[i]) {
			res[it.id] += (bit.get(sz) - bit.get(it.x - 1)) * it.sign;  
		}
	}
	int sum=0;
	for (int i = 1; i <= n; i++) {
		int ans;
		if (t[i]) {
			ans = max(a[i].F, a[i].S); 
			if (res[i] & 1) ans = min(a[i].F, a[i].S);
		}
		else {
			ans = a[i].F;
			if (res[i] & 1) ans = a[i].S; 
		}
		sum+=ans;
	}
	cout << sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...