QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#290870 | #3269. 末日魔法少女计划 | DaiRuiChen007 | 0 | 0ms | 0kb | C++17 | 2.1kb | 2023-12-25 18:39:03 | 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