結果
| 問題 |
No.1188 レベルX門松列
|
| コンテスト | |
| ユーザー |
longrun
|
| 提出日時 | 2020-08-22 17:22:54 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,367 bytes |
| コンパイル時間 | 3,029 ms |
| コンパイル使用メモリ | 204,476 KB |
| 最終ジャッジ日時 | 2025-01-13 10:36:16 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 7 WA * 14 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep2(i,m,n) for (int i = (m); i < (n); ++i)
#define rep(i,n) rep2(i,0,n)
typedef long long int ll;
typedef long double ld;
typedef pair<int, int> P;
template<typename T> struct V : vector<T> { using vector<T>::vector; };
V() -> V<int>;
V(size_t) -> V<int>;
template<typename T> V(size_t, T) -> V<T>;
template<typename T> vector<T> make_vec(size_t n, T a) { return vector<T>(n, a); }
template<typename... Ts> auto make_vec(size_t n, Ts... ts) { return vector<decltype(make_vec(ts...))>(n, make_vec(ts...)); }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << ' '; return os; }
struct fast_ios { fast_ios(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
const int INF = 1<<30;
const ll LINF = 1LL<<61;
struct BIT
{
int n;
vector<long long> bit;
BIT(int nodesize)
{
n = nodesize;
bit.assign(n+1, 0);
}
BIT(const vector<long long> &arr)
{
n = arr.size();
bit.assign(n+1, 0);
for(int i = 0; i < arr.size(); i++)
{
add(i+1,arr[i]);
}
}
//[1,i], 1-indexed
long long func(int i)
{
long long s = 0;
while(i > 0)
{
s += bit[i];
i -= i & -i;
}
return s;
}
//[l,r], 1-indexed
long long sum(int l, int r)
{
if(r < l) return 0;
return func(r) - func(l-1);
}
void add(int i, long long x)
{
while(i <= n)
{
bit[i] += x;
i += i & -i;
}
}
};
int main()
{
int n;
cin >> n;
V tmp(n), a(n);
rep(i,n) cin >> tmp[i];
rep(i,n) a[i] = tmp[i];
sort(tmp.begin(), tmp.end());
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
rep(i,n)
{
a[i] = lower_bound(tmp.begin(), tmp.end(), a[i]) - tmp.begin() + 1;
}
// cout << a << endl;
V<ll> cnt_left(n+1, 0), inc_left(n), dec_left(n);
BIT bit_left(n);
rep(i,n)
{
if(i > 0 && cnt_left[a[i-1]] == 0)
{
cnt_left[a[i-1]] = 1;
bit_left.add(a[i-1], 1);
}
dec_left[i] = bit_left.sum(1, a[i]-1);
inc_left[i] = bit_left.sum(a[i]+1, n);
}
reverse(a.begin(), a.end());
V<ll> cnt_right(n+1, 0), inc_right(n), dec_right(n);
BIT bit_right(n);
rep(i,n)
{
if(i > 0 && cnt_right[a[i-1]] == 0)
{
cnt_right[a[i-1]] = 1;
bit_right.add(a[i-1], 1);
}
dec_right[i] = bit_right.sum(1, a[i]-1);
inc_right[i] = bit_right.sum(a[i]+1, n);
}
reverse(dec_right.begin(), dec_right.end());
reverse(inc_right.begin(), inc_right.end());
// cout << cnt_left << endl;
// cout << cnt_right << endl;
// cout << dec_left << endl;
// cout << dec_right << endl;
// cout << endl;
// cout << inc_left << endl;
// cout << inc_right << endl;
int ans = 0;
rep(i,n)
{
chmax(ans, min(dec_left[i], dec_right[i]));
chmax(ans, min(inc_left[i], inc_right[i]));
}
cout << ans << endl;
return 0;
}
longrun