AtCoder Beginner Contest 047/AtCoder Regular Contest 063

はい。
https://beta.atcoder.jp/contests/abc047

A - キャンディーと2人の子供 / Fighting over Candies

C++14

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    vector<int> a(3);
    for (auto&e:a) {
        scanf("%d",&e);
    }
    sort(a.begin(),a.end());
    printf("%s\n",a[2]==a[1]+a[0]?"Yes":"No");
    return 0;
}

ソートして最大値と他2個の和が等しければ大丈夫だと思う。

B - すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit)

C++14

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    int mod=1000000007;
    int o=0,p=0,w,h,n,x,y,a;
    scanf("%d %d %d",&w,&h,&n);
    for (int i=0;i<n;i++) {
        scanf("%d %d %d",&x,&y,&a);
        if (a==1) o=max(o,x);
        if (a==2) w=min(w,x);
        if (a==3) p=max(p,y);
        if (a==4) h=min(h,y);
    }
    printf("%d\n",max(w-o,0)*max(h-p,0));
    return 0;
}

長方形の大きさは右下と左上の座標で決められる。塗りつぶし方によってそれぞれの座標を更新していって面積を計算する。

C - 一次元リバーシ / 1D Reversi

C++14

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    char s[100001];
    scanf("%s",s);
    int a,c=0,t;
    t=strlen(s);
    a=s[0]=='B'?0+'B':0+'W';
    for (int i=0;i<t;i++) {
        if (0+s[i]!=a) {
            c++;
            a=0+s[i];
        }
    }
    printf("%d\n",c);
    return 0;
}

すごい面倒に書いたけど実質隣同士で違うトコをチェックしてるだけですね。。それならi,i-1とかでチェックするだけで十分でしたね。

D - 高橋君と見えざる手 / An Invisible Hand

C++14

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
    int n,t,c=0,d=0,p,q,ans=0;
    scanf("%d %d",&n,&t);
    vector<int> a(n);
    for (auto&e:a) scanf("%d",&e);
    p=a[0];
    for (int i=1;i<n;i++) {
        p=min(p,a[i]);
        if (a[i]-p==d) {
            c++;
        } else if (a[i]-p>d) {
            c=1;
            d=a[i]-p;
        }
    }
    printf("%d\n",c);
    return 0;
}

左端から現在地までの最小値と差分を更新したり数えたりしたりとかで解決できるはず。入力のTは何の意味があるのか謎。解説にも登場しないですし。。