Submission #1318475

#TimeUsernameProblemLanguageResultExecution timeMemory
1318475wedonttalkanymorePalembang Bridges (APIO15_bridge)C++20
100 / 100
232 ms23196 KiB
#include <bits/stdc++.h>
/*
    Chang ki si xuyen man dem
    Di lac vao trong giac mong
*/
using namespace std;
using ll = long long;

#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll N = 1e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19;

int k, n;

struct item {
    char p, q;
    int s, t;
};
item a[N], b[N];
int sz, S;
vector <int> comp;

bool cmp(item x, item y) {
    return x.s + x.t < y.s + y.t;
}

struct ST {
    pii st[8 * N]; // fi la so luong, se la tong
//    int tree[8 * N];
    void update(int i, int l, int r, int pos, int val, int tt) {
        if (l == r) {
            st[i].fi += val;
            st[i].se += val * comp[pos - 1];
//            tree[i] += tt;
            return;
        }
        int mid = (l + r) / 2;
        if (pos <= mid) update(2 * i, l, mid, pos, val, tt);
        else update(2 * i + 1, mid + 1, r, pos, val, tt);
        st[i].fi = st[2 * i].fi + st[2 * i + 1].fi;
        st[i].se = st[2 * i].se + st[2 * i + 1].se;
//        tree[i] = tree[2 * i] + tree[2 * i + 1];
    }
    int get_med(int i, int l, int r, int val) {
    	if (l > r) return 0;
        if (l == r) return l;
        if (st[i].fi < val) return 0;
        int mid = (l + r) / 2;
        int ans = 0;
//        cout << i << ' ' << l << ' ' << r << ' ' << val << ' ' << mid << ' ' << st[2 * i].fi << ' ' << st[2 * i + 1].fi << '\n';
        if (st[2 * i].fi >= val) ans = get_med(2 * i, l, mid, val);
        if (!ans) ans = get_med(2 * i + 1, mid + 1, r, val - st[2 * i].fi);
        return ans;
    }
    pii get1(int i, int l, int r, int u, int v) {
        if (u > r || v < l) return make_pair(0, 0);
        if (u <= l && r <= v) return st[i];
        int mid = (l + r) / 2;
        pii valL = get1(2 * i, l, mid, u, v);
        pii valR = get1(2 * i + 1, mid + 1, r, u, v);
        return make_pair(valL.fi + valR.fi, valL.se + valR.se);
    }
//    int get2(int i, int l, int r, int u, int v) {
//    	if (u > r || v < l) return 0;
//        if (u <= l && r <= v) return tree[i];
//        int mid = (l + r) / 2;
//        return get2(2 * i, l, mid, u, v) + get2(2 * i + 1, mid + 1, r, u, v);
//	}
} st1, st2;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    if (fopen(".inp", "r")) {
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }
    cin >> k >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].p >> a[i].s >> a[i].q >> a[i].t;
        if (a[i].p != a[i].q) {
            comp.push_back(a[i].s);
            comp.push_back(a[i].t);
            b[++sz] = a[i];
        }
        else {
        	ans += abs(a[i].t - a[i].s);
		}
    }
    if (sz == 0) {
	    cout << ans << '\n';
	    return 0;
	}
//	for (int i = 1; i <= sz; i++) {
//		cout << b[i].s << ' ' << b[i].t << '\n';
//	}
    sort(b + 1, b + sz + 1, cmp);
    sort(comp.begin(), comp.end());
    comp.erase(unique(comp.begin(), comp.end()), comp.end());
//    for (auto x : comp) cout << x << ' ';
//    cout << '\n';
    S = comp.size();
//    cout << "size: " << S << '\n';
    for (int i = 1; i <= sz; i++) {
        b[i].s = lower_bound(comp.begin(), comp.end(), b[i].s) - comp.begin() + 1;
        b[i].t = lower_bound(comp.begin(), comp.end(), b[i].t) - comp.begin() + 1;
    }
    for (int i = 1; i <= sz; i++) {
        st2.update(1, 1, S, b[i].s, 1, 1);
        st2.update(1, 1, S, b[i].t, 1, 0);
    }
    if (k == 1) {
        auto p = st2.get_med(1, 1, S, sz);
//        cout << p << ' ' << comp[p - 1] << '\n';
        pii valL = st2.get1(1, 1, S, 1, p);
        pii valR = st2.get1(1, 1, S, p + 1, S);
//        cout << valL.se << ' ' << valR.se << '\n';
        ans += comp[p - 1] * valL.fi - valL.se;
        ans += valR.se - comp[p - 1] * valR.fi;
        ans += sz;
        cout << ans << '\n';
    }
    else {
    	int res = inf;
    	for (int i = 1; i < sz; i++) {
//    		cout << "value: " << b[i].s << ' ' << b[i].t << '\n';
    		int tmp = ans;
    		st1.update(1, 1, S, b[i].s, 1, 1);
    		st1.update(1, 1, S, b[i].t, 1, 0);
    		st2.update(1, 1, S, b[i].s, -1, -1);
    		st2.update(1, 1, S, b[i].t, -1, 0);
    		{
//    			if (i == 3) {
//    				cout << "now: " << '\n';
//				}
    			auto p = st1.get_med(1, 1, S, i);
//    			if (i == 3) {
//    				cout << "at: " << '\n';
//    				cout << p << ' ' << comp[p - 1] << '\n';
//				}
    			pii valL = st1.get1(1, 1, S, 1, p);
    			pii valR = st1.get1(1, 1, S, p + 1, S);
    			tmp += comp[p - 1] * valL.fi - valL.se;
    			tmp += valR.se - comp[p - 1] * valR.fi;
//    			int add = st1.get2(1, 1, S, 1, S);
				int add = i;
    			tmp += add;
			}
			{
				auto p = st2.get_med(1, 1, S, (sz - i));
				pii valL = st2.get1(1, 1, S, 1, p);
				pii valR = st2.get1(1, 1, S, p + 1, S);
				tmp += comp[p - 1] * valL.fi - valL.se;
    			tmp += valR.se - comp[p - 1] * valR.fi;
//    			int add = st2.get2(1, 1, S, 1, S);
				int add = (sz - i); 
    			tmp += add;
			}
//			cout << i << ' ' << tmp << '\n';
			res = min(res, tmp);
		}
		cout << res << '\n';
	}
    return 0;
}

Compilation message (stderr)

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