제출 #1207872

#제출 시각아이디문제언어결과실행 시간메모리
1207872emptypringlescanSightseeing in Kyoto (JOI22_kyoto)C++17
100 / 100
637 ms27052 KiB
#include <bits/stdc++.h>
using namespace std;
int n,m;
long long arr[2][100005];
int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> arr[0][i];
    for(int i=1; i<=m; i++) cin >> arr[1][i];
    set<int> alive[2];
    set<pair<long double,pair<int,int> > > all;
    for(int i=1; i<=n; i++){
		alive[0].insert(i);
		if(i>1) all.insert({(long double)(arr[0][i-1]-arr[0][i])/1,{0,i}});
	}
	for(int i=1; i<=m; i++){
		alive[1].insert(i);
		if(i>1) all.insert({(long double)(arr[1][i-1]-arr[1][i])/1,{1,i}});
	}
	long long ans=0;
	int l0=n,l1=m;
	while(l0!=1&&l1!=1){
		auto x=*all.begin();
		all.erase(all.begin());
		//cout << x.second.first << ' ' << x.second.second << '\n';
		if(x.second.first==0){
			alive[0].erase(x.second.second);
			if(x.second.second>*(--alive[0].end())){
				ans+=(long long)(x.second.second-*(--alive[0].end()))*arr[1][*(--alive[1].end())];
			}
			else{
				int y=*alive[0].lower_bound(x.second.second);
				int p=*(--alive[0].lower_bound(x.second.second));
				all.erase({(long double)(arr[0][x.second.second]-arr[0][y])/(y-x.second.second),{0,y}});
				all.insert({(long double)(arr[0][p]-arr[0][y])/(y-p),{0,y}});
			}
			l0--;
		}
		else{
			alive[1].erase(x.second.second);
			if(x.second.second>*(--alive[1].end())){
				ans+=(long long)(x.second.second-*(--alive[1].end()))*arr[0][*(--alive[0].end())];
			}
			else{
				int y=*alive[1].lower_bound(x.second.second);
				int p=*(--alive[1].lower_bound(x.second.second));
				all.erase({(long double)(arr[1][x.second.second]-arr[1][y])/(y-x.second.second),{1,y}});
				all.insert({(long double)(arr[1][p]-arr[1][y])/(y-p),{1,y}});
			}
			l1--;
		}
		//cout << ans << '\n';
	}
	if(l0==1){
		ans+=(*(--alive[1].end())-1)*arr[0][*(--alive[0].end())];
	}
	else{
		ans+=(*(--alive[0].end())-1)*arr[1][*(--alive[1].end())];
	}
	cout << ans;
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...