# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
97932 | szawinis | Zoltan (COCI16_zoltan) | C++17 | 184 ms | 33792 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
const int N = 4e5+1;
struct Fenwick {
vector<int> f;
Fenwick() {}
void clear(int n) {
f.assign(n+2, 0);
}
void update(int i, int v) {
++i;
while(i < f.size()) {
f[i] += v;
f[i] %= MOD;
i += i & -i;
}
}
int query(int i) {
++i;
int ret = 0;
while(i > 0) {
ret += f[i];
ret %= MOD;
i -= i & -i;
}
return ret;
}
};
int len[N];
vector<int> f, ls[N];
Fenwick dp[N];
pair<int, int> count_LIS(vector<int> a) {
fill(len, len+a.size()+1, 0);
int LIS = 0;
for(int i = 0; i < a.size(); i++) {
int x = a[i];
auto it = lower_bound(f.begin(), f.end(), x);
len[i] = it - f.begin() + 1;
LIS = max(len[i], LIS);
if(it == f.end())
f.push_back(x);
else
*it = x;
}
ls[0].push_back(0);
for(int i = 0; i < a.size(); i++)
ls[len[i]].push_back(a[i]);
for(int i = 0; i <= a.size(); i++) {
sort(ls[i].begin(), ls[i].end());
ls[i].resize(unique(ls[i].begin(), ls[i].end()) - ls[i].begin());
}
for(int i = 0; i <= a.size(); i++) {
dp[i].clear(ls[i].size() + 1);
}
dp[0].update(0, 1);
for(int i = 0; i < a.size(); i++) { // problems are here?
auto it = lower_bound(ls[len[i] - 1].begin(), ls[len[i] - 1].end(), a[i]);
int res = dp[len[i] - 1].query(it - ls[len[i] - 1].begin() - 1);
auto it2 = lower_bound(ls[len[i]].begin(), ls[len[i]].end(), a[i]);
dp[len[i]].update(it2 - ls[len[i]].begin(), res);
}
return {dp[LIS].query(ls[LIS].size() - 1), LIS};
}
void solve(istream &cin) {
int n;
cin >> n;
vector<int> a(2*n - 1);
for(int i = 0; i < n; i++) cin >> a[i];
// for(int x: a) cout << x << ' ';
// cout << endl;
reverse(a.begin(), a.begin() + n);
for(int i = n-2, curr = 0; i >= 0; i--, curr++) a[n + curr] = a[i];
// for(int x: a) cout << x << ' ';
// cout << endl;
auto withStart = count_LIS(a);
a.erase(a.begin() + a.size() / 2);
// for(int x: a) cout << x << ' ';
// cout << endl;
auto withoutStart = count_LIS(a);
// cout << endl;
if(withStart.second == withoutStart.second) {
withStart.first -= withoutStart.first;
} else if(withStart.second > withoutStart.second){
withoutStart.first = 0;
} else {
assert(false);
}
for(int i = 0; i < n - withStart.second; i++) {
withStart.first *= 2;
withStart.first %= MOD;
}
for(int i = 0; i < n - withoutStart.second - 1; i++) {
withoutStart.first *= 2;
withoutStart.first %= MOD;
}
// cout << withStart.first << ' ' << withoutStart.first << endl;
cout << withStart.second << ' ' << (withStart.first + withoutStart.first) % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ifstream in("1.in");
solve(cin);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |