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 }
View Code

相关文章: