# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
199017 | dolphingarlic | Zoltan (COCI16_zoltan) | C++14 | 273 ms | 21360 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;
const ll MOD = 1e9 + 7;
int n, a[200001], g_len[200001];
ll pw[200001], g_num[200001];
vector<int> uniq;
pair<int, ll> lis[200001], lds[200001];
map<int, int> mp;
void update(int pos, int len, ll num) {
for (; pos <= n; pos += (pos & (-pos))) {
if (g_len[pos] == len) {
g_num[pos] = (g_num[pos] + num) % MOD;
} else if (g_len[pos] < len) {
g_len[pos] = len;
g_num[pos] = num;
}
}
}
pair<int, ll> query(int pos) {
pair<int, ll> ans;
for (; pos; pos -= (pos & (-pos))) {
if (g_len[pos] == ans.first) {
ans.second = (ans.second + g_num[pos]) % MOD;
} else if (g_len[pos] > ans.first) {
ans = {g_len[pos], g_num[pos]};
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
pw[0] = 1;
FOR(i, 1, n + 1) {
cin >> a[i];
pw[i] = (pw[i - 1] << 1) % MOD;
uniq.push_back(a[i]);
}
sort(uniq.begin(), uniq.end());
uniq.erase(unique(uniq.begin(), uniq.end()), uniq.end());
FOR(i, 0, uniq.size()) mp[uniq[i]] = i + 1;
FOR(i, 1, n + 1) a[i] = mp[a[i]];
FOR(i, 1, (n + 1) / 2 + 1) swap(a[i], a[n - i + 1]);
FOR(i, 1, n + 1) {
int len;
ll num;
tie(len, num) = query(a[i]);
if (!len) num = 1;
len++;
lis[i] = {len, num};
update(a[i] + 1, len, num);
}
FOR(i, 1, n + 1) a[i] = n - a[i] + 1, g_num[i] = g_len[i] = 0;
FOR(i, 1, n + 1) {
int len;
ll num;
tie(len, num) = query(a[i]);
if (!len) num = 1;
len++;
lds[i] = {len, num};
update(a[i] + 1, len, num);
}
int ans = -1;
ll a_num = -1;
FOR(i, 1, n + 1) {
int len = lis[i].first + lds[i].first - 1;
ll num = (pw[n - len] * (lis[i].second * lds[i].second) % MOD) % MOD;
if (len == ans) {
a_num = (a_num + num) % MOD;
} else if (len > ans) {
ans = len;
a_num = num;
}
}
cout << ans << ' ' << a_num;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |