WC 联训 Round #9

Contest
(2020cj_105)
0+10+20
T1忽略了插入一个数要减掉原来的贡献导致样例没看懂跳了,后面回来写费用流没空写了。
T2第二档写个LCT思维受限?只想着原树的根不能变没想到可以改根之后再改回来。
然后有三个\(O(n^2)\)或者\(O(n^2\log n)\)的暴力,我写了一个\(10\)分的,另外两个是\(30\)\(40\)分的。。。。
T3拿了20。后面有一个\(n=15\)和一个\(n=20\)爆搜跑了四个小时过不了。

C

按照题目给的移动顺序来爆搜的话可以得到\(n=5\)的一个方案。
然后发现这东西可以很轻松地从\(5*5\)扩展到\(5n*5n\)

#include<cstdio>
const int N=1001;
int n,p[][2]={0,0,2,2,4,4,1,4,3,2,1,0,4,0,4,3,1,3,3,1,3,4,0,4,0,1,2,3,4,1,1,1,3,3,0,3,2,1,2,4,0,2,2,0,4,2,1,2,3,0},a[N][N],t;
void work(int X,int Y,int d)
{
    if(X>=n/5||Y>=n/5) return ;
    for(int i=d,j=0,x,y;j<25;i=(i+24+d*2)%25,++j)
    {
    x=p[i][0],y=p[i][1],a[x+5*X][y+5*Y]=++t;
    if(d&&x==2&&y==4&&!X) work(X,Y+1,1);
    if(d&&x==2&&!y) work(X+1,Y,0);
    if(!d&&!x&&y==2&&!X) work(X,Y+1,0);
    if(!d&&x==4&&y==2) work(X+1,Y,1);
    }
}
int main()
{
    scanf("%d",&n),work(0,0,0);
    for(int i=0,j;i<n;++i,puts("")) for(j=0;j<n;++j) printf("%d ",a[i][j]);
}

猜你喜欢

转载自www.cnblogs.com/cjoierShiina-Mashiro/p/12006078.html
wc