Submission #236298

#TimeUsernameProblemLanguageResultExecution timeMemory
236298mahmoudbadawyPalembang Bridges (APIO15_bridge)C++17
100 / 100
477 ms13036 KiB
#include <bits/stdc++.h>
#define F first
#define S second

using namespace std;

struct median{
	multiset<int> l,r;
	long long lsum,rsum;
	int med;
	// l < med
	// r med  , > med
	median():lsum(0),rsum(0){}
	void fix()
	{
		// odd: l.size() = r.size()-1 , even: l.size() = r.size() (taking larger as median)
		if(l.size()>r.size())
		{
			med=(*l.rbegin());
			lsum-=med; rsum+=med;
			l.erase(l.find(*l.rbegin()));
			r.insert(med);
		}
		if(r.size() > l.size()+1)
		{
			l.insert(*r.begin());
			lsum+=*r.begin(); rsum-=*r.begin();
			r.erase(r.begin());
			med=*r.begin();
		}
		//cout << lsum << " " << rsum << endl;
	}
	void insert(int x)
	{
		//cout << "Inserting " << x << endl;
		med=r.size()?(*r.begin()):-1;
		if(x<med)
		{
			lsum+=x;
			l.insert(x);
		}
		else
		{
			rsum+=x;
			r.insert(x);
		}
		fix();
	}
	void erase(int x)
	{
		med=r.size()?(*r.begin()):-1;
		if(x<med)
		{
			lsum-=x;
			l.erase(l.find(x));
		}
		else
		{
			rsum-=x;
			r.erase(r.find(x));
		}
		fix();
	}
};

vector< pair<int,int> > v;
int n,k;

bool cmp(pair<int,int> a,pair<int,int> b)
{
	return a.F+a.S < b.F+b.S;
}

int main()
{
	scanf("%d %d",&k,&n);
	long long init=0,ans=(1LL<<60);
	for(int i=0;i<n;i++)
	{
		char s,t;
		int x,y;
		scanf(" %c %d %c %d",&s,&x,&t,&y);
		if(s==t) init+=abs(x-y);
		else v.push_back({x,y});
	}
	n=v.size();
	sort(v.begin(),v.end(),cmp);
	init+=n;
	median l,r;
	for(int i=0;i<n;i++)
	{
		r.insert(v[i].F);
		r.insert(v[i].S);
	}
	ans=r.rsum-r.lsum;
	//cout << r.med << endl;
	/*for(auto i:r.l)
		cout << i << " ";
	cout << endl;
	for(auto i:r.r)
		cout << i << " ";
	cout << endl;*/
	if(k==2)
	{
		for(int i=0;i<n;i++)
		{
			r.erase(v[i].F); l.insert(v[i].F);
			r.erase(v[i].S); l.insert(v[i].S);
			ans=min(ans,(r.rsum-r.lsum)+(l.rsum-l.lsum));
		}
	}
	cout << ans+init << endl;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:76:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&k,&n);
  ~~~~~^~~~~~~~~~~~~~~
bridge.cpp:82:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c %d %c %d",&s,&x,&t,&y);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...