Mail.Ru Cup 2018 Round 2 Solution

A. Metro

Solved.

题意:

有两条铁轨,都是单向的,一条是从左往右,一条是从右往左,Bob要从第一条轨道的第一个位置出发,Alice的位置处于第s个位置,有火车会行驶在铁轨上,一共有n个站点,1表示火车会在该站点停下,0表示不会,求Bob能否到达地s个位置(到达任意一边即可)

思路:

如果第一条铁轨的第一个位置为0,或者第s个位置的两条铁轨都不停,那么答案显然是$"No"$

再考虑第一条铁轨上所有为1的位置都可以到达

再考虑两条轨道是否有同一个站点都都会停下的,那么就可以到达第二条轨道,并且该站点的左边的会停下的站点都可以到达

再判断一下s站点有没有被标记即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define N 1010
 5 int n, s, a[N], b[N];
 6 int vis[N];
 7 
 8 bool solve()
 9 {
10     if (a[1] == 0) return false;
11     if (a[s] == 0 && b[s] == 0) return false;
12     for (int i = 1; i <= n; ++i) if (a[i]) vis[i] = 1;
13     bool flag = false;
14     for (int i = n; i >= 1; --i)
15     {
16         if (a[i] && b[i]) flag = 1;
17         if (flag && b[i]) vis[i] = 1; 
18     }
19     return vis[s];
20 }
21 
22 int main()
23 {
24     while (scanf("%d%d", &n, &s) != EOF)
25     {
26         memset(vis, 0, sizeof vis);
27         for (int i = 1; i <= n; ++i) scanf("%d", a + i);
28         for (int i = 1; i <= n; ++i) scanf("%d", b + i);
29         puts(solve() ? "YES" : "NO");    
30     }
31     return 0;
32 }
View Code

B. Alice and Hairdresser

Solved,

题意:

Alice有$n根头发,只有长度 > l 的头发才需要减,并且有相邻多根头发的长度都 > l,那么这几根可以一刀剪掉$

现在有两种操作,第一种是询问Alice如果要剪头发,最少需要减几刀,第二种是第$p$根头发增加了$d$的长度。

思路:

头发增加时,如果这根头发已经$ > l 了$ 那么不需要操作

反之,则判断一下,左右两边的头发长度

如果左右两边头发长度都$> l$ 那么下剪刀的次数 - 1  因为左右两边本来是两个连通块,现在连成一个。

如果有一边$ > l$ 有一边不是,那么下剪刀次数不变

如果两边都$ < l$ 那么下剪刀次数+1

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define ll long long
 5 #define N 100010
 6 int n, m, res; 
 7 ll l, a[N];
 8 
 9 int main()
10 {
11     while (scanf("%d%d%lld", &n, &m, &l) != EOF)
12     {
13         res = 0;
14         for (int i = 1; i <= n; ++i) 
15         {
16             scanf("%lld", a + i);
17             if (a[i] > l && a[i - 1] <= l) ++res; 
18         }
19         for (int i = 1, t, p, d; i <= m; ++i)
20         {
21             scanf("%d", &t);
22             if (t == 0) printf("%d\n", res);
23             else 
24             {
25                 scanf("%d%d", &p, &d);
26                 if (a[p] <= l && a[p] + d > l)  
27                 {
28                     if (a[p - 1] > l && a[p + 1] > l) --res;
29                     else if (a[p - 1] > l || a[p + 1] > l);
30                     else ++res;                    
31                 }
32                 a[p] += d;  
33             }
34         }
35     }
36     return 0;
37 }
View Code

C. Lucky Days

Unsolved.

题意:

定义一个三元组$<l, r, t>$ 表示一个周期为$t$,第$[l, r]$天里面是幸运天,现在给出$Alice 和 Bob$的两个三元组,求两人最长的连续相同的幸运天数。

D. Refactoring

Unsolved.

E. Segments on the Line

Unsolved.

F. Tree and XOR

Unsolved.

题意:

在一棵树种,一共有$n^2$个任意两点间的简单路径异或和,求第k大。

G. Jellyfish Nightmare

Unsolved.

猜你喜欢

转载自www.cnblogs.com/Dup4/p/9961425.html
今日推荐