Atcoder Beginner Contest250
A - Adjacent Squares
【思考過程】
1. 問題文見てもよく分からなかったので参考の図をみる
2. 隣合うタイルがあれば答えを1足せばいいっぽそうなのでif文4個書く
int main()
{
[[maybe_unused]]long long int i=0,j=0,h,w,r,c;
cin >> h >> w >> r >> c;
if(r-1!=0)
{
ans++;
}
if(c-1!=0)
{
ans++;
}
if(c+1!=w+1)
{
ans++;
}
if(r+1!=h+1)
{
ans++;
}
cout << ans;
}
ごり押し解法になってしまったけどもうちょっと綺麗にかけたかな?まあACしたのでよし。
B - Enlarged Checker Board
【思考過程】
1. これも問題文見てもよくわからなかったのでサンプルみる
2. マス目Xを白黒交互に出力すればよさそうなので、カウンタを$A、B$で割った答え(Xを何回出力したか)を2で割った余りで分岐させればよさそう
3. サンプルで試してみて問題なさそうなので提出
int main()
{
[[maybe_unused]]long long int i=0,j=0,n,a,b;
cin >> n >> a >> b;
for(i=0;i<n*a;i++)
{
if(i/a%2==0)
{
for(j=0;j<n*b;j++)
{
if(j/b%2==1)
{
cout << '#';
}
else
{
cout << '.';
}
}
}
else
{
for(j=0;j<n*b;j++)
{
if(j/b%2==0)
{
cout << '#';
}
else
{
cout << '.';
}
}
}
cout << endl;
}
}
C - Adjacent Swaps
【思考過程】
1. 愚直にシュミレートしていっても計算量は大体$2×10^5$なのでその方針でやってみる
2. 数字の場所が次々変わっていくので位置の情報が必要そう。$pair$を作って$first$に数字、$second$に位置を入れてあとからソートすれば行けそうなんで実装して試す
3.あれ?なんか合わない...。ちょっと待てこれじゃ隣の数字がずっと固定になるんだが。pairは情報二つ管理できてもアクセスはできないんだね...(ここまで15分ぐらい)。というわけで位置を管理する配列をつくる(実装に大体45分)
int main()
{
[[maybe_unused]]long long int i=0,j=0,n,p[210000],p1[210000];
cin >> n >> q;
rep(i,201000)
{
p[i]=i;
p1[i]=i;
}
for(i=1;i<=q;i++)
{
cin >> x;
if(p1[x]!=n)
{
c=p[p1[x]];
p[p1[x]]=p[p1[x]+1];
p[p1[x]+1]=c;
p1[x]++;
p1[p[p1[x]-1]]--;
}
else
{
c=p[p1[x]];
p[p1[x]]=p[p1[x]-1];
p[p1[x]-1]=c;
p1[x]--;
p1[p[p1[x]+1]]++;
}
}
for(i=1;i<=n;i++)
{
cout << p[i] << " ";
}
}
解法はすぐに思い浮かんだけど実装に時間がかかりすぎた...。
ややこしい実装は紙に書いて整理してからやったほうがよさそう。これ書いてるとき頭爆発しそうだったし
コンテストが終わってタイムラインを見ていたら、どうやらこういう問題はmap(データの紐づけができる)を使うと楽らしい。名前だけ知ってるけど全然勉強してないからやっとかないとなあ。
最終結果:3完600点、93分31秒、3593位、パフォーマンス673
レート変動:500→518(+18)
600パフォが続く日々。今回は実装でつまずいたのがよくなかったかな。思考を整理して紙に書く癖をつければ700ぐらい出せそうな気がする。D問題も見た感じ解けそうではあったし、Cが茶色下位程度ならA~Cまで30分ぐらいで解いてDを考える時間をつくっていきたい。