Submission #14386

#TimeUsernameProblemLanguageResultExecution timeMemory
14386woqja125Palembang Bridges (APIO15_bridge)C++14
100 / 100
109 ms5996 KiB
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<vector>
long long abs(long long x){return x>0?x:-x;}
void solve1();
void solve2();

struct person
{
	int l, r;
};
bool operator<(const person &A, const person &B){return A.l+A.r<B.l+B.r;}

int k, N=0;
long long ans=0;
person l[100001];
int main()
{
	int i, n;
	scanf("%d%d", &k, &n);
	char a[10], b[10];
	int aa, bb;
	for(i=1; i<=n; i++)
	{
		scanf("%s%d%s%d", a, &aa, b, &bb);
		ans += abs(aa-bb);
		if(a[0] != b[0])
		{
			N++;
			l[N].l = aa>bb?bb:aa;
			l[N].r = aa<bb?bb:aa;
			ans++;
		}
	}
	if(k==1) solve1();
	else solve2();
	printf("%lld\n", ans);
	return 0;
}

struct lineSet
{
	std::priority_queue<int> l;
	std::priority_queue<int, std::vector<int>, std::greater<int> > r;
	long long ans=0;
	void add(int ll, int rl);
};

void solve1()
{
	lineSet T;
	for(int i=1; i<=N; i++)
	{
		T.add(l[i].l, l[i].r);
	}
	ans += T.ans;
}

long long dp1[100010], dp2[100010];
void solve2()
{
	int i;
	std::sort(l+1, l+1+N);
	lineSet L, R;
	for(i=1; i<=N; i++)
	{
		L.add(l[i].l, l[i].r);
		dp1[i] = L.ans;
	}
	for(i=N; i>=1; i--)
	{
		R.add(l[i].l, l[i].r);
		dp2[i] = R.ans;
	}
	long long min = dp2[1];
	for(i=1; i<=N; i++)
	{
		if(min > dp1[i] + dp2[i+1]) min = dp1[i] + dp2[i+1];
	}
	ans += min;
}

void lineSet::add(int ll, int rl)
{
	l.push(ll); r.push(rl);
//	printf("##%d %d\n", ll, rl);
	while(1)
	{
		ll = l.top();
		rl = r.top();
//		printf("#%d %d\n", ll, rl);
		if(ll<=rl) return;
		l.pop(); r.pop();
		this->ans += (ll-rl)*2;
		l.push(rl); r.push(ll);
	}
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:21:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &k, &n);
                       ^
bridge.cpp:26:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s%d%s%d", a, &aa, b, &bb);
                                    ^
#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...