QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#246210 | #7729. Permutation Compression II | comeintocalm | TL | 2ms | 14336kb | C++17 | 1.8kb | 2023-11-10 17:20:47 | 2023-11-10 17:20:48 |
Judging History
answer
#include<bits/stdc++.h>
const int N = 1e6+7;
using namespace std;
const int U = 1e6;
int c[N], fr[N], ans[N], pos[N];
#define pii pair<int, int>
#define lbt(x) (x &(-x))
pii query(int x) {
pii a; a.first = a.second = 0;
if(!x) return a;
while(x > 0) {
if(c[x] > a.first) a.first = c[x], a.second = pos[x];
else if(c[x] == a.first) a.second = min(a.second, pos[x]);
x -= lbt(x);
} return a;
}
void upd(int x, int a, int i) {
if(!x) return;
while(x <= U) {
//c[x] = max(c[x], a);
if(a > c[x]) {
c[x] = a;
pos[x] = i;
} else if(a == c[x]) pos[x] = min(i, pos[x]);
x += lbt(x);
}
}
int a[N], vis[N], ord[N];
int main() {
int T;
//scanf("%d", &T);
//cin >> T;
cin >> T;
while(T--) {
int n;
scanf("%d", &n);
int jump = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
ord[a[i]] = i;
pii nx = query(a[i] - 1);
ans[i] = nx.first + 1;
fr[i] = nx.second;
upd(a[i], ans[i], i);
if(ans[i] > ans[jump]) jump = i;
}
int Len = ans[jump];
vector<int> p;
while(jump) {
vis[jump] = 1;
jump = fr[jump];
}
//reverse(q.begin(), q.end());
set<int> s;
int Del = 0;
for(int i = 1; i <= n; i++) {
if(vis[i]) {
set<int>::iterator it;
while((it = s.upper_bound(a[i])) != s.end()) {
p.push_back(ord[*it]);
s.erase(it);
}
}
s.insert(a[i]);
}
printf("%d %d\n", Len, p.size());
sort(p.begin(), p.end());
for(auto &x : p) printf("%d ", x);
printf("\n");
for(int i = 0; i <= n; i++) a[i] = vis[i] = ord[i] = c[i] = fr[i] = ans[i] = pos[i] = 0;
}
return 0;
}
/*
8
389 207 155 300 299 170 158 65
*/
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 14336kb
input:
2 3 3 1 2 3 1 2 3
output:
2 1 1 3 0
result:
ok ok n = 3
Test #2:
score: -100
Time Limit Exceeded
input:
100000 7 2 6 7 1 4 3 5 6 1 5 6 3 2 4 3 1 2 3 3 2 1 3 14 9 6 13 10 4 7 5 14 1 12 8 3 2 11 3 1 2 3 14 1 9 3 14 5 7 4 6 12 2 8 11 13 10 8 7 1 3 6 2 5 8 4 16 9 3 4 8 7 16 10 6 11 1 14 2 13 12 5 15 3 3 1 2 33 9 10 23 3 16 1 19 32 25 4 5 31 28 7 22 27 30 8 6 17 2 14 13 29 20 33 26 18 24 11 12 15 21 2 2 1 ...