Replay
Dup4:
- 要是不挂机,再多仔细想想就好了
- J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵?
- 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道
- 要发掘题目更多的性质和有用条件啊,算法和数据结构只是工具,不要总想着这是啥题这是啥题,我会不会,其实我啥都不会
X:
- 日常挂机时间久,感觉是个不好的习惯。
- 太久没写了,已经不会算复杂度了, TLE MLE到自闭,转身写了个dp就过了?
- 感觉太容易根据数据想算法了, 自导自演。
- 自导自演,顺便演了16的C,演技拉满
A:机器人
Upsolved.
思路:
考虑两种情况
第一种是$b区没有站点需要经过,并且在a区只有一侧有站点需要经过的话$
我们不需要走一个圈,直接从$s走出去到一个特殊点走回s即可$
还有一种就是走一个矩形
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define INF 0x3f3f3f3f 6 #define INFLL 0x3f3f3f3f3f3f3f3f 7 int n, r, m, k, s; 8 vector <int> v[2], p; 9 10 int main() 11 { 12 while (scanf("%d%d%d%d%d", &n, &r, &m, &k, &s) != EOF) 13 { 14 v[0].clear(); v[1].clear(); p.clear(); 15 for (int i = 1, x, y; i <= r; ++i) 16 { 17 scanf("%d%d", &x, &y); 18 v[y].push_back(x); 19 } 20 sort(v[0].begin(), v[0].end()); 21 sort(v[1].begin(), v[1].end()); 22 for (int i = 1, x; i <= m; ++i) 23 { 24 scanf("%d", &x); 25 p.push_back(x); 26 } 27 p.push_back(1); p.push_back(n); 28 sort(p.begin(), p.end()); 29 p.erase(unique(p.begin(), p.end()), p.end()); 30 int Max = 0; 31 int Min = INF; 32 if (!v[0].empty()) 33 { 34 Max = max(Max, *v[0].rbegin()); 35 Min = min(Min, *v[0].begin()); 36 } 37 if (!v[1].empty()) 38 { 39 Max = max(Max, *v[1].rbegin()); 40 Min = min(Min, *v[1].begin()); 41 } 42 int pos_Max = lower_bound(p.begin(), p.end(), Max) - p.begin(); 43 int pos_Min = upper_bound(p.begin(), p.end(), Min) - p.begin() - 1; 44 pos_Max = p[pos_Max]; 45 pos_Min = p[pos_Min]; 46 ll res = INFLL; 47 // b区不需要经过站点 48 if (v[1].empty()) 49 { 50 if (Max <= s) pos_Max = s; 51 if (Min >= s) pos_Min = s; 52 ll tmp = 2ll * (pos_Max - pos_Min); 53 res = min(res, tmp); 54 } 55 // 走矩形路线 56 if (!v[1].empty()) 57 { 58 ll tmp = 2ll * (pos_Max - pos_Min); 59 if (!v[1].empty()) tmp += 2ll * k; 60 if (s < pos_Min) 61 tmp += 2ll * (pos_Min - s); 62 if (s > pos_Max) 63 tmp += 2ll * (s - pos_Max); 64 res = min(res, tmp); 65 } 66 printf("%lld\n", res); 67 } 68 return 0; 69 }