Submission #1304538

#TimeUsernameProblemLanguageResultExecution timeMemory
1304538hoa208Fortune Telling 2 (JOI14_fortune_telling2)C++20
0 / 100
1 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--)
#define pa pair<ll, ll>
#define fi first
#define se second
#define bit(mask, j) ((mask >> j) & 1)
const   ll mod = 1e9 + 7;
const   ll INF = 1e18;
//--------------------------------------------------------------------

const ll N = 2e5 + 10;
ll a[N], b[N];
struct segtree {
	ll mn;
	bool sum;
} st[4 * N];
ll n, k;
void update(ll u, ll val, ll id = 1, ll l = 1, ll r = n) {
	if(u > r || u < l) return;
	if(l == r) {
		st[id].sum = 1;
		st[id].mn = val;
		return;
	}
	ll mid = l + r >> 1;
	update(u, val, id << 1, l, mid);
	update(u, val, id << 1 | 1, mid + 1, r);
	st[id].sum = st[id << 1].sum ^ st[id << 1 | 1].sum;
	st[id].mn = min(st[id << 1].mn, st[id << 1 | 1].mn);
}
ll walk(ll w, ll id = 1, ll l = 1, ll r = n) {
	if(st[id].mn > w) return 0;
	if(l == r) return l;
	ll mid = l + r >> 1;
	ll res = 0;
	res = walk(w, id << 1 | 1, mid + 1, r);
	if(res != 0) return res;
	return walk(w, id << 1, l, mid);
}
bool get(ll u, ll v, ll id = 1, ll l = 1, ll r = n) {
	if(u > r || v < l) return 0;
	if(u <= l && v >= r) return st[id].sum;
	ll mid = l + r>> 1;
	return (get(u, v, id << 1, l, mid) ^ get(u, v, id << 1 | 1, mid + 1, r));
}
void hbmt() {
	cin >> n >> k;
	vector<pa> vt;
	ll ans = 0;
	FOR(i, 1, n) {
		cin >> a[i] >> b[i];
		if(a[i] == b[i]) {
			ans += a[i];
		}
		else {
			vt.push_back({min(a[i], b[i]), i});
		}
	}
	FOR(i, 1, 4 * n) {
		st[i].mn = INF;
	}
	FOR(i, 1, k) {
		ll t;
		cin >> t;
		vt.push_back({t, -i});
	}
	sort(vt.begin(), vt.end(), [&] (pa &x, pa &y) {
		return x.fi > y.fi || x.fi == y.fi && x.se < y.se;
	});
	for(auto e : vt) {
		if(e.se < 0) {
			update(-e.se, e.fi); // lay min va (tong 0 1)
		}
		else {
			ll id = e.se, mn = e.fi;
			ll mx = max(a[id], b[id]);
			ll pos = walk(mx - 1);
			bool c = get(pos + 1, n);
			if(pos != 0) {
				a[id] = mx, b[id] = mn;
			}
			if(c == 1) swap(a[id], b[id]);
			ans += a[id];
		}
	}
	cout << ans;
}

int main() {
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);

	#define NAME "hbmt"
	if(fopen(NAME".inp", "r")) {
		freopen(NAME".inp", "r", stdin);
		freopen(NAME".out", "w", stdout);
	}
	
	//int t;cin>>t;while(t--)
	hbmt();
	return 0;
}

Compilation message (stderr)

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:99:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |                 freopen(NAME".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:100:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  100 |                 freopen(NAME".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...