Submission #261075

#TimeUsernameProblemLanguageResultExecution timeMemory
261075user202729Palembang Bridges (APIO15_bridge)C++17
22 / 100
90 ms4216 KiB
// 4
#ifndef LOCAL
#define NDEBUG 1
#endif
#include<bits/stdc++.h>

int main(){
	std::ios::sync_with_stdio(0);std::cin.tie(0);
	int numBridge, numPeople; std::cin>>numBridge>>numPeople;
	int64_t base{};
	std::vector<std::pair<int, int>> terms; terms.reserve(numPeople);
	for(int _=0; _<numPeople; ++_){
		char side1, side2; int pos1, pos2;
		std::cin>>side1>>pos1>>side2>>pos2;
		std::tie(pos1, pos2)=std::minmax({pos1, pos2});
		if(side1==side2) base+=pos2-pos1;
		else {
			base+=pos2-pos1+1;
			terms.push_back({pos1, pos2});
		}
	}
	assert((int)terms.size()<=numPeople);
	if(terms.empty()){std::cout<<base<<'\n'; return 0;}

	std::vector<int> positions; positions.reserve(terms.size()*2);
	for(auto [first, sec]: terms){
		positions.push_back(first); positions.push_back(sec);
	}
	std::sort(begin(positions), end(positions));
	positions.erase(std::unique(begin(positions), end(positions)), end(positions));

	auto const calculate=[&](int pos){
		int64_t result{};
		for(auto [first, sec]: terms){
			if(pos<first) result+=first-pos;
			else if(pos>sec) result+=pos-sec;
		}
		return result*2;
	};

	if(numBridge==1){
		int index=0; auto curValue=calculate(positions[0]);
		for(int step=1<<30; step>>=1;){
			auto const check=[&](int next){
				if((unsigned) next<positions.size()){
					auto const nextValue=calculate(positions[next]);
					if(nextValue<curValue){index=next; curValue=nextValue;}
				}
			};
			check(index-step); check(index+step);
		}
		std::cout<<curValue+base<<'\n';
	}
}
#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...