QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#746780#9742. 优秀的拆分chenxinyang2006WA 23ms8052kbC++202.6kb2024-11-14 15:31:492024-11-14 15:31:49

Judging History

你现在查看的是最新测评结果

  • [2024-11-14 15:31:49]
  • 评测
  • 测评结果:WA
  • 用时:23ms
  • 内存:8052kb
  • [2024-11-14 15:31:49]
  • 提交

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;
}

详细

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'