个人题解 |
相遇
https://ac.nowcoder.com/acm/contest/83687/A
手速场,做完签到就不会了,我好菜啊
A.
签到
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int a,b;
cin>>a>>b;
if(a==1&&b==2||a==2&&b==3||a==3&&b==1){
cout<<'a';
}
else if(a==b){
cout<<'p';
}
else{
cout<<'b';
}
return 0;
}
B
签到,有两种走法:沿着a出去然后沿着b走一圈,或者沿着a来来回回
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll a,b;
cin>>a>>b;
if(a+b*5>a*11)cout<<a*11;
else cout<<a+5*b;
return 0;
}
C
n=1和a[n]=a[1]的情况特判一下,然后因为只有0和1,所以可以O(n)跑一遍:当某个点满足a[1]=a[i]且a[i+1]=a[n]的时候就得到答案2,否则无解
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[500005];
ll prex[2][500005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0) prex[0][i]=1;
else prex[1][i]=1;
}
if(n==1){
cout<<-1<<'\n';
return 0;
}
if(a[1]==a[n]){cout<<1;return 0;}
for(int i=2;i<=n-2;i++){
if(a[1]==a[i]&&a[i+1]==a[n]){
//cout<<i<<'\n';
cout<<2;
return 0;
}
}
cout<<-1;
return 0;
}
D.
差分
每次扔下炸弹时,对波及的每一行+1-1差分,最后求一遍前缀和,为奇数说明此处进行奇数次异或,则为1;偶数反之。 复杂度O(mn)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int mp[4000][4000];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,r;
cin>>x>>y>>r;
int n1=r,n2=r-1;
for(int i=x;i>=1&&i>=x-r;i--){
int l1=max(1,y-n1),r1=min(n+1,y+n1+1);
mp[i][l1]+=1;
mp[i][r1]-=1;
n1--;
}
for(int i=x+1;i<=n&&i<=x+r;i++){
int l1=max(1,y-n2),r1=min(n+1,y+n2+1);
mp[i][l1]+=1;
mp[i][r1]-=1;
n2--;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n-1;j++){
mp[i][j+1]+=mp[i][j];
}
}
int num=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]%2==1){
num++;
}
}
}
cout<<num<<'\n';
return 0;
}
EFG都没做出来,感觉E是建边跑最短路,但边的处理有点麻烦 我还是太菜了...