题意:有一个$a^3$个小正方体组成的大正方体,其中有n个正方体会向上下左右前后六个方向中的一个发出光,正方体是透光的,被照亮的正方体有个美丽值$g_{i}$,给出正方体的相邻关系,问美丽值之和的最小值和最大值。

难点在如何建图。

先随便找个棱角,再随便建两条棱,然后一层一层铺下去。当铺到一个新的点时,肯定已经铺好了至少一个与它相邻的点,然后再暴力算出已知与当前点相邻的点给出的每个相邻的点的出现次数,然后没被填过且出现次数最多的那个点的编号,就是当前点的编号。

建完图跑个dfs就行了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<string>
  4. #include<cstring>
  5. #include<iostream>
  6. using namespace std;
  7. #define ll long long
  8. #define For(i,x,y) for (register int i=(x);i<=(y);i++)
  9. #define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
  10. #define cross(i,k) for (register int i=first[k];i;i=last[i])
  11. char c;
  12. inline ll read(){
  13. ll x=0;int ch=getchar(),f=1;
  14. while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
  15. if (ch=='-'){f=-1;ch=getchar();}
  16. while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  17. c=ch;return x*f;
  18. }
  19. const int N = 70*70*70+10;
  20. const int dx[6]={1,-1,0,0,0,0};
  21. const int dy[6]={0,0,1,-1,0,0};
  22. const int dz[6]={0,0,0,0,1,-1};
  23. struct node{
  24. int x,y,z;
  25. }l[11];
  26. int n,rt,tot,g[N],next[N][7],a[75][75][75],vis[N],cnt[N];
  27. ll Max,Min;
  28. inline bool check(int x,int y,int z){return x>0&&x<=n&&y>0&&y<=n&&z>0&&z<=n;}
  29. inline void dfs(int now,int x,int y,int z,int k){
  30. a[x][y][z]=now,vis[now]=1;
  31. if (z==n&&k==4||y==n&&k==2) return;
  32. if (z==n-1&&k==4||y==n-1&&k==2){
  33. For(i,1,next[now][0]){
  34. int v=next[now][i];
  35. if (!vis[v]&&next[v][0]==3){dfs(v,x+dx[k],y+dy[k],z+dz[k],k);break;}
  36. }
  37. return;
  38. }
  39. For(i,1,next[now][0]){
  40. int v=next[now][i];
  41. if (!vis[v]&&next[v][0]==4){dfs(v,x+dx[k],y+dy[k],z+dz[k],k);break;}
  42. }
  43. }
  44. int x,y,z,Vis[75][75][75];
  45. ll ans;
  46. inline ll min(ll a,ll b){return a<b?a:b;}
  47. inline ll max(ll a,ll b){return a>b?a:b;}
  48. inline void dfs(int k){
  49. if (k>tot){Max=max(Max,ans),Min=min(Min,ans);return;}
  50. For(i,0,5){
  51. x=l[k].x,y=l[k].y,z=l[k].z;
  52. while (check(x+dx[i],y+dy[i],z+dz[i])){
  53. x+=dx[i],y+=dy[i],z+=dz[i];
  54. if (!Vis[x][y][z]) ans+=1ll*g[a[x][y][z]];Vis[x][y][z]++;
  55. }
  56. dfs(k+1);
  57. x=l[k].x,y=l[k].y,z=l[k].z;
  58. while (check(x+dx[i],y+dy[i],z+dz[i])){
  59. x+=dx[i],y+=dy[i],z+=dz[i],Vis[x][y][z]--;
  60. if (!Vis[x][y][z]) ans-=1ll*g[a[x][y][z]];
  61. }
  62. }
  63. }
  64. inline void Print(){
  65. For(i,1,n){
  66. For(j,1,n){
  67. For(k,1,n) printf("%d ",a[i][j][k]);puts("");
  68. }puts("");
  69. }
  70. }
  71. int main(){
  72. //freopen("P3342.in","r",stdin);
  73. //freopen("P3342.out","w",stdout);
  74. n=read();
  75. For(i,1,n*n*n){
  76. g[i]=read();
  77. while (c==' ') next[i][++next[i][0]]=read();
  78. }
  79. For(i,1,n*n*n) if (next[i][0]==3){rt=i;break;}
  80. dfs(rt,1,1,1,4),dfs(rt,1,1,1,2);
  81. For(i,1,n) For(j,1,n) For(k,1,n){
  82. if (a[i][j][k]) continue;
  83. int Max=0,Max_id=0;
  84. for (int d=0;d<6;d+=2){
  85. int v=a[i-dx[d]][j-dy[d]][k-dz[d]];
  86. For(nxt,1,next[v][0]){
  87. cnt[next[v][nxt]]++;
  88. if (cnt[next[v][nxt]]>Max&&!vis[next[v][nxt]]) Max=cnt[next[v][nxt]],Max_id=next[v][nxt];
  89. }
  90. }
  91. a[i][j][k]=Max_id,vis[Max_id]=1;
  92. for (int d=0;d<6;d+=2){
  93. int v=a[i-dx[d]][j-dy[d]][k-dz[d]];
  94. For(nxt,1,next[v][0]) cnt[next[v][nxt]]--;
  95. }
  96. }
  97. For(i,1,n) For(j,1,n) For(k,1,n) if (!g[a[i][j][k]]) l[++tot]=(node){i,j,k};
  98. Max=(ll)-1e18,Min=-Max;
  99. dfs(1);
  100. printf("%lld %lld",Min,Max);
  101. }

