【ABC411】AtCoder Beginner Contest 411【C++】

### コンテスト名
ユニークビジョンプログラミングコンテスト2025 夏（AtCoder Beginner Contest 411）

### コンテストURL
https://atcoder.jp/contests/abc411

### 開催日
2025/06/21 21:00–22:40

---

## [A: Required Length](https://atcoder.jp/contests/abc411/tasks/abc411_a)
**解法**
- 問題文通りに判定する
```cpp:ABC411A.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    string p;
    cin >> p;
    int l;
    cin >> l;

    if(p.size()>=l){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

    return 0;
}
```

## [B: Distance Table](https://atcoder.jp/contests/abc411/tasks/abc411_b)
**解法**
- 累積和
```cpp:ABC411B.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<int> D(n);
    for(int i=0; i<n-1; i++){
        cin >> D[i+1];
    }

    for(int i=0; i<n-1; i++){
        D[i+1] += D[i];
    }

    for(int i=0; i<n; i++){
        for(int j=i+1; j<n; j++){
            if(j!=i+1){
                cout << " ";
            }
            cout << D[j] - D[i];
        }
        cout << '\n';
    }

    return 0;
}
```

## [C: Black Intervals](https://atcoder.jp/contests/abc411/tasks/abc411_c)
**解法**
- 反転するマスの両隣のマスの色によって、黒く塗られたマスが連続している区間の個数の増減が決定する
```cpp:ABC411C.cpp
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n, q;
    cin >> n >> q;

    int a;
    int cnt = 0;
    vector<int> V(n);
    for(int i=0; i<q; i++){
        cin >> a;
        a--;

        if(V[a]==0){
            V[a] = 1;

            if(n==1){
                cnt++;
            }else if(a==0){
                if(V[a+1]==0){
                    cnt++;
                }
            }else if(a==n-1){
                if(V[a-1]==0){
                    cnt++;
                }
            }else if(V[a-1]==0 && V[a+1]==0){
                cnt++;
            }else if(V[a-1]==1 && V[a+1]==1){
                cnt--;
            }
        }else if(V[a]==1){
            V[a] = 0;

            if(n==1){
                cnt--;
            }else if(a==0){
                if(V[a+1]==0){
                    cnt--;
                }
            }else if(a==n-1){
                if(V[a-1]==0){
                    cnt--;
                }
            }else if(V[a-1]==0 && V[a+1]==0){
                cnt--;
            }else if(V[a-1]==1 && V[a+1]==1){
                cnt++;
            }
        }

        cout << cnt << '\n';
    }

    return 0;
}
```

## [D: Conflict 2](https://atcoder.jp/contests/abc411/tasks/abc411_d)
**解法**
- クエリを後ろから順に処理する
```cpp:ABC411D.cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <tuple>
using namespace std;

int main(){
    int n, q;
    cin >> n >> q;

    int num, p;
    string s;
    vector<tuple<int, int, string>> V;
    for(int i=0; i<q; i++){
        cin >> num;

        if(num==1){
            cin >> p;
            
            V.emplace_back(1, p, "NO");
        }else if(num==2){
            cin >> p >> s;
            
            reverse(s.begin(), s.end());
            V.emplace_back(2, p, s);
        }else if(num==3){
            cin >> p;
            
            V.emplace_back(3, p, "NO");
        }
    }

    string ans = "";
    int idx = 0;
    for(int i=q-1; i>=0; i--){
        auto [num, p, s] = V[i];

        if(num==1){
            if(idx==p){
                idx = 0;
            }
        }else if(num==2){
            if(idx==p){
                ans += s;
            }
        }else if(num==3){
            if(idx==0){
                idx = p;
            }
        }
    }

    reverse(ans.begin(), ans.end());
    cout << ans << endl;

    return 0;
}
```