Submission #1072035

#TimeUsernameProblemLanguageResultExecution timeMemory
1072035mickey080929Arranging Tickets (JOI17_arranging_tickets)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;

struct FenwickTree{
	vector<ll> tree;
	void init(ll n) {
		tree.assign(n+1, 0);
	}
	void upd(ll i, ll v, ll n) {
		i ++;
		while (i <= n) {
			tree[i] += v;
			i += i & -i;
		}
	}
	ll qry(ll i) {
		i ++;
		ll ret = 0;
		while (i) {
			ret += tree[i];
			i -= i & -i;
		}
		return ret;
	}
};

struct DisjointSet{
	vector<ll> par;
	vector<ll> lft;
	void init(ll n) {
		par.resize(n);
		iota(par.begin(), par.end(), 0);
		lft.resize(n);
		iota(lft.begin(), lft.end(), 0);
	}
	ll Find(ll x) {
		if (x == par[x]) return x;
		return par[x] = Find(par[x]);
	}
	void Union(ll l, ll r) {
		l = Find(l);
		r = Find(r);
		lft[r] = lft[l];
		par[l] = r;
	}
};
 
FenwickTree seg;
DisjointSet dsu;
SegmentTree seg2;

struct Move{
	ll A, B, C;
};
 
ll N, M;
 
ll solve(ll X, vector<ll> &use, vector<Move> &a) {
	seg.init(N);
	dsu.init(N);
	ll j = 0;
	ll ans = 0;
	for (ll i=0; i<N-1; i++) {
		ll t = i-1;
		while (t >= 0) {
			if (use[t] + seg.qry(t) <= use[i]) {
				dsu.Union(t, i);
			}
			else break;
			t = dsu.lft[i] - 1;
		}
		while (j < M && a[j].B-1 == i) {
			ll p = dsu.Find(a[j].A);
			ll mx = use[p] + seg.qry(p);
			if (mx == X) {
				j ++;
				continue;
			}
			ll temp = min(a[j].C, (X - mx) / 2);
			seg.upd(a[j].A, temp * 2, N);
			seg.upd(a[j].B, -temp * 2, N);
			ans += temp;
			ll cur = mx + temp * 2;
			t = dsu.lft[p] - 1;
			while (t >= 0) {
				if (use[t] + seg.qry(t) <= cur) {
					dsu.Union(t, p);
				}
				else break;
				t = dsu.lft[p] - 1;
			}
			j ++;
		}
	}
	return ans;
}
 
int main() {
    ios_base :: sync_with_stdio(false); cin.tie(NULL);
    cin >> N >> M;
    vector<Move> a(M);
    ll tot = 0;
    for (ll i=0; i<M; i++) {
    	cin >> a[i].A >> a[i].B >> a[i].C;
    	a[i].A --; a[i].B --;
    	if (a[i].A > a[i].B) swap(a[i].A, a[i].B);
    	tot += a[i].C;
    }
    sort(a.begin(), a.end(), [&] (Move &u, Move &v) {
    	if (u.B == v.B) return u.A > v.A;
    	return u.B < v.B;
    });
    vector<ll> use(N, 0);
    seg.init(N);
    for (ll i=0; i<M; i++) {
    	seg.upd(a[i].B, a[i].C, N);
    	seg.upd(0, a[i].C, N);
    	seg.upd(a[i].A, -a[i].C, N);
	}
	for (ll i=0; i<N; i++) {
		use[i] = seg.qry(i);
	}
	
	ll ans = tot;
	ll lo = tot, hi = tot + min(1000000000LL, tot);
	while (lo <= hi) {
		ll mid = (lo + hi) / 2;
		ll ret1 = mid - solve(mid, use, a);
		ll ret2 = mid+1 - solve(mid+1, use, a);
		ans = min({ans, ret1, ret2});
		if (ret1 > ret2) {
			lo = mid + 2;
		}
		else {
			hi = mid - 1;
		}
	}
	cout << ans << '\n';
}

Compilation message (stderr)

arranging_tickets.cpp:54:1: error: 'SegmentTree' does not name a type
   54 | SegmentTree seg2;
      | ^~~~~~~~~~~