結果

問題 No.2374 ASKT Subsequences
ユーザー erbowl
提出日時 2023-07-07 23:05:06
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 4,576 bytes
コンパイル時間 2,133 ms
コンパイル使用メモリ 202,928 KB
最終ジャッジ日時 2025-02-15 08:20:31
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 23 TLE * 2 -- * 3
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

typedef long long ll;
typedef long double ld;
#include <bits/stdc++.h>
using namespace std;
#define int long long
// Segment Tree
template<class Monoid> struct SegTree {
using Func = function<Monoid(Monoid, Monoid)>;
// core member
int SIZE;
Func F;
Monoid IDENTITY;
// data
int offset;
vector<Monoid> dat;
// constructor
SegTree() {}
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 True
int 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^e
return SIZE;
}
// get min l that f(get(l, r)) = True (0-indexed), O(log N)
// f(IDENTITY) need to be True
int 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;
}
// debug
friend 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++) {
multiset<ll> ms;
// SegTree<ll> seg(n,[](ll a, ll b){return a+b;},0ll);
for (int j = i+1; j < n; j++) {
if(ms.find(j)!=ms.end())ms.erase(j);
if(a[i]+10==a[j]){
ans += ms.size();
}
for (auto e : p[j]) {
if(a[j]>=a[i]+11){
ms.insert(e);
}
}
}
}
std::cout << ans << std::endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0