이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> ii;
int main()
{
//freopen("i.txt","r",stdin);
int k, n;
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> k >> n;
vector<ii> points;
long long forcedDist = 0ll;
for(int i = 0;i < n;i++){
char a, c;
long long b, d;
cin >> a >> b >> c >> d;
if(a == c){
forcedDist += abs(d-b);
}
else{
forcedDist += abs(d-b);
forcedDist++;
if(b > d) swap(b,d);
points.push_back(ii(b,i));
points.push_back(ii(d,i));
}
}
n = points.size();
sort(points.begin(),points.end());
for(int i = 0;i < n;i++){
//cout << points[i].first << " " << points[i].second << "\n";
}
long long passed = 0ll;
long long after = n/2;
set<long long> in;
long long preVal = 0ll;
long long val = 0ll;
for(int i = 0;i < n;i++){
if(in.find(points[i].second) != in.end()) continue;
in.insert(points[i].second);
val += points[i].first;
}
in.clear();
///val for putting bridge at 0;
long long minVal = val; ///need to times 2 later
for(int i = 0;i < n;i++){
long long diff = points[i].first - preVal;
if(in.find(points[i].second) == in.end()){
val += passed * diff;
val -= after * diff;
in.insert(points[i].second);
after--;
}
else{
val += passed * diff;
val -= after * diff;
in.erase(points[i].second);
passed++;
}
//cout << val << " " << passed << " " << after << " " << diff << "\n";
///std stuff
minVal = min(val,minVal);
preVal = points[i].first;
}
cout << minVal * 2ll + forcedDist;
return 0;
}
| # | 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... |