QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#290870#3269. 末日魔法少女计划DaiRuiChen0070 0ms0kbC++172.1kb2023-12-25 18:39:032023-12-25 18:39:03

Judging History

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

  • [2023-12-25 18:39:03]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2023-12-25 18:39:03]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
int f[16][2005],g[16][2005],fx[16][2005],gx[16][2005];
int eval(int k,int n,int o) {
	//o=1:pre, o=2:suf, o=3:pre&suf
	if(n<=1) return 0;
	if(o==1) return n-1+f[k][n-1];
	if(o==2) return n-1+f[k][n-1];
	if(o==3) return 2*n-3+f[k][n-2];
	return f[k][n];
}
struct info { int l,r; };
vector <info> e;
void link(info u,info v) { e.push_back({u.l,v.r}); }
void sol(vector<info>q,int k,int o) {
	#define sc(x,y) {q.begin()+x,q.begin()+y}
	int n=q.size();
	if(n<=1) return ;
	if(o==1) {
		for(int i=1;i<n;++i) link(q[0],q[i]);
		return sol(sc(1,n),k,0);
	}
	if(o==2) {
		for(int i=0;i<n-1;++i) link(q[i],q[n-1]);
		return sol(sc(0,n-1),k,0);
	}
	if(o==3) {
		for(int i=1;i<n-1;++i) link(q[0],q[i]),link(q[i],q[n-1]);
		return link(q[0],q[n-1]),sol(sc(1,n-1),k,0);
	}
	if(n<=k) return ;
	else if(k==1) for(int i=0;i<n;++i) for(int j=i+1;j<n;++j) link(q[i],q[j]);
	else if(k==2) sol(sc(0,n/2),k,2),sol(sc(n/2,n),k,1);
	else {
		int wd=fx[k][n];
		sol(sc(0,wd),k,2),sol(sc(n-wd,n),k,1);
		vector<info> s;
		int b=gx[k][n-2*wd],d=(n-2*wd)/b,r=(n-2*wd)%b,it=wd;
		for(int i=0;i<b-r;++i) sol(sc(it,it+d),k,3),s.push_back({q[it].l,q[it+d-1].r}),it+=d;
		for(int i=0;i<r;++i) sol(sc(it,it+d+1),k,3),s.push_back({q[it].l,q[it+d].r}),it+=d+1;
		sol(s,k-2,0);
	}
}
signed main() {
	freopen("matrix.in","r",stdin);
	freopen("matrix.out","w",stdout);
	for(int k=1;k<=15;++k) for(int n=2;n<=2000;++n) {
		g[k][n]=inf;
		for(int b=1;b<=n;++b) {
			int d=n/b,r=n%b,tmp=eval(k-2,b,0)+eval(k,d,3)*(b-r)+eval(k,d+1,3)*r;
			if(tmp<g[k][n]) g[k][n]=tmp,gx[k][n]=b;
		}
		if(n<=k) f[k][n]=0;
		else if(k==1) f[k][n]=n*(n-1)/2;
		else if(k==2) f[k][n]=eval(k,n/2,2)+eval(k,n-n/2,1);
		else {
			f[k][n]=inf;
			for(int i=1;i<=n/2;++i) {
				int tmp=g[k][n-2*i]+eval(k,i,2)+eval(k,i,1);
				if(tmp<f[k][n]) f[k][n]=tmp,fx[k][n]=i;
			}
		}
	}
	int N,K;
	scanf("%d%d",&N,&K);
	vector <info> I;
	for(int i=1;i<N;++i) I.push_back({i,i+1});
	sol(I,K,0);
	printf("%d\n",(int)e.size());
	for(auto x:e) printf("%d %d\n",x.l,x.r);
	return 0;
}

詳細信息

Subtask #1:

score: 0
Dangerous Syscalls

Test #1:

score: 0
Dangerous Syscalls

input:

2000 2

output:


result:


Subtask #2:

score: 0
Dangerous Syscalls

Test #6:

score: 0
Dangerous Syscalls

input:

1936 3

output:


result:


Subtask #3:

score: 0
Dangerous Syscalls

Test #11:

score: 0
Dangerous Syscalls

input:

2000 4

output:


result:


Subtask #4:

score: 0
Dangerous Syscalls

Test #16:

score: 0
Dangerous Syscalls

input:

2000 5

output:


result:


Subtask #5:

score: 0
Dangerous Syscalls

Test #21:

score: 0
Dangerous Syscalls

input:

2000 6

output:


result:


Subtask #6:

score: 0
Dangerous Syscalls

Test #26:

score: 0
Dangerous Syscalls

input:

1999 7

output:


result:


Subtask #7:

score: 0
Dangerous Syscalls

Test #31:

score: 0
Dangerous Syscalls

input:

1995 8

output:


result:


Subtask #8:

score: 0
Dangerous Syscalls

Test #36:

score: 0
Dangerous Syscalls

input:

1997 9

output:


result:


Subtask #9:

score: 0
Dangerous Syscalls

Test #41:

score: 0
Dangerous Syscalls

input:

1995 10

output:


result:


Subtask #10:

score: 0
Dangerous Syscalls

Test #46:

score: 0
Dangerous Syscalls

input:

1993 11

output:


result:


Subtask #11:

score: 0
Dangerous Syscalls

Test #51:

score: 0
Dangerous Syscalls

input:

1999 12

output:


result:


Subtask #12:

score: 0
Dangerous Syscalls

Test #56:

score: 0
Dangerous Syscalls

input:

1981 13

output:


result:


Subtask #13:

score: 0
Dangerous Syscalls

Test #61:

score: 0
Dangerous Syscalls

input:

1979 14

output:


result:


Subtask #14:

score: 0
Dangerous Syscalls

Test #66:

score: 0
Dangerous Syscalls

input:

2000 15

output:


result: