Submission #100175

#TimeUsernameProblemLanguageResultExecution timeMemory
100175TadijaSebezPalembang Bridges (APIO15_bridge)C++11
100 / 100
475 ms14960 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define ll long long
const int N=100050;
const ll inf=9e18;
int l[N],r[N];
ll dp[N][2];
int main()
{
	int k,n;
	scanf("%i %i",&k,&n);
	char a,b;
	ll all=0;
	vector<int> work;
	for(int i=1;i<=n;i++)
	{
		scanf("\n%c %i %c %i",&a,&l[i],&b,&r[i]);
		if(a!=b)
		{
			if(l[i]>r[i]) swap(l[i],r[i]);
			work.pb(i);
		}
		else all+=abs(l[i]-r[i]);
	}
	if(work.empty()) return 0*printf("%lld\n",all);
	sort(work.begin(),work.end(),[&](int x, int y){ return l[x]+r[x]<l[y]+r[y];});
	for(int k=0;k<=1;k++)
	{
		multiset<int> st;
		dp[0][k]=abs(r[work[0]]-l[work[0]]);
		st.insert(l[work[0]]);
		st.insert(r[work[0]]);
		auto it=st.begin();
		for(int j=1;j<work.size();j++)
		{
			int i=work[j];
			st.insert(l[i]);
			st.insert(r[i]);
			int last=*it;
			dp[j][k]=dp[j-1][k];
			if(l[i]>=*it && r[i]>=*it) it++;
			else if(l[i]<*it && r[i]<*it) it--,dp[j][k]+=2*abs(last-*it);
			dp[j][k]+=abs(l[i]-*it)+abs(r[i]-*it);
		}
		reverse(work.begin(),work.end());
		//for(int i=0;i<work.size();i++) printf("%lld ",dp[i][k]);printf("\n");
	}
	if(k==1) printf("%lld\n",dp[work.size()-1][0]+all+work.size());
	else
	{
		ll ans=min(dp[work.size()-1][0],dp[work.size()-1][1]);
		for(int i=0;i<work.size();i++)
		{
			ans=min(ans,dp[i][0]+dp[work.size()-i-2][1]);
		}
		printf("%lld\n",ans+all+work.size());
	}
	return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:36:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=1;j<work.size();j++)
               ~^~~~~~~~~~~~
bridge.cpp:54:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<work.size();i++)
               ~^~~~~~~~~~~~
bridge.cpp:13:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&k,&n);
  ~~~~~^~~~~~~~~~~~~~~
bridge.cpp:19:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("\n%c %i %c %i",&a,&l[i],&b,&r[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...