AtCoder Beginner Contest 045(ABCD)题解

A - Trapezoids

思路:求梯形面积,显然 s = ( a + b ) h 2 s=\dfrac{(a+b)h}{2} s=2(a+b)h

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
int main(){
int a,b,h;
cin>>a>>b>>h;
int x=(a+b)*h/2;
cout<<x<<endl;
return 0;
}

B - Card Game for Three (ABC Edit)

思路:显然用三个指针分别指向对应选手,然后根据题意模拟即可。

时间复杂度: O ( ∑ l e n s t r ) O(\sum len_{str}) O(∑lenstr)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
int main(){
string a,b,c;
cin>>a>>b>>c;
int i=0,j=0,k=0,id=0;
int x=a.size(),y=b.size(),z=c.size();
while(1){
if(i==x&&!id) return puts("A"),0;
else if(j==y&&id==1) return puts("B"),0;
else if(k==z&&id==2) return puts("C"),0;
if(!id) id=a[i]-'a',i++;
else if(id==1) id=b[j]-'a',j++;
else if(id==2) id=c[k]-'a',k++;
}
return 0;
}

C - Many Formulas

思路: l e n ≤ 10 len\leq10 len≤10,显然暴力计算所有情况,用位运算暴力枚举求和即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
ll num[15];
int main(){
string a;
cin>>a;
int n=a.size();
for(int i=1;i<=n;i++) num[i]=a[i-1]-'0';
ll s=0;
for(int i=0;i<(1<<(n-1));i++){
ll x=num[1];
for(int j=0;j<n-1;j++){
if(i&(1<<j)){
s+=x,x=num[j+2];
}
else x=x*10+num[j+2];
}
if(x) s+=x,x=0;
}
printf("%lld\n",s);
return 0;
}

D - Snuke’s Coloring

思路:我们考虑每个格子作为左上角时会产生什么样的 3 × 3 3\times3 3×3方阵,显然对于每一个 a i , b i a_i,b_i ai,bi,我们把包含 ( a i , b i ) (a_i,b_i) (ai,bi)且作为左上角的格子贡献 + + ++ ++,然后对所有格子排个序,从左上角开始计算,计算当前格子有多少贡献即可,至于求 0 0 0个黑格的方阵,可以用所有的 3 × 3 3\times3 3×3方阵个数减去 1 − 9 1-9 1−9的 3 × 3 3\times3 3×3方阵个数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
PII a[N];
int cnt,ans[N];
int main(){
int h,w,n;
scanf("%d%d%d",&h,&w,&n);
for(int i=1;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
for(int r=x-2;r<=x;r++)
for(int c=y-2;c<=y;c++)
if(r>0&&c>0&&r+2<=h&&c+2<=w)
a[cnt++]={r,c};
}
sort(a,a+cnt);
for(int i=0,j;i<cnt;){
j=i+1;
int x=a[i].fi,y=a[i].se;
while(j<cnt&&x==a[j].fi&&y==a[j].se) j++;
ans[j-i]++;
i=j;
}
ll s=1LL*(h-2)*(w-2);
for(int i=1;i<10;i++) s-=ans[i];
printf("%lld\n",s);
for(int i=1;i<10;i++) printf("%d\n",ans[i]);
return 0;
}