Submission #443999

#TimeUsernameProblemLanguageResultExecution timeMemory
443999moonrabbit2Palembang Bridges (APIO15_bridge)C++17
22 / 100
95 ms6368 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma,tune=native")
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 l2;
//typedef long long l2;
typedef long double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdb;
typedef tuple<int,int,int> tii;
typedef tuple<db,db,db> tdb;
typedef tuple<ll,ll,ll> tll;
typedef tuple<int,int,int,int> ti4;
typedef tuple<int,int,int,int,int> ti5;
typedef tuple<ll,ll,ll,ll> tl4;
typedef tuple<db,db,db,db> td4;
typedef vector<vector<ll>> mat;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //shuffle(a+1,a+1+n,rng)
uniform_int_distribution<> gen(1,100); //gen(rng)

//https://codeforces.com/contest/1264/submission/66344993 + 몇 가지 기능 직접 추가
ll modinv(ll a,ll m){
	if(m==1) return 0;
	a%=m;
	if(a<0) a+=m;
	if(a==1) return 1;
	return m-modinv(m,a)*m/a;
}
template <int MOD_> struct modnum{
private:
	int v;
public:
	static const int MOD = MOD_;
	modnum() : v(0) {}
	modnum(ll v_) : v(int(v_ % MOD)) { if (v < 0) v += MOD; }
	explicit operator int () const { return v; }
	friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
	friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }
	friend bool operator < (const modnum& a, const modnum& b) { return a.v < b.v; }
	friend bool operator <= (const modnum& a, const modnum& b) { return a.v <= b.v; }
	friend bool operator > (const modnum& a, const modnum& b) { return a.v > b.v; }
	friend bool operator >= (const modnum& a, const modnum& b) { return a.v >= b.v; }
	modnum operator ~ () const {
		modnum res;
		res.v = modinv(v, MOD);
		return res;
	}
 
	modnum& operator += (const modnum& o) {
		v += o.v;
		if (v >= MOD) v -= MOD;
		return *this;
	}
	modnum& operator -= (const modnum& o) {
		v -= o.v;
		if (v < 0) v += MOD;
		return *this;
	}
	modnum& operator *= (const modnum& o) {
		v = int(ll(v) * ll(o.v) % MOD);
		return *this;
	}
	modnum& operator /= (const modnum& o) {
		return *this *= (~o);
	}
	modnum operator-() const { return modnum(-v); }
	modnum& operator++() { return *this += 1; }
	modnum operator++(int){ modnum tmp=*this; ++*this; return tmp; }
	modnum& operator--() { return *this -= 1; }
	modnum operator--(int){ modnum tmp=*this; --*this; return tmp; }
	friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
	friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
	friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }
	friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= b; }
	friend modnum pow(modnum a, ll p) {
		modnum ans = 1;
		for (; p; p /= 2, a *= a) if (p&1) ans *= a;
		return ans;
	}
	friend ostream& operator<<(std::ostream& os, const modnum& o)
	{
		os << o.v;
		return os;
	}
	friend istream& operator>>(std::istream& is, modnum& o)
	{
		is >> o.v;
		return is;
	}
	int get(){
		return v;
	}
};
const ll mod=1e9+7,inf=1e18;
using mi=modnum<mod>;
const int N=1e5+5,M=1e6+5;
int n,m,k,a[N],b[N],c[N];
ll res,ans,pfx[N],sfx[N],S;
priority_queue<int> S1;
priority_queue<int,vector<int>,greater<int>> S2;
void Insert(int x){
	int L=S1.top(),R=S2.top();
	if(L<=x&&x<=R){
		if(S1.size()<S2.size()){
			S1.push(x); S-=x;
		}
		else{
			S2.push(x); S+=x;
		}
	} else if(x<L){
		S1.push(x); S-=x;
		if(S1.size()>S2.size()+1){
			S2.push(S1.top()); S+=2*S1.top();
			S1.pop();
		}
	} else{
		S2.push(x); S+=x;
		if(S2.size()>S1.size()+1){
			S1.push(S2.top()); S-=2*S2.top();
			S2.pop();
		}
	}
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	cin>>k>>m;
	for(int i=1;i<=m;i++){
		int A,B; char P,Q;
		cin>>P>>A>>Q>>B;
		if(P==Q){
			res+=abs(A-B); continue;
		}
		a[++n]=A; b[n]=B; c[n]=n;
	}
	sort(c+1,c+1+n,[&](int X,int Y){
		return a[X]+b[X]<a[Y]+b[Y];
	});
	for(int i=n;i>=1;i--){
		if(i==n){
			S1.push(min(a[c[i]],b[c[i]]));
			S2.push(max(a[c[i]],b[c[i]]));
			S=max(a[c[i]],b[c[i]])-min(a[c[i]],b[c[i]]);
		} else{
			Insert(a[c[i]]); Insert(b[c[i]]);
		}
		sfx[i]=S;
	}
	while(S1.size()) S1.pop();
	while(S2.size()) S2.pop();
	for(int i=1;i<n;i++){
		if(i==1){
			S1.push(min(a[c[i]],b[c[i]]));
			S2.push(max(a[c[i]],b[c[i]]));
			S=max(a[c[i]],b[c[i]])-min(a[c[i]],b[c[i]]);
		} else{
			Insert(a[c[i]]); Insert(b[c[i]]);
		}
		pfx[i]=S;
	}
	ans=inf;
	if(k==1) ans=sfx[1];
	else for(int i=0;i<n;i++) ans=min(ans,pfx[i]+sfx[i+1]);
	cout<<ans+n+res;
	return 0;
}
#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...