This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |