我再也不相信正解了……

Posted coder-cjh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我再也不相信正解了……相关的知识,希望对你有一定的参考价值。

RT,正解居然是暴搜,我用的是Hamilton,结果炸了

Code

Mine

#include<bits/stdc++.h>
#pragma GCC optimize("O2")
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define rf(i,a,b) for(int i=a;i>=b;--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define N 305
#define inf 0x3f3f3f3f
using namespace std;
int n,m,s,p;
int x[N],y[N],mp[N][N],mx[N][N];
inline int read()int fh=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();return fh;

int f[5][N][N];
bool valid(int x,int y)return (x>0&&x<=n&&y>0&&y<=m&&mp[x][y]==0);
bool can(int k,int x,int y)
    if(!valid(x-k,y-k)||!valid(x+k,y+k))return false;
    fr(i,y-k,y+k)if(mp[x-k][i]||mp[x+k][i])return false;
    fr(i,x-k,x+k)if(mp[i][y-k]||mp[i][y+k])return false;
    return true;

void pre2()
    fr(i,1,n)
        fr(j,1,m)
         int k=0;
         while(can(k,i,j))k++;
         mx[i][j]=min(k-1,s);
     

int bs[N][N][2],fx[]=1,0,-1,0,fy[]=0,1,0,-1,dis[20][20][2];
struct nodeint x,y,s1,s2;;

#define pr pair<int,int>
#define fs first
#define sc second
queue<pr> q;
bool b[N][N];
void bfs(int sx,int sy,int ind)
    while(!q.empty())q.pop();
    fr(i,1,n)fr(j,1,m)bs[i][j][0]=inf,b[i][j]=0;
    q.push(make_pair(sx,sy));bs[sx][sy][0]=0;bs[sx][sy][1]=0;b[sx][sy]=1;
    while(!q.empty())
        pr tmp=q.front();q.pop();
        b[tmp.fs][tmp.sc]=0;
        fr(i,0,3)
            int nx=tmp.fs+fx[i],ny=tmp.sc+fy[i];
            if(!valid(nx,ny))continue;
            int ns1=bs[tmp.fs][tmp.sc][0]+1,ns2=bs[tmp.fs][tmp.sc][1]+mx[nx][ny];
            if(bs[nx][ny][0]>ns1)
                bs[nx][ny][0]=ns1;bs[nx][ny][1]=ns2;
                if(!b[nx][ny])q.push(make_pair(nx,ny)),b[nx][ny]=1;
            else if(bs[nx][ny][0]==ns1&&bs[nx][ny][1]<ns2)
                bs[nx][ny][1]=ns2;
                if(!b[nx][ny])q.push(make_pair(nx,ny)),b[nx][ny]=1;
            
        
    
    fr(i,0,p)dis[ind][i][0]=bs[x[i]][y[i]][0],dis[ind][i][1]=bs[x[i]][y[i]][1];

const int P=20;
int ff[P][1<<P][2];
void hamilton()
    ++p;
    fr(i,0,p)fr(j,0,(1<<p)-1)ff[i][j][0]=inf;
    ff[0][1][0]=ff[0][1][1]=0;
    fr(i,1,(1<<p)-1)fr(j,0,p)
     if(i>>j&1)
      fr(k,0,p)
       if((i^(1<<j))>>k&1)
        if(ff[j][i][0]>=ff[k][i^(1<<j)][0]+dis[j][k][0])
            if(ff[j][i][0]>ff[k][i^(1<<j)][0]+dis[j][k][0])ff[j][i][1]=ff[k][i^(1<<j)][1]+dis[j][k][1];
            else ff[j][i][1]=max(ff[j][i][1],ff[k][i^(1<<j)][1]+dis[j][k][1]);
            ff[j][i][0]=ff[k][i^(1<<j)][0]+dis[j][k][0];
        
    int ans=1e9,ans2=0;
    fr(i,0,p-1)
            if(ans>ff[i][(1<<p)-1][0])ans=ff[i][(1<<p)-1][0],ans2=ff[i][(1<<p)-1][1];
            else if(ans==ff[i][(1<<p)-1][0])ans2=max(ans2,ff[i][(1<<p)-1][1]);
    cout<<ans<<" "<<ans2+mx[x[0]][y[0]]<<endl;

bool vis[N];
int ans=1e9,lim;
int main()
    freopen("expand.in","r",stdin);
    //freopen("expand.out","w",stdout);
    n=read(),m=read(),s=read();
    fr(i,1,n)fr(j,1,m)mp[i][j]=read();
    pre2();
    x[0]=read()+1,y[0]=read()+1,p=read();
    fr(i,1,p)x[i]=read()+1,y[i]=read()+1;
    fr(i,0,p)bfs(x[i],y[i],i);
    hamilton();
    //solve();
    return 0;

正解

#include<bits/stdc++.h>
#pragma GCC optimize("O2")
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define rf(i,a,b) for(int i=a;i>=b;--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define N 305
#define inf 0x3f3f3f3f
using namespace std;
int n,m,s,p;
int x[N],y[N],mp[N][N],mx[N][N];
inline int read()int fh=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();return fh;

int f[5][N][N];
void pre1()
    fr(i,1,n)fr(j,1,m) if(!mp[i][j])f[1][i][j]=min(s,min(f[1][i-1][j],min(f[1][i][j-1],f[1][i-1][j-1]))+1);
    rf(i,n,1)rf(j,m,1) if(!mp[i][j])f[2][i][j]=min(s,min(f[2][i+1][j],min(f[2][i][j+1],f[1][i+1][j+1]))+1);
    fr(i,1,n)rf(j,m,1) if(!mp[i][j])f[3][i][j]=min(s,min(f[3][i-1][j],min(f[3][i][j+1],f[3][i-1][j+1]))+1);
    rf(i,n,1)fr(j,1,m) if(!mp[i][j])f[4][i][j]=min(s,min(f[4][i+1][j],min(f[4][i][j-1],f[4][i+1][j-1]))+1);
    fr(i,1,n)fr(j,1,m) if(!mp[i][j])mx[i][j]=max(0,min(min(f[1][i][j],f[2][i][j]),min(f[3][i][j],f[4][i][j]))-1);

bool valid(int x,int y)return (x>0&&x<=n&&y>0&&y<=m&&mp[x][y]==0);
bool can(int k,int x,int y)
    if(!valid(x-k,y-k)||!valid(x+k,y+k))return false;
    fr(i,y-k,y+k)if(mp[x-k][i]||mp[x+k][i])return false;
    fr(i,x-k,x+k)if(mp[i][y-k]||mp[i][y+k])return false;
    return true;

void pre2()
    fr(i,1,n)
        fr(j,1,m)
         int k=0;
         while(can(k,i,j))k++;
         mx[i][j]=min(k-1,s);
     

int bs[N][N][2],fx[]=1,0,-1,0,fy[]=0,1,0,-1,dis[20][20][2];
struct nodeint x,y,s1,s2;;

#define pr pair<int,int>
#define fs first
#define sc second
queue<pr> q;
bool b[N][N];
void bfs(int sx,int sy,int ind)
    while(!q.empty())q.pop();
    fr(i,1,n)fr(j,1,m)bs[i][j][0]=inf,b[i][j]=0;
    q.push(make_pair(sx,sy));bs[sx][sy][0]=0;bs[sx][sy][1]=0;b[sx][sy]=1;
    while(!q.empty())
        pr tmp=q.front();q.pop();
        b[tmp.fs][tmp.sc]=0;
        fr(i,0,3)
            int nx=tmp.fs+fx[i],ny=tmp.sc+fy[i];
            if(!valid(nx,ny))continue;
            int ns1=bs[tmp.fs][tmp.sc][0]+1,ns2=bs[tmp.fs][tmp.sc][1]+mx[nx][ny];
            if(bs[nx][ny][0]>ns1)
                bs[nx][ny][0]=ns1;bs[nx][ny][1]=ns2;
                if(!b[nx][ny])q.push(make_pair(nx,ny)),b[nx][ny]=1;
            else if(bs[nx][ny][0]==ns1&&bs[nx][ny][1]<ns2)
                bs[nx][ny][1]=ns2;
                if(!b[nx][ny])q.push(make_pair(nx,ny)),b[nx][ny]=1;
            
            
        
    
//    puts("");
//    cout<<sx<<" "<<sy<<" "<<ind<<endl;
//    fr(i,1,n)
//        fr(j,1,m)cout<<bs[i][j][1]<<" ";
//        puts("");
//    
    fr(i,0,p)dis[ind][i][0]=bs[x[i]][y[i]][0],dis[ind][i][1]=bs[x[i]][y[i]][1];


const int P=20;
int ff[P][1<<P][2];
void hamilton()
    ++p;
    fr(i,0,p)fr(j,0,(1<<p)-1)ff[i][j][0]=inf;
    ff[0][1][0]=ff[0][1][1]=0;
    fr(i,0,(1<<p)-1)fr(j,0,p)
     if(i>>j&1)
      fr(k,0,p-1)
       if((i^(1<<j))>>k&1)
        if(ff[j][i][0]>ff[k][i^(1<<j)][0]+dis[j][k][0])
            ff[j][i][0]=ff[k][i^(1<<j)][0]+dis[j][k][0];
            ff[j][i][1]=ff[k][i^(1<<j)][1]+dis[j][k][1];
        
        else if(ff[j][i][0]==ff[k][i^(1<<j)][0]+dis[j][k][0])
             ff[j][i][1]=max(ff[j][i][1],ff[k][i^(1<<j)][1]+dis[j][k][1]);
    int ans=1e9,ans2=0;
    fr(i,1,p-1)
            if(ans>ff[i][(1<<p)-1][0])ans=ff[i][(1<<p)-1][0],ans2=ff[i][(1<<p)-1][1];
         else if(ans==ff[i][(1<<p)-1][0])ans2=max(ans2,ff[i][(1<<p)-1][1]);
    
    cout<<ans<<" "<<ans2+mx[x[0]][y[0]]<<endl;

bool vis[N];
int ans=1e9,lim;
inline void dfs(int now,int step,int dist,int sum)
    if(dist>ans) return;
    if(step==p)
        if(dist<ans) ans=dist,lim=sum;
        else if(dist==ans) lim=max(lim,sum);
    
    fr(i,1,p) if(!vis[i])
        vis[i]=true;
        dfs(i,step+1,dist+dis[now][i][0],sum+dis[now][i][1]);
        vis[i]=false;
    

void solve()
    fr(i,1,p)
        vis[i]=true;
        dfs(i,1,dis[0][i][0],dis[0][i][1]);
        vis[i]=false;
    
    printf("%d %d\n",ans,lim+mx[x[0]][y[0]]);
    return;

int main()
    freopen("expand.in","r",stdin);
    freopen("expand.out","w",stdout);
    n=read(),m=read(),s=read();
    fr(i,1,n)fr(j,1,m)mp[i][j]=read();
    pre2();
    x[0]=read()+1,y[0]=read()+1,p=read();
    fr(i,1,p)x[i]=read()+1,y[i]=read()+1;
    fr(i,0,p)bfs(x[i],y[i],i);
    //hamilton();
    solve();
    return 0;

太炸心态了

以上是关于我再也不相信正解了……的主要内容,如果未能解决你的问题,请参考以下文章

看完Jeff Dean新论文,我再也不相信大厂的鬼话了

看完Jeff Dean新论文,我再也不相信大厂的鬼话了

再也不要相信你的眼睛:步步逼近的AI换脸术

独一无二的「MySQL调优金字塔」相信也许你拥有了它,就再也不用为数据库性能发愁

生死观

Nginx一键配置方法, 再也不用担心我的Nginx配置了