Submission #1228539

#TimeUsernameProblemLanguageResultExecution timeMemory
1228539Bui_Quoc_CuongPalembang Bridges (APIO15_bridge)C++20
100 / 100
95 ms10792 KiB
#pragma GCC optimize("O2")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
using namespace std;
#define ALL(A) A.begin(), A.end()
#define FOR(i, a, b) for(int i = (a); i <= (int)(b); i++)
#define FORD(i, a, b) for(int i = (a); i >= (int)b; i--)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define fi first
#define se second
const int oo = (int) 2e9;
const long long INF = (long long) 1e18;
const int MAXN = (int) 4e5 + 5;

int K, N;
char P[MAXN], Q[MAXN];
int S[MAXN], T[MAXN];

namespace sub1 {
	int A[MAXN];
	int M;
	long long res = 0;
	long long pre[MAXN];

	void solve() {
		FOR(i, 1, N) {
			if (P[i] != Q[i]) {
				A[++ M] = S[i];
				A[++ M] = T[i];
			} else res+= abs(S[i] - T[i]);
		}

		N = M;
		sort(A + 1, A + 1 + N);
		FOR(i, 1, N) pre[i] = pre[i - 1] + A[i];

		long long ans = (N > 0 ? INF : 0);

		FOR(i, 1, N) {
			int x = A[i];
			long long sum = 1LL * i * x - pre[i] - 1LL * (N - i + 1) * x + pre[N] - pre[i - 1];
			ans = min(ans, sum);
		}

		cout << res + ans + N / 2;
	}		
}

namespace sub2 {
	int A[MAXN];
	int M;
	long long res = 0;

	void solve() {
		vector <int> Place;
		FOR(i, 1, N) {
			if (P[i] == Q[i]) res+= abs(S[i] - T[i]);
			else {
				Place.push_back(S[i]);
				Place.push_back(T[i]);
			}
		}

		sort(ALL(Place));

		long long ans = (Place.size() > 1 ? INF : 0);	

		FOR(i, 0, Place.size() - 1) {
			int x1 = Place[i];
			FOR(j, i + 1, Place.size() - 1) {
				int x2 = Place[j];
				long long sum = 0;

				FOR(t, 1, N) if (P[t] != Q[t]) {
					sum+= min(abs(S[t] - x1) + abs(T[t] - x1), abs(S[t] - x2) + abs(T[t] - x2)) + 1;
				}

				ans = min(ans, sum);	
			}
		}
		cout << ans + res;
	}		
}

namespace sub3 {
	vector <pair <int, int>> Line;
	long long res = 0;
	long long L[MAXN], R[MAXN];

	void solve() {
		FOR(i, 1, N) {
			if (P[i] != Q[i]) {
				if (S[i] > T[i]) swap(S[i], T[i]);
				Line.push_back(make_pair(S[i], T[i]));
			} else res+= abs(S[i] - T[i]);
		}					

		sort(ALL(Line), [&](pair <int, int> u, pair <int, int> v) {
			return u.fi + u.se < v.fi + v.se;
		});

		N = Line.size() - 1;	

		/// calc For Left
		vector <int> Point;

		FOR(i, 0, N) {
			Point.push_back(Line[i].fi);
			Point.push_back(Line[i].se);

			sort(ALL(Point));	

			int x = Point[(Point.size() + 1) / 2];

			long long sum = 0;

			for (const int &xxx : Point) sum+= abs(xxx - x);

			L[i] = sum;
		}	

		Point.clear();
		/// calc For Right

		FORD(i, N, 0) {
			Point.push_back(Line[i].fi);
			Point.push_back(Line[i].se);

			sort(ALL(Point));	

			int x = Point[(Point.size() + 1) / 2];

			long long sum = 0;

			for (const int &xxx : Point) sum+= abs(xxx - x);

			R[i] = sum;
		}

		long long ans = (N > 0 ? INF : 0);

		FOR(i, 0, N - 1) {
			ans = min(ans, L[i] + R[i + 1]);
		}

		cout << ans + res + N + 1;
	}
}

namespace sub4 {
	int deCompress[MAXN];
	vector <pair <int, int>> Line;
	long long res = 0;
	int VAL;
	long long L[MAXN], R[MAXN];	

