結果
問題 | No.2374 ASKT Subsequences |
ユーザー |
|
提出日時 | 2023-07-07 23:10:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,633 bytes |
コンパイル時間 | 2,096 ms |
コンパイル使用メモリ | 199,684 KB |
最終ジャッジ日時 | 2025-02-15 08:24:06 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 TLE * 1 -- * 3 |
ソースコード
typedef long long ll;typedef long double ld;#include <bits/stdc++.h>using namespace std;#define int long long// Segment Treetemplate<class Monoid> struct SegTree {using Func = function<Monoid(Monoid, Monoid)>;// core memberint SIZE;Func F;Monoid IDENTITY;// dataint offset;vector<Monoid> dat;// constructorSegTree() {}SegTree(int n, const Func &f, const Monoid &identity): SIZE(n), F(f), IDENTITY(identity) {offset = 1;while (offset < n) offset *= 2;dat.assign(offset * 2, IDENTITY);}void init(int n, const Func &f, const Monoid &identity) {SIZE = n;F = f;IDENTITY = identity;offset = 1;while (offset < n) offset *= 2;dat.assign(offset * 2, IDENTITY);}int size() const { return SIZE; }// set, a is 0-indexed //// build(): O(N)void set(int a, const Monoid &v) { dat[a + offset] = v; }void build() {for (int k = offset - 1; k > 0; --k)dat[k] = F(dat[k*2], dat[k*2+1]);}void build(const vector<Monoid> &vec) {for (int a = 0; a < vec.size() && a + offset < dat.size(); ++a)set(a, vec[a]);build();}// update a, a is 0-indexed, O(log N)void update(int a, const Monoid &v) {int k = a + offset;dat[k] = v;while (k >>= 1) dat[k] = F(dat[k*2], dat[k*2+1]);}// get [a, b), a and b are 0-indexed, O(log N)Monoid get(int a, int b) {Monoid vleft = IDENTITY, vright = IDENTITY;for (int left = a + offset, right = b + offset; left < right;left >>= 1, right >>= 1) {if (left & 1) vleft = F(vleft, dat[left++]);if (right & 1) vright = F(dat[--right], vright);}return F(vleft, vright);}Monoid get_all() { return dat[1]; }Monoid operator [] (int a) const { return dat[a + offset]; }// get max r that f(get(l, r)) = True (0-indexed), O(log N)// f(IDENTITY) need to be Trueint max_right(const function<bool(Monoid)> f, int l = 0) {if (l == SIZE) return SIZE;l += offset;Monoid sum = IDENTITY;do {while (l % 2 == 0) l >>= 1;if (!f(F(sum, dat[l]))) {while (l < offset) {l = l * 2;if (f(F(sum, dat[l]))) {sum = F(sum, dat[l]);++l;}}return l - offset;}sum = F(sum, dat[l]);++l;} while ((l & -l) != l); // stop if l = 2^ereturn SIZE;}// get min l that f(get(l, r)) = True (0-indexed), O(log N)// f(IDENTITY) need to be Trueint min_left(const function<bool(Monoid)> f, int r = -1) {if (r == 0) return 0;if (r == -1) r = SIZE;r += offset;Monoid sum = IDENTITY;do {--r;while (r > 1 && (r % 2)) r >>= 1;if (!f(F(dat[r], sum))) {while (r < offset) {r = r * 2 + 1;if (f(F(dat[r], sum))) {sum = F(dat[r], sum);--r;}}return r + 1 - offset;}sum = F(dat[r], sum);} while ((r & -r) != r);return 0;}// debugfriend ostream& operator << (ostream &s, const SegTree &seg) {for (int i = 0; i < seg.size(); ++i) {s << seg[i];if (i != seg.size()-1) s << " ";}return s;}};signed main(){ll n;std::cin >> n;vector<ll> a(n);vector<vector<ll>> p(n);//,p10(n);for (int i = 0; i < n; i++) {std::cin >> a[i];}for (int i = 0; i < n; i++) {for (int j = i+1; j < n; j++) {if(a[i]+1==a[j]){p[i].push_back(j);}}}ll ans = 0;for (int i = 0; i < n; i++) {priority_queue<ll,vector<ll>,greater<ll>> pq;// multiset<ll> ms;// SegTree<ll> seg(n,[](ll a, ll b){return a+b;},0ll);for (int j = i+1; j < n; j++) {while(pq.size()&&pq.top()<=j)pq.pop();if(a[i]+10==a[j]){ans += pq.size();}for (auto e : p[j]) {if(a[j]>=a[i]+11){pq.push(e);}}}}std::cout << ans << std::endl;}