A. Metro
题解:水题。然而我理解错题意了,我枯了QAQ…还以为必须从 b [ s ] b[s] b[s]下,结果是只要在 s s s下即可…
代码
#include<bits/stdc++.h>
using namespace std;
int a[10010],b[10010];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int n,s;
cin>>n>>s;
for(int i = 1; i <= n; ++i) {
cin>>a[i];
}
for(int i = 1; i <= n; ++i) {
cin>>b[i];
}
if(!a[1] || (!a[s] &&!b[s])) return puts("NO"),0;
if(a[s]) return puts("YES"),0;
for(int i = s; i <= n; ++i) {
if(a[i] == 1 && b[i] == 1 && b[s] == 1) {
puts("YES");
return 0;
}
}
puts("NO");
return 0;
}
B. Alice and Hairdresser
题解:其实只要判断左右端点即可。先预处理初始的刘海需要剪几刀。其次后面的 m m m行对于操作 1 1 1,如果左右端点可以连上,那么就可以将之前的两刀归为一刀,如果连不上就加一刀,如果只连一端那么就可以和已有的刀归为一起。
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N = 100100;
bool vis[N];
int a[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int n,m,l,cnt = 0;
scanf("%d%d%d",&n,&m,&l);
for(int i = 1; i <= n; ++i) {
scanf("%d",a + i);
if(a[i] > l) {
vis[i] = 1;
if(!vis[i - 1]) cnt++;
}
}
int op = 0, p, d;
for(int i = 0; i < m; ++i) {
scanf("%d",&op);
if(!op) printf("%d\n", cnt);
else{
scanf("%d%d",&p, &d);
a[p] += d;
if(!vis[p] && a[p] > l) {
vis[p] = 1;
if(vis[p - 1] && vis[p + 1])
cnt--;
else if(!vis[p - 1] && !vis[p + 1])
cnt++;
}
}
}
return 0;
}