QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#746780 | #9742. 优秀的拆分 | chenxinyang2006 | WA | 23ms | 8052kb | C++20 | 2.6kb | 2024-11-14 15:31:49 | 2024-11-14 15:31:49 |
Judging History
answer
#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;
template <class T>
void chkmax(T &x,T y){
if(x < y) x = y;
}
template <class T>
void chkmin(T &x,T y){
if(x > y) x = y;
}
inline int popcnt(int x){
return __builtin_popcount(x);
}
inline int ctz(int x){
return __builtin_ctz(x);
}
/*ll power(ll p,int k = mod - 2){
ll ans = 1;
while(k){
if(k % 2 == 1) ans = ans * p % mod;
p = p * p % mod;
k /= 2;
}
return ans;
}*/
int T,n;
int a[200005];
int k;
int b[200005];
int lis[2][200005],lds[2][200005],idx[200005];
int solver(){
// rep(i,1,n) printf("%d ",a[i]);
// printf("\n");
int vi = 0,vd = 0;
rep(i,1,n){
lis[0][i] = lds[0][i] = 1;
rep(j,1,i - 1){
if(a[j] < a[i]) chkmax(lis[0][i],lis[0][j] + 1);
else chkmax(lds[0][i],lds[0][j] + 1);
}
}
per(i,n,1){
lis[1][i] = lds[1][i] = 1;
rep(j,i + 1,n){
if(a[j] > a[i]) chkmax(lis[1][i],lis[1][j] + 1);
else chkmax(lds[1][i],lds[1][j] + 1);
}
}
rep(i,1,n){
chkmax(vi,lis[0][i] + lis[1][i] - 1);
chkmax(vd,lds[0][i] + lds[1][i] - 1);
}
// rep(i,1,n) printf("(%d %d) ",lis[0][i],lis[1][i]);
// printf("\n");
rep(i,1,n){
idx[i] = 0;
if(lis[0][i] + lis[1][i] - 1 != vi) continue;
rep(j,i + 1,n) if(lis[1][i] == lis[1][j] + 1 && a[i] < a[j]) idx[i] = j;
if(lis[1][i] == 1) idx[i] = n + 1;
}
// rep(i,1,n) printf("%d ",idx[i]);
// printf("\n");
k = 0;
rep(i,1,n){
int lim = b[vd + 1 - lds[1][i]];
int p = k + 1;
rep(j,1,k) if(b[j] < a[i]) chkmin(p,j);
b[p] = a[i];
if(p == k + 1) k++;
// printf("%d lim=%d\n",i,lim);
rep(j,1,i - 1) if(idx[j] > i && a[j] < lim && a[j] > a[i]) return vi + vd;
}
// printf("??\n");
assert(k == vd);
int Mx = 0;
rep(i,1,n){
if(lis[0][i] + lis[1][i] - 1 == vi) chkmax(Mx,a[i]);
if(lds[1][i] == vd && a[i] < Mx) return vi + vd;
if(a[i] < b[k] && lis[0][i] == vi) return vi + vd;
}
return vi + vd - 1;
}
void solve(){
scanf("%d",&n);
rep(i,1,n) scanf("%d",&a[i]);
int answer = 0;
chkmax(answer,solver());
rep(i,1,n) a[i] = n + 1 - a[i];
chkmax(answer,solver());
printf("%d\n",answer);
}
int main(){
// freopen("test.in","r",stdin);
scanf("%d",&T);
while(T--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 8052kb
input:
3 5 3 5 1 4 2 4 1 2 4 3 5 3 5 2 1 4
output:
4 4 5
result:
ok 3 lines
Test #2:
score: -100
Wrong Answer
time: 23ms
memory: 7960kb
input:
20000 2 2 1 10 6 10 2 7 9 3 8 4 1 5 9 3 6 4 5 8 9 2 7 1 7 3 7 6 4 1 5 2 7 7 2 3 6 5 1 4 5 4 1 3 2 5 9 6 7 5 3 8 1 9 2 4 3 1 2 3 8 7 2 4 6 1 8 3 5 7 4 2 6 3 1 7 5 8 1 7 3 4 2 5 6 8 2 1 2 10 10 2 3 8 6 9 1 4 7 5 4 3 2 1 4 9 7 5 3 4 1 2 9 6 8 7 2 4 5 1 6 7 3 10 3 1 10 4 9 5 6 8 2 7 5 1 2 5 3 4 6 2 6 5 ...
output:
2 8 8 7 6 6 8 4 6 6 8 3 8 5 8 7 9 6 6 7 7 9 9 8 9 1 6 7 6 7 4 4 3 3 6 7 6 1 6 6 1 8 7 8 6 7 3 3 2 6 7 6 7 5 7 4 2 7 8 6 3 1 3 1 8 8 9 5 1 1 7 7 8 3 7 3 1 9 3 5 7 3 6 6 9 6 3 2 1 7 7 7 8 3 1 8 7 10 3 8 9 5 7 4 7 9 3 4 1 4 4 9 10 1 8 8 2 7 6 4 7 1 3 6 3 1 8 6 8 1 10 7 5 7 4 9 1 6 5 6 5 5 4 1 6 3 7 7 1...
result:
wrong answer 4th lines differ - expected: '6', found: '7'