結果
| 問題 |
No.1031 いたずら好きなお姉ちゃん
|
| コンテスト | |
| ユーザー |
Rho
|
| 提出日時 | 2020-04-16 22:37:52 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 501 ms / 3,500 ms |
| コード長 | 1,576 bytes |
| コンパイル時間 | 1,706 ms |
| コンパイル使用メモリ | 180,064 KB |
| 実行使用メモリ | 13,616 KB |
| 最終ジャッジ日時 | 2024-10-03 03:21:25 |
| 合計ジャッジ時間 | 17,792 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 53 |
ソースコード
#include"bits/stdc++.h"
using namespace std;
#define int long long
#define rep(i,n) for(int i=0;i<n;i++)
const long long inf = 1e17;
typedef pair<int, int> P;
int p[100006];
vector<P>seg[400];
int segmax[400];
int n, k, sqrtN;
void maekei() {
rep(i, k) {
for (int j = i*sqrtN; j < min((i + 1)*sqrtN, n); j++) {
segmax[i] = max(segmax[i], p[j]);
int cnt = 0, mn = p[j];
for (int l = i*sqrtN; l < min((i + 1)*sqrtN, n); l++) {
if (mn <= p[l]) {
cnt++;
mn = p[l];
}
}
seg[i].push_back(P(p[j], cnt));
}
sort(seg[i].begin(), seg[i].end());
}
}
int calseg(int l, int r) {
int mx = p[l];
int ans = 0;
rep(i, k) {
int L = i*sqrtN, R = (i + 1)*sqrtN;
if (R <= l || r <= L)continue;
if (l <= L&&R <= r) {
auto p = lower_bound(seg[i].begin(), seg[i].end(), P(mx, inf));
if (p != seg[i].end()) {
ans += (*p).second;
mx = segmax[i];
}
}
else {
for (int j = max(L, l); j < min(R, r); j++) {
if (mx < p[j]) {
ans++;
mx = p[j];
}
}
}
}
return ans;
}
int divseg() {
int res = 0;
maekei();
vector<P>V;
rep(i, n)V.push_back(P(p[i], i));
sort(V.begin(), V.end());
set<int>S;
S.insert(n);
rep(i, n) {
int r = *S.lower_bound(V[i].second);
res += calseg(V[i].second, r);
S.insert(V[i].second);
}
return res;
}
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> n;
sqrtN = sqrt(n);
k = (n + sqrtN - 1) / sqrtN;
rep(i, n)cin >> p[i];
int res=divseg();
reverse(p, p + n);
rep(i,400) {
seg[i].clear();
segmax[i] = 0;
}
res += divseg();
cout << res << endl;
}
Rho