BZOJ3619: [Zjoi2014]璀灿光华

忽闻今年ZJOI出题人是2014的出题人
吓得我赶快去看一下题目
ZJOI2014可是坑了CSY啊 (捂

璀璨光华感觉像是pj组的题目?
建图不难。。。。
然后暴力即可

#include
#include
#include
#include
#include
using namespace std;

char c;
int x[350000],y[350000],z[350000];
int x2[350000],y2[350000],z2[350000];
int  g[350000];
int No[71][71][71];
inline void read(int &a)
{
    do c=getchar();while(c<'0'||c>'9');
    while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
struct Chain
{
    int u;
    Chain *next;
}*Head[350001];
inline void Add(int u,int v)
{
    Chain *tp=new Chain;tp->u=v;tp->next=Head[u];Head[u]=tp;
}
queue<int>Q;
inline void BFS(int S,int *Dis)
{
    Dis[S]=1;
    Q.push(S);
    while(!Q.empty())
    {
        int u=Q.front();
        for(Chain *tp=Head[u];tp;tp=tp->next)
          if(!Dis[tp->u])
             Q.push(tp->u),Dis[tp->u]=Dis[u]+1;
        Q.pop();
    }
}
int n;
inline void P(int X,int Y,int Z,int N)
{
    int a,b,c;
    X+=2; 
    a=(X+Y-(n<<1))>>1;
    b=(X+Z-(n<<1))>>1;
    c=X-a-b;
    x2[N]=a,y2[N]=b,z2[N]=c;
    No[a][b][c]=N;
} 


char Ch[100001];

int D[350001];
int a;
int SD[1001];
int Ans;
int Dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}}; 
int In[71][71][71];
void Add(int x,int y,int z,int Dr)
{
    if(z==0||!y||!x)return;
    if(z>n||y>n||x>n)return;
    if(0==In[x][y][z]++)
      Ans+=g[No[x][y][z]];
   Add(x+Dir[Dr][0],y+Dir[Dr][1],z+Dir[Dr][2],Dr);
}
void Clear(int x,int y,int z,int Dr)
{
    if(z==0||!y||!x)return;
    if(z>n||y>n||x>n)return;
    if(0==--In[x][y][z])
      Ans-=g[No[x][y][z]];
   Clear(x+Dir[Dr][0],y+Dir[Dr][1],z+Dir[Dr][2],Dr);
}
int R,L=1<<29;
void DFS(int X)
{
    if(X==a+1)
    {
      L=min(L,Ans);
      R=max(R,Ans);
    }
    else
     {
        for(int i=0;i<=5;i++)
        Add(x2[SD[X]],y2[SD[X]],z2[SD[X]],i),
         DFS(X+1),
         Clear(x2[SD[X]],y2[SD[X]],z2[SD[X]],i);
     }
}

int main()
{

    read(n);
    int Con=n*n*n,i;
    for(i=1;i<=Con;i++)
    {
        read(g[i]);
        if(!g[i])SD[++a]=i;
        gets(Ch);
        int l=strlen(Ch),t=0,j=1;
        Ch[l]=EOF;
        while(t<=l)
        {
            j=0;
         do c=Ch[t++];while((c<'0'||c>'9')&&t<=l);
         while(c<='9'&&c>='0')j=(j<<3)+(j<<1)+c-'0',c=Ch[t++];
         Add(j,i);
         D[j]++;
        }

    } 
    int tp;
    for(i=1;i<=Con;i++)
       if(D[i]==3)
         {tp=i;break;}
    BFS(tp,x);
    for(i=1;i<=Con;i++)
       if(D[i]==3&&x[i]==2*n-1)
         {tp=i;break;}

    BFS(tp,y);
    for(i=1;i<=Con;i++)
       if(D[i]==3&&y[i]==2*n-1&&x[i]==2*n-1)
         {tp=i;break;}
    BFS(tp,z);
    for(i=1;i<=Con;i++)
       P(x[i],y[i],z[i],i);
    DFS(1); 
    printf("%d %d\n",L,R);
    return 0;
} 

你可能感兴趣的:(乱搞)