Max Min
問題
E – Max Min
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/4/12 しゃくとり法がうまく実装できなかった。
- 2022/4/10 リアルタイム参加 解法わからず。
解法
- しゃくとり法(あとで書く)
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; int main() { int N, X, Y; cin >> N >> X >> Y; vector<int> A(N); rep(i, N) { cin >> A[i]; } vector<vector<int>> v; vector<int> v_; rep(i, N) { if (Y <= A[i] && A[i] <= X) { v_.push_back(A[i]); } else { if (0 < v_.size()) { v.push_back(v_); } v_.clear(); } } if (0 < v_.size()) { v.push_back(v_); } ll ans = 0; for(auto a: v) { int n = a.size(); int L = 0; int R = 0; int cntX = 0; int cntY = 0; ll res = 0; while(L < n) { while(R < n && (cntX == 0 || cntY == 0)) { if (a[R] == X) { cntX += 1; } if (a[R] == Y) { cntY += 1; } R += 1; } if (0 < cntX && 0 < cntY) { res += ll(n + 1 - R); } if (a[L] == X) { cntX -= 1; } if (a[L] == Y) { cntY -= 1; } L += 1; } ans += res; } cout << ans << endl; return 0; }