제출 #487890

#제출 시각아이디문제언어결과실행 시간메모리
487890MilosMilutinovicPalembang Bridges (APIO15_bridge)C++14
0 / 100
1 ms460 KiB
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}()); 
const ll mod=1000000007;
const ll mod2=998244353;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head

const int N=101000;
int k,n,m,s[N],t[N],a[N],b[N],p[N];
char ss[N],tt[N];
ll pf[N],sf[N];

struct ds{
	int med;
	ll sm;
	ds() { sm=0; }
	multiset<int> L,R;
	void add(int x,int y) {
		if (x>y) swap(x,y);
		if (SZ(L)==0) {
			sm=y-x;
			L.insert(x);
			R.insert(y);
			med=x;
			return;
		}
		(x<=med?L:R).insert(x);
		(y<=med?L:R).insert(y);
		while (SZ(L)>SZ(R)) {
			R.insert(*prev(L.end()));
			L.erase(prev(L.end()));
		}
		while (SZ(L)<SZ(R)) {
			L.insert(*R.begin());
			R.erase(R.begin());
		}
		int nm=*prev(L.end());
		sm+=abs(nm-x)+abs(nm-y);
		if (med>nm) sm+=abs(med-nm)*2;
		med=nm;
	}
};

int main() {
	scanf("%d%d",&k,&n);
	rep(i,1,n+1) scanf("\n%c %d %c %d",ss+i,s+i,tt+i,t+i);
	ll ans=1e18,same=0;
	rep(i,1,n+1) {
		if (ss[i]==tt[i]) {
			same+=abs(s[i]-t[i]);
		}
		else a[++m]=s[i],b[m]=t[i];
	}
	assert(m!=0);
	rep(i,1,m+1) p[i]=i;
	sort(p+1,p+1+m,[&](int i,int j) {
		return a[i]+b[i]<a[j]+b[j];
	});
	ds pref;
	pref.sm=0;
	rep(i,1,m+1) {
		pref.add(a[p[i]],b[p[i]]);
		pf[i]=pref.sm;
	}
	ds suff;
	suff.sm=0;
	per(i,1,m+1) {
		suff.add(a[p[i]],b[p[i]]);
		sf[i]=suff.sm;
	}
	/*rep(i,1,m+1) {
		printf("%lld %lld\n",pf[i],sf[i]);
	}*/
	rep(i,1,m+1) ans=min(ans,pf[i]+sf[i+1]);
	if (k==2) printf("%lld",ans+same+m);
	else printf("%lld\n",pf[m]+same+m);
}

/*
2 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7

1 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7
*/

컴파일 시 표준 에러 (stderr) 메시지

bridge.cpp: In function 'int main()':
bridge.cpp:60:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |  scanf("%d%d",&k,&n);
      |  ~~~~~^~~~~~~~~~~~~~
bridge.cpp:61:20: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |  rep(i,1,n+1) scanf("\n%c %d %c %d",ss+i,s+i,tt+i,t+i);
      |               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...