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 }
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 ", 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 }