BZOJ3619 [Zjoi2014]璀灿光华 构造+dfs的更多相关文章

  1. BZOJ3619 : [Zjoi2014]璀灿光华

    终于把省选时的遗憾补上了… 对于构造立方体: 首先BFS构出底层,然后再逐层构造立方体 对于计算: $O(n^6)$爆搜即可. #include<cstdio> #include<c ...

  2. 题解:[ZJOI2014]璀灿光华

    原题链接 OJ 题号 洛谷 3342 loj 2203 bzoj 3619 题目描述 金先生有一个女朋友没名字.她勤劳勇敢.智慧善良.金先生很喜欢她.为此,金先生用\(a^3\)块\(1 \times ...

  3. 「ZJOI2014」璀灿光华

    「ZJOI2014」璀灿光华 实际上,可以不用建水晶立方体... 因为,发光水晶的方向都要枚举一遍. 只需知道发光水晶每个方向有哪些水晶就可以了. 对于一个发光水晶,将它连接的水晶标号. 从该水晶bf ...

  4. UVa 12118 nspector's Dilemma (构造+DFS+欧拉回路)

    题意:给定n个点,e条边和每条边的长度t,每两个点之间都有路相连,让你求一条最短的路经过这e条边. 析:刚开始想到要判连通,然后把相应的几块加起来,但是,第二个样例就不过,后来一想,那么有欧拉回路的还 ...

  5. Codeforces 906B. Seating of Students(构造+DFS)

    行和列>4的可以直接构造,只要交叉着放就好了,比如1 3 5 2 4和2 4 1 3 5,每一行和下一行用不同的方法就能保证没有邻居. 其他的可以用爆搜,每次暴力和后面的一个编号交换并判断可行性 ...

  6. 7.9 NOI模拟赛 A.图 构造 dfs树 二分图

    啥都想不出来的我是不是废了/dk 这道题考的主要是构造 而我想的主要是乱搞. 一个很假很假的做法:直接暴力4种颜色染色 我也不知道对不对.. 不过成功的话一定是对的. 然后考虑奇环的问题 一个很假很假 ...

  7. 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing

    acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...

  8. 【uva 1610】Party Games(算法效率--构造 dfs)

    题意:有一个N个字符串(N≤1000,N为偶数)的集合,要求找一个长度最短的字符串(可不在集合内)S,使得集合中恰好一半的串小于等于S,另一半大于S.如果有多解,要求输出字典序最小的解. 解法:本来我 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. react 项目遇到的警告集锦

    1.  2.

  2. 学习webpack

    前言 webpack前端工程中扮演的角色越来越重要,它也是前端工程化很重要的一环.本文将和大家一起按照项目流程学习使用wbepack,妈妈再也不用担心我不会使用webpack,哪里不会看哪里.这是一个 ...

  3. Ajax请求数据与删除数据后刷新页面

    1.ajax异步请求数据后填入模态框 请求数据的按钮(HTML) <a class="queryA" href="javascript:void(0)" ...

  4. cordova 从xcode7迁移到xcode8

    环境以开发流程 当前项目使用的cordova环境 cordova 6.1.1 cordova-ios 3.9.2(vs15自动装的不知道在哪能改,所以考虑升级到vs17,能够手动指定) cordova ...

  5. java版云笔记(五)

    下来是创建笔记本,创建笔记,这个没什么难点和前面是一样的. 创建笔记本 首先点击"+"弹出添加笔记的对话框,然后点击确定按钮创建笔记本. //点击"+"弹出添加 ...

  6. 防范SQL注入

    使用占位符的方式写查询语句hibernate

  7. 可图性判定--Havel-Hakimi定理

    两个概念 1.度序列 若把图G所有顶点的度数排成一个序列S,则称S为图G的度序列. 2.序列是可图的 一个非负整数组成的序列如果是某个无向图的度序列,则称该序列是可图的. Havel-Hakimi定理 ...

  8. 使用CLion

    CLion是JetBrains公司的一款C++的IDE.默认使用Cmake构建. ubuntu和fedora下的安装 在ubuntu下安装了CLion,和QtCreator相比: ibus输入法能输入 ...

  9. CSU 1416 Practical Number

    原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416 结论题,具体判断方法请点击这个网址. 筛素数是肯定的,但一开始定的范围太大了,想当 ...

  10. 【PAT】1012. 数字分类 (20)

    1012. 数字分类 (20) 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算 ...