Replay
Dup4:
- 两轮怎么退火啊?
- 简单树形dp都不会了,送了那么多罚时
- 简单题都不想清楚就乱写了,喵喵喵?
X:
- 欧拉怎么回路啊, 不会啊。
- 还是有没有手误?未思考清楚或者未检查就提交, 导致自己白送罚时。
A:夺宝奇兵
Solved.
考虑$所有i >= 2 需要跟i - 1 连两条边 只有两种可能 取最小的一种$
$注意n的两个点要连一条边$
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 const int maxn = 1e5 + 10; 8 9 struct node{ 10 int x1, x2, y1, y2; 11 }arr[maxn]; 12 13 ll calc(int i,int j) 14 { 15 ll ans1 = abs(arr[i].x1 - arr[j].x1) + abs(arr[i].y1 - arr[j].y1) + abs(arr[i].x2 - arr[j].x2) + abs(arr[i].y2 - arr[j].y2); 16 ll ans2 = abs(arr[i].x1 - arr[j].x2) + abs(arr[i].y1 - arr[j].y2) + abs(arr[i].x2 - arr[j].x1) + abs(arr[i].y2 - arr[j].y1); 17 return min(ans1, ans2); 18 } 19 20 int n , m; 21 22 int main() 23 { 24 while(~scanf("%d %d", &n, &m)) 25 { 26 for(int i = 1; i <= n; ++i) scanf("%d %d %d %d", &arr[i].x1, &arr[i].y1, &arr[i].x2, &arr[i].y2); 27 ll ans = 0; 28 for(int i = 2; i <= n; ++i) ans += calc(i, i - 1); 29 ans += abs(arr[n].x1 - arr[n].x2) + abs(arr[n].y1 - arr[n].y2); 30 printf("%lld\n", ans); 31 } 32 return 0; 33 }