忽闻今年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;
}