AtCoder Beginner Contest 278

## [A - Shift](https://atcoder.jp/contests/abc278/tasks/abc278_a)

O(N)
シミュレートしました。
先頭からpopし、最後尾に0を代入。
queueのデータ構造で良いと思います。

```c++:c++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int N, K;
    cin >> N >> K;
    queue<int> A;
    rep(i, N){
        int a;
        cin >> a;
        A.push(a);
    }

    rep(i, K){
        A.pop();
        A.push(0);
    }

    rep(i, N){
        int a = A.front();
        A.pop();
        cout << a;
        if(i < N -1) cout << ' ';
        else cout << endl;
    }

    return 0;
} 
```

## [B - Misjudge the Time](https://atcoder.jp/contests/abc278/tasks/abc278_b)

　O(N)

見間違えやすい時刻の計算式は以下になります。

```
th = h - h % 10 + m / 10;
tm = h % 10 * 10 + m % 10;
```

あとは条件を満たすまで時刻を加算するとできます。

```c++:c++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int h, m;
    cin >> h >> m;

    while(1){
        int th = h - h % 10 + m / 10;
        int tm = h % 10 * 10 + m % 10;

        if(th < 24 && tm < 60){
            cout << h << ' ' << m << endl;
            break;
        }

        m++;
        if(m>=60) m=0, h++;
        if(h>=24) h=0;
    }

    return 0;
} 
```

## [C - FF](https://atcoder.jp/contests/abc278/tasks/abc278_c)

O(NlogN)
無向グラフの問題です。
Aのユーザーのset(ハッシュ)にBのIDを追加しましょう。
この問題の難しさはユーザーの制約が　2<=N<=10^9であることです。
ユーザーの管理にもmap(ハッシュ)を使いましょう。

```c++:c++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }


int main() {
    int N, Q;
    cin >> N >> Q;
    vector<int> T(Q), A(Q), B(Q);
    rep(i, Q) cin >> T[i] >> A[i] >> B[i];

    map<int, set<int>> P;
    rep(i, Q){
        if(T[i] == 1){
            P[A[i]].insert(B[i]);
        }
        if(T[i] == 2){
            P[A[i]].erase(B[i]);
        }
        if(T[i] == 3){
            if(P[A[i]].find(B[i]) != P[A[i]].end() && P[B[i]].find(A[i]) != P[B[i]].end()) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }

    return 0;
} 
```

## [D - All Assign Point Add](https://atcoder.jp/contests/abc278/tasks/abc278_d)

O(N)
Qの回数だけ、Aの2×10^5の配列に値を代入するとTLEになります。
基礎となるxと、加算を管理するA(map)と分けると上手くできそうです。

１は、
xの数を保持します。
xの代入時にAのmapを全て破棄します。

2は、
A加算に必要な数をmapに保持します。

3は、
x + A[iq]で回答できます。

```c++:c++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N;
    cin >> N;
    map<ll, ll> A;
    rep(i, N){
        int a;
        cin >> a;
        A[i+1] = a;
    }

    ll Q, x = 0;
    cin >> Q;
    
    rep(i, Q){
        int t, iq, xq;
        cin >> t;

        if(t == 1){
            cin >> xq;
            x = xq;
            A.clear();
        }
        if(t == 2){
            cin >> iq >> xq;
            A[iq] += xq;
        }
        if(t == 3){
            cin >> iq;
            cout << x + A[iq] << endl;
        }
    }
    return 0;
} 
```