답안 #17579

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
17579 2015-12-29T03:26:59 Z comet Palembang Bridges (APIO15_bridge) C++
0 / 100
0 ms 9000 KB
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cassert>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long ll;

int N,K,n;
struct pp{
	ll x,y;
	bool operator<(const pp& r)const{
		return x+y<r.x+r.y;
	}
}a[100010];

ll lu[200010];
int sz;

ll base;

ll sum[200010],cnt[200010];

ll L[100010],R[100010];

void add(ll tree[],int x,ll c){
	x++;
	while(x<sz){
		tree[x]+=c;
		x+=x&-x;
	}
}

ll query(ll tree[],int x){
	x++;
	ll ret=0;
	while(x){
		ret+=tree[x];
		x-=x&-x;
	}
	return ret;
}

void compress(){
	for(int i=0;i<n;i++){
		lu[sz++]=a[i].x;
		lu[sz++]=a[i].y;
	}
	sort(lu,lu+sz);
	sz=unique(lu,lu+sz)-lu;
	for(int i=0;i<n;i++){
		a[i].x=lower_bound(lu,lu+sz,a[i].x)-lu;
		a[i].y=lower_bound(lu,lu+sz,a[i].y)-lu;
	}
}

priority_queue<int> lo;
priority_queue<int,vector<int>,greater<int> > hi;

void init(){
	while(!lo.empty())lo.pop();
	while(!hi.empty())hi.pop();
	memset(sum,0,sizeof(sum));
	memset(cnt,0,sizeof(cnt));
}

void push(ll x,ll& Sum){
	Sum+=lu[x];
	add(sum,x,lu[x]);
	add(cnt,x,1);
	if(lo.empty())lo.push(x);
	else{
		if(lo.top()>=x)lo.push(x);
		else hi.push(x);
		while(hi.size()>lo.size()){
			ll t=hi.top();hi.pop();
			lo.push(t);
		}
		while(lo.size()>hi.size()+1){
			ll t=lo.top();lo.pop();
			hi.push(t);
		}
	}
}

ll getMid(){
	return lo.top();
}

void f(ll d[]){

	init();
	
	ll mid,loSum,loCnt,hiSum,hiCnt,Sum=0;

	for(int i=0;i<n;i++){
		push(a[i].x,Sum);
		push(a[i].y,Sum);
		
		mid = getMid();
		loSum = query(sum,mid);
		loCnt = query(cnt,mid);
		hiSum = Sum-loSum;
		hiCnt = (i+1)*2 - loCnt;
		d[i] = (lu[mid]*loCnt-loSum) + (hiSum-lu[mid]*hiCnt);

//		printf("mid : %lld(%lld)\n",mid,lu[mid]);
//		printf("%lld %lld %lld %lld : %lld\n",loSum,loCnt,hiSum,hiCnt,d[i]);
	}
}

void DM(){
	FILE* out = fopen(".in","w");
	srand(time(NULL));

	int N = rand()%10+2;
	fprintf(out,"%d %d\n",1,N);
	for(int i=0;i<N;i++){
		fprintf(out,"A %d A %d\n",rand()%10,rand()%10);
	}
	fclose(out);

	freopen(".in","r",stdin);

	scanf("%d%d",&K,&N);
	char t1,t2;
	ll x,y;
	for(int i=0;i<N;i++){
		scanf(" %c %lld %c %lld",&t1,&x,&t2,&y);
		if(t1!=t2){
			a[n].x=min(x,y);
			a[n++].y=max(x,y);
			base++;
		}else{
			base+=abs(x-y);
		}
	}

	if(n==0){
		printf("%lld",base);
		return;
	}

	compress();

	sort(a,a+n);

	ll ans=1e18;

	if(K==1){

		f(L);
		
		vector<ll> s;
		for(int i=0;i<n;i++){
			s.push_back(a[i].x);
			s.push_back(a[i].y);
		}
		sort(s.begin(),s.end());
		ans=0;
		for(int i=0;i<s.size();i++){
			ans+=abs(lu[s[i]]-lu[s[s.size()/2]]);
		}
		
		if(ans == L[n-1]){
			puts("Success!");
		}else{
			puts("Fail!");
			exit(0);
		}

	}else{
		f(L);
		reverse(a,a+n);
		f(R);
		for(int i=0;i<n-1;i++){
			ans = min(ans,L[i]+R[n-i-2]);
		}
		printf("%lld",ans+base);
	}
}

int main(){
/*
	int T=0;
	while(T++<10)DM();

	return 0;
*/
	//freopen(".in","r",stdin);

	scanf("%d%d",&K,&N);
	char t1,t2;
	ll x,y;
	for(int i=0;i<N;i++){
		scanf(" %c %lld %c %lld",&t1,&x,&t2,&y);
		if(t1!=t2){
			a[n].x=min(x,y);
			a[n++].y=max(x,y);
			base++;
		}else{
			base+=abs(x-y);
		}
	}

	if(n==0){
		printf("%lld\n",base);
		return 0;
	}

	compress();

	sort(a,a+n);

	ll ans=1e18;

	if(K==1){

		f(L);
		printf("%lld\n",ans+base);

	}else{
		f(L);
		reverse(a,a+n);
		f(R);
		for(int i=0;i<n-1;i++){
			ans = min(ans,L[i]+R[n-i-2]);
		}
		printf("%lld\n",ans+base);
	}

	return 0;
}

Compilation message

bridge.cpp: In function 'void DM()':
bridge.cpp:164:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<s.size();i++){
                ^
bridge.cpp:126:26: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  freopen(".in","r",stdin);
                          ^
bridge.cpp:128:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&K,&N);
                     ^
bridge.cpp:132:42: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c %lld %c %lld",&t1,&x,&t2,&y);
                                          ^
bridge.cpp: In function 'int main()':
bridge.cpp:195:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&K,&N);
                     ^
bridge.cpp:199:42: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c %lld %c %lld",&t1,&x,&t2,&y);
                                          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9000 KB Output is correct
2 Correct 0 ms 9000 KB Output is correct
3 Incorrect 0 ms 9000 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9000 KB Output is correct
2 Correct 0 ms 9000 KB Output is correct
3 Incorrect 0 ms 9000 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9000 KB Output is correct
2 Correct 0 ms 9000 KB Output is correct
3 Incorrect 0 ms 9000 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9000 KB Output is correct
2 Correct 0 ms 9000 KB Output is correct
3 Incorrect 0 ms 9000 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9000 KB Output is correct
2 Correct 0 ms 9000 KB Output is correct
3 Incorrect 0 ms 9000 KB Output isn't correct
4 Halted 0 ms 0 KB -