	void Compress(void) {
		vector <int> X;
		FOR(i, 0, N) {
			X.push_back(Line[i].fi);
			X.push_back(Line[i].se);
		}
		sort(ALL(X)); X.resize(unique(ALL(X)) - X.begin());	

		FOR(i, 0, N) {
			int p_X = upper_bound(ALL(X), Line[i].fi) - X.begin();
			deCompress[p_X] = Line[i].fi, Line[i].fi = p_X;

			int p_Y = upper_bound(ALL(X), Line[i].se) - X.begin();
			deCompress[p_Y] = Line[i].se, Line[i].se = p_Y;
		}

		VAL = X.size();
	}

	struct FenwickTree {
		long long bit[MAXN];

		inline void update(int u, int val) {
			for (int i = u; i <= VAL; i+=i&-i) bit[i]+= val;
		}

		inline long long get(int u) {
			long long sum = 0;
			for (int i = u; i; i-=i&-i) sum+= bit[i];
			return sum;
		}

		inline long long get(int l, int r) {
			return get(r) - get(l - 1);
		}

		void clear() {
			memset(bit, 0, sizeof bit);
		}
	} fwtSum, fwtCnt;

	void calcLeft(void) {
		fwtSum.clear();
		fwtCnt.clear();

		FOR(i, 0, N - 1) {
			fwtCnt.update(Line[i].fi, 1); fwtCnt.update(Line[i].se, 1);
			fwtSum.update(Line[i].fi, deCompress[Line[i].fi]); fwtSum.update(Line[i].se, deCompress[Line[i].se]);

			int median = 0, l = 1, r = VAL;
			while (l <= r) {
				int mid = (l + r) >> 1;
				if (fwtCnt.get(mid) > i) median = mid, r = mid - 1;
				else l = mid + 1;
			}	

			long long sumLeft = 1LL * deCompress[median] * fwtCnt.get(median) - fwtSum.get(median);
			long long sumRight = fwtSum.get(median, VAL) - 1LL * deCompress[median] * fwtCnt.get(median, VAL);

			L[i] = sumLeft + sumRight;
		}
	}	

	void calcRight(void) {
		fwtSum.clear();
		fwtCnt.clear();
		int cnt = 0;

		FORD(i, N, 0) {
			cnt++;
			fwtCnt.update(Line[i].fi, 1); fwtCnt.update(Line[i].se, 1);
			fwtSum.update(Line[i].fi, deCompress[Line[i].fi]); fwtSum.update(Line[i].se, deCompress[Line[i].se]);

			int median = 0, l = 1, r = VAL;
			while (l <= r) {
				int mid = (l + r) >> 1;
				if (fwtCnt.get(mid) >= cnt) median = mid, r = mid - 1;
				else l = mid + 1;
			}	

			long long sumLeft = 1LL * deCompress[median] * fwtCnt.get(median) - fwtSum.get(median);
			long long sumRight = fwtSum.get(median, VAL) - 1LL * deCompress[median] * fwtCnt.get(median, VAL);

			R[i] = sumLeft + sumRight;
		}
	}

	void solve() {	
		FOR(i, 1, N) {
			if (P[i] != Q[i]) {
				if (S[i] > T[i]) swap(S[i], T[i]);
				Line.push_back(make_pair(S[i], T[i]));
			} else res+= abs(S[i] - T[i]);
		}					

		sort(ALL(Line), [&](pair <int, int> u, pair <int, int> v) {
			return u.fi + u.se < v.fi + v.se;
		});

		N = Line.size() - 1;

		Compress();
		calcLeft(); calcRight();

		long long ans = (N > 0 ? INF : 0);
		FOR(i, 0, N - 1) ans = min(ans, L[i] + R[i + 1]);

		cout << ans + res + N + 1;
	}
}

signed main(void) {
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    
    #define Hori "" 
    if (fopen(Hori".inp", "r")) {
        freopen(Hori".inp", "r", stdin);
        freopen(Hori".out", "w", stdout);
    }
    
    cin >> K >> N;
    for (int i = 1; i <= N; i++) cin >> P[i] >> S[i] >> Q[i] >> T[i];

    if (K == 1) return sub1 :: solve(), 0;
	return sub4 :: solve(), 0;

    return void(cerr << "KO :" << TIME << "s "), (0 ^ 0);
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:273:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  273 |         freopen(Hori".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:274:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  274 |         freopen(Hori".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...