QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#611282#5507. InvestorsQHhee004WA 3ms6232kbC++171.9kb2024-10-04 20:12:392024-10-04 20:12:39

Judging History

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

  • [2024-10-04 20:12:39]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:6232kb
  • [2024-10-04 20:12:39]
  • 提交

answer

#include<iostream>
#include<map>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
const int inf=1e9+7,N=6005;
int n,m;
int tot,a[N],b[N],f[N][N],excel[N][N];
#define lowbit(x) x&-x
class Tree_Array {
	private:
		int bit[N];
	public:
		void assign(Tree_Array &t) {
			for(int i=1; i<=n; i++)
				bit[i]=t.bit[i];
		}
		void set(int t) {
			for(int i=0; i<=n; i++)
				bit[i]=t;
		}
		void add_mn(int x,int t) {
			while(x)bit[x]=min(bit[x],t),x-=lowbit(x);
		}
		int get_mn(int x) {
			int ans=inf;
			while(x<=n)ans=min(bit[x],ans),x+=lowbit(x);
			return ans;
		}
		void add(int x,int y) {
			while(x)bit[x]+=y,x-=lowbit(x);
		}
		int get(int x) {
			int sum=0;
			while(x<=n)sum+=bit[x],x+=lowbit(x);
			return sum;
		}
} bit1,bit2;
void prepare() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);b[i]=a[i];
	}
	map<int,int>F;
	tot=0;
	sort(b+1,b+1+n);
	for(int i=1; i<=n; i++)
		if(F[b[i]]==0)F[b[i]]=++tot;
	for(int i=1; i<=n; i++)a[i]=F[a[i]];
}
void Get_f() {
	for(int L=1; L<=n; L++) {
		bit1.set(0);
		bit1.add(a[L],1);
		for(int R=L+1; R<=n; R++) {
			f[L][R]=f[L][R-1]+bit1.get(a[R]+1);
			bit1.add(a[R],1);
		}
	}
}
int res[N][N];
void Get_ans() {
	bit1.set(inf);
	bit2.set(inf);
	for(int i=0; i<=n+1; i++)
		for(int j=0; j<=n+1; j++)
			res[i][j]=inf;
	res[0][1]=0;
	for(int c=0; c<=m; c++) {
		int t=c;
		for(int j=1; j<=n; j++) {
			res[c+1][j+1]=res[c][t+1]+f[t+1][j];
			for(int k=t+1; k<=j; k++) {
				if(res[c][k+1]+f[k+1][j]<res[c+1][j+1]) {
					t=k;
					res[c+1][j+1]=min(res[c+1][j+1],res[c][t+1]+f[t+1][j]);
					break;
				}
			}
		}
	}
	printf("%d\n",res[m+1][n+1]);
}
void solve() {
	prepare();
	Get_f();
	Get_ans();
}
int main() {
//	freopen("data.in","r",stdin);
//	freopen("my.out","w",stdout);
	int T;scanf("%d",&T);
	while(T--) solve();
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6132kb

input:

2
6 1
4 5 6 2 2 1
6 2
4 5 6 2 2 1

output:

2
0

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 3ms
memory: 6232kb

input:

349
6 2
2 1 2 1 2 1
48 12
42 47 39 39 27 25 22 44 45 13 5 48 38 4 37 6 24 10 42 38 12 37 31 19 44 6 29 17 7 12 7 26 35 24 15 9 37 3 27 21 33 29 34 20 14 30 31 21
48 12
1 43 17 46 17 39 40 22 25 2 22 12 4 11 38 12 4 11 1 5 39 44 37 10 19 20 42 45 2 45 37 20 48 34 16 41 23 18 13 44 47 21 29 4 23 18 16...

output:

1
18
15
145
0
3
3
1
13
13
23
0
0
0
1
0
0
0
3
0
0
0
1
184
3
0
0
1
0
0
0
0
2
0
1
0
3
0
0
1
0
0
1
6
0
1
5
2
0
0
1
1
5
2
1
2
0
2
0
0
9
280
1
0
34
4
0
1
0
3
3
0
0
0
4
1
0
2
4
0
2
0
0
0
1
0
0
0
0
0
0
1
4
0
0
0
2
0
0
5
0
1
1
0
8
1
9
0
0
0
0
1
12
5
0
0
0
7
0
0
1
0
0
1
0
0
0
0
0
0
1
0
2
0
0
0
0
0
13
1
0
0
1
...

result:

wrong answer 6th lines differ - expected: '2', found: '3'