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

相关文章: