ZONeエナジー プログラミングコンテスト “HELLO SPACE”

##[A - UFO襲来](https://atcoder.jp/contests/zone2021/tasks/zone2021_a)

O(N)
全探索を行います。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; 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() {
    string s;
    cin >> s;
 
    int cnt=0;
    for(int i=0; i<12; i++){
        if(s.substr(i, 4) == "ZONe") cnt++;
    }
 
    cout << cnt << endl;
 
    return 0;
}
```

##[B - 友好の印](https://atcoder.jp/contests/zone2021/tasks/zone2021_b)

O(N)
２点間を通る直線と傾きの問題です。
最も大きい角度をH/Dとしてmax値にします。
y=a(x-x1)+y1とした時、y１=y-axを求める問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; 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;
    double D, H;
    cin >> N >> D >> H;
 
    vector<double> d(N), h(N);
    rep(i, N) cin >> d[i] >> h[i];
 
    double M = H / D;
    for(int i=0; i<N; i++){
        if(d[i] <= D){
            double m = (H - h[i]) / (D - d[i]);
            if(M >= m) M = min(M, m);
        }
    }
 
    double res = H - (M * D);
    cout << fixed_setprecision(4) << res << endl;
 
    return 0;
}
```

##[D - 宇宙人からのメッセージ](https://atcoder.jp/contests/zone2021/tasks/zone2021_d)

O(N)
Rの文字の度に文字列tのリバースを行うとTLEになります。
文字列tのリバースを行わずに処理を行う事がこの問題の１つ目の課題です。

２つ目は、同じ文字が２つ並んでいた場合、その２文字を削除をする事です。
５０００００の文字列を、その２文字を消しながら何回も全探索を行うとTLEになります。
2文字を判定できる箇所がどこかに隠れています。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; 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() {
    string s;
    cin >> s;
 
    bool cnt=false;
    string t;
    rep(i, s.length()){
        if(s[i] == 'R'){
            cnt=!cnt;
        }else{
            if(cnt==false){
                if(t[t.length()-1] == s[i]) t.erase(t.length()-1, 1);
                else t += s[i];
            }else{
                if(t[0] == s[i]) t.erase(0, 1);
                else t = s[i] + t;
            }
        }
    }
 
    if(cnt) reverse(t.begin(), t.end());
    cout << t << endl;
 
    return 0;
}
```