Submission #1158418

#TimeUsernameProblemLanguageResultExecution timeMemory
1158418NurislamFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
386 ms93316 KiB
#include <bits/stdc++.h>
  
using namespace std;
 
#define int long long

const int N = 2e5+2, inf = 1e18;

struct segt{
	vector<int> t, sm;
	int n;
	segt(int n) : n(n){
		t.resize(n*4);
		sm.resize(n*4);
	};
	
	void upd(int ps, int va, int i, int l, int r) {
		if(l == r) {
			t[i] = max(t[i], va);
			sm[i] ++;
			return;
		};
		int m = (l + r) >> 1;
		if(ps <= m)upd(ps, va, i << 1, l, m);
		else upd(ps, va, i << 1 | 1, m + 1, r);
		
		t[i] = max( t[i << 1], t[i << 1 | 1] );
		sm[i] = sm[i << 1] + sm[i << 1 | 1];
	};
	
	void upd(int ps, int va) {
		upd(ps, va, 1, 0, n);
	};
	
	int getm(int tl, int tr, int i, int l, int r) {
		if(l > tr || r < tl)return 0;
		if(tl <= l && r <= tr)return t[i];
		
		int m = (l + r) >> 1;
		
		return max( getm(tl, tr, i << 1, l, m), 
			getm(tl, tr, i << 1 | 1, m + 1, r) );
	};
	
	int getm(int tl, int tr){
		if(tl > tr)return 0;
		return getm(tl, tr, 1, 0, n);
	};
	
	
	int gets(int tl, int tr, int i, int l, int r) {
		if(l > tr || r < tl)return 0;
		if(tl <= l && r <= tr)return sm[i];
		
		int m = (l + r) >> 1;
		
		return gets(tl, tr, i << 1, l, m) +
			gets(tl, tr, i << 1 | 1, m + 1, r);
	};
	
	int gets(int tl, int tr){
		if(tl > tr)return 0;
		return gets(tl, tr, 1, 0, n);
	};
};

void solve(){
	int n, k;
	cin >> n >> k;
	vector<int> a(n), b(n), la(n);
	
	for(int i = 0; i < n; i ++ )
		cin >> a[i] >> b[i];
	vector<int> _a = a, _b = b;
		
	vector<int> t(k);
	for(int &i : t)cin >> i;
	
	auto compres = [&](){
		vector<int> res{0};
		for(int i : a)res.push_back(i);
		for(int i : b)res.push_back(i);
		for(int i : t)res.push_back(i);
		
		sort(res.begin(), res.end());
		res.erase(unique(res.begin(), res.end()), res.end());
		
		for(int &i : a) i = lower_bound(res.begin(), res.end(), i) - res.begin();
		for(int &i : b) i = lower_bound(res.begin(), res.end(), i) - res.begin();
		for(int &i : t) i = lower_bound(res.begin(), res.end(), i) - res.begin();
	};compres();
	
	//for(int i = 0; i < n; i ++ ) cout << a[i] << ' ' << b[i] << '\n';
	//for(int i : t)cout << i << '\n';
	
	int sz = n*2 + k + 5;
	segt tr(sz + 5);
	for(int i = 1; i <= k; i ++ ) 
		tr.upd(t[i-1], i);
	
	
	vector<vector<int>> ps( k + 1 );
	for(int i = 0; i < n; i ++ ){
		if( a[i] <= b[i] ) {
			ps[tr.getm(a[i], b[i]-1)].push_back(i);
			//cout << tr.getm(a[i], b[i]-1) << ' ';
		}else{
			ps[tr.getm(b[i], a[i]-1)].push_back(i);
			//cout << tr.getm(b[i], a[i]-1) << ' ';
		};
	};
	//cout << '\n';
	
	tr = segt(sz + 5);

	//for(int i = 1; i <= 8; i ++ )cout << tr.gets(i, i) << ' ';
	//cout << '\n';
	vector<int> cnt(n);
	for(int i = k; i >= 1; i -- ) {
		tr.upd(t[i-1], 0);
		//cout << t[i-1] << ' ';
		//for(int i = 1; i <= 8; i ++ )cout << tr.gets(i, i) << ' ';
		//cout << '\n';
		for(int j : ps[i]) {
			cnt[j] = tr.gets(max(a[j], b[j]), sz);
			if(a[j] <= b[j]) cnt[j] ++; 
		}
	};
	for(int j : ps[0]) {
		cnt[j] = tr.gets(max(a[j], b[j]), sz);
	};
	
	for(int i = 0; i <= k; i ++ ) {
		//cout << i << " : \n";
		//for(int j : ps[i])cout << j << ' ';
		//cout << '\n';
	};
	//for(int i = 0; i < n; i ++ ) cout << cnt[i] << ' ';
	//cout << '\n';
	
	int ans = 0;
	for(int i = 0; i < n; i ++ ) {
		if(cnt[i] % 2 == 0)ans += _a[i];
		else ans += _b[i];
	};
	cout << ans << '\n';	
};
 
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int tt = 1;
    //cin >> tt;
    while(tt--){
        solve();
    };
};

 
 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...