BZOJ4088: [Sdoi2015]立体图
高一联赛之后不久写的。当时看到这题就感觉特别优美。那个时候啥都不会,就只会这种模拟题,还只会最暴力的方法。对于每个方向的灯,枚举每个位置,手动枚举所有遮挡效果,并在枚举位置过程中传递遮挡效果。
const char* graph[]={
" +-------+",
" /5\\7777\'/|",
" /55.*\'88/9|",
" /.6666\\8/9/|",
"+-------+9.0|",
"|\\44444/|\\:0|",
"|1\\444/3|b*0|",
"|11\\4/33|b:\\|",
"|111X333|b\'a+",
"|11/2\\33|/a/ ",
"|1/222\\3|a/ ",
"|/22222\\|/ ",
"+-------+ "
};
enum{RED=1,GREEN=2,BLUE=4};
const char* colors="KRGYBPCW";
typedef int cube[12];
cube v[102][102][102];
int h[102][102];
int g[102][102];
char f(cube& a,int x,int y){
int u=graph[x][y];
return u<48||u>57&&u<97||u>98?u:colors[a[u-48-(u>'9')*39]];
}
char s[1201][1202];
int n,m;
void cover(cube& a,int x,int y){
for(int i=0;i!=12;++i)
while(a[i]>>3)
a[i]=a[i]&7|a[i]>>3;
for(int i=0;i!=13;++i)
for(int j=0;j!=13;++j)
if(f(a,12-i,j)!=' ')
s[x+i][y+j]=f(a,12-i,j);
}
#include<cstring>
#include<cstdio>
#include<algorithm>
using std::max;
#define FOR(x,y,z,f)\
for(int x=1;x<=m;++x)\
for(int y=1;y<=n;++y)\
for(int z=1;z<=f[x][y];++z)
void print(){
memset(s,' ',sizeof s);
FOR(x,y,z,h)
cover(v[x][y][z],(m-x)*4+(z-1)*8,(m-x)*4+(y-1)*8);
for(int i=sizeof s/sizeof *s-1;~i;--i)
for(int j=sizeof *s-1;j&&s[i][j]==' ';--j)
if(s[i][j-1]!=' '){
s[i][j]=0;
puts(s[i]);
}
}
#define shade(x,y,z,i) v[x][y][z][i]|=u
int main(){
scanf("%d%d",&m,&n);
for(int x=1;x<=m;++x)
for(int y=1;y<=n;++y)
scanf("%d",h[x]+y);
char t[10];
for(int i=0;i!=3;++i)
scanf("%s",t+i*3);
for(int k=0;k!=9;++k){
if(t[k]=='*')
continue;
int u=(t[k]=='R'?RED:t[k]=='G'?GREEN:BLUE)<<k*3;
if(k==0){
memcpy(g,h,sizeof g);
for(int x=2;x<=m;++x)
for(int y=2;y<=n;++y)
g[x][y]=max(g[x][y],g[x-1][y-1]-1);
FOR(x,y,z,g){
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x+1,y+1,z-1,5);
shade(x+1,y+1,z-1,6);
shade(x+1,y+1,z-1,7);
shade(x+1,y+1,z-1,8);
shade(x,y+1,z-1,5);
shade(x,y+1,z-1,6);
shade(x+1,y,z-1,7);
shade(x+1,y,z-1,8);
}
FOR(x,y,z,h)
for(int i=5;i<=8;++i)
v[x][y][z][i]^=u;
}
if(k==1){
memcpy(g,h,sizeof g);
for(int x=2;x<=m;++x)
for(int y=1;y<=n;++y)
g[x][y]=max(g[x][y],g[x-1][y]-1);
FOR(x,y,z,g){
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x+1,y,z-1,5);
shade(x+1,y,z-1,6);
shade(x+1,y,z-1,7);
shade(x+1,y,z-1,8);
}
FOR(x,y,z,h)
for(int i=5;i<=8;++i)
v[x][y][z][i]^=u;
}
if(k==2){
memcpy(g,h,sizeof g);
for(int x=2;x<=m;++x)
for(int y=n-1;y;--y)
g[x][y]=max(g[x][y],g[x-1][y+1]-1);
FOR(x,y,z,g){
shade(x+1,y-1,z,0);
shade(x+1,y-1,z,10);
shade(x,y-1,z,9);
shade(x,y-1,z,0);
shade(x,y-1,z,10);
shade(x,y-1,z,11);
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x+1,y-1,z-1,5);
shade(x+1,y-1,z-1,6);
shade(x+1,y-1,z-1,7);
shade(x+1,y-1,z-1,8);
shade(x+1,y-1,z-1,9);
shade(x+1,y-1,z-1,0);
shade(x+1,y-1,z-1,10);
shade(x+1,y-1,z-1,11);
shade(x+1,y,z-1,5);
shade(x+1,y,z-1,7);
shade(x,y-1,z-1,6);
shade(x,y-1,z-1,8);
shade(x,y-1,z-1,9);
shade(x,y-1,z-1,0);
shade(x,y-1,z-1,10);
shade(x,y-1,z-1,11);
}
FOR(x,y,z,h){
for(int i=5;i!=12;++i)
v[x][y][z][i]^=u;
v[x][y][z][0]^=u;
}
}
if(k==3){
memcpy(g,h,sizeof g);
for(int x=1;x<=m;++x)
for(int y=2;y<=n;++y)
g[x][y]=max(g[x][y],g[x][y-1]-1);
FOR(x,y,z,g){
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x,y+1,z-1,5);
shade(x,y+1,z-1,6);
shade(x,y+1,z-1,7);
shade(x,y+1,z-1,8);
}
FOR(x,y,z,h)
for(int i=5;i<=8;++i)
v[x][y][z][i]^=u;
}
if(k==4){
for(int x=1;x<=m;++x)
for(int y=1;y<=n;++y)
for(int i=5;i<=8;++i)
shade(x,y,h[x][y],i);
}
if(k==5){
memcpy(g,h,sizeof g);
for(int x=1;x<=m;++x)
for(int y=n-1;y;--y)
g[x][y]=max(g[x][y],g[x][y+1]-1);
FOR(x,y,z,g){
shade(x,y-1,z,9);
shade(x,y-1,z,0);
shade(x,y-1,z,10);
shade(x,y-1,z,11);
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x,y-1,z-1,5);
shade(x,y-1,z-1,6);
shade(x,y-1,z-1,7);
shade(x,y-1,z-1,8);
shade(x,y-1,z-1,9);
shade(x,y-1,z-1,0);
shade(x,y-1,z-1,10);
shade(x,y-1,z-1,11);
}
FOR(x,y,z,h){
for(int i=5;i!=12;++i)
v[x][y][z][i]^=u;
v[x][y][z][0]^=u;
}
}
if(k==6){
memcpy(g,h,sizeof g);
for(int x=m-1;x;--x)
for(int y=2;y<=n;++y)
g[x][y]=max(g[x][y],g[x+1][y-1]-1);
FOR(x,y,z,g){
shade(x-1,y+1,z,1);
shade(x-1,y+1,z,2);
shade(x-1,y,z,1);
shade(x-1,y,z,2);
shade(x-1,y,z,3);
shade(x-1,y,z,4);
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x-1,y+1,z-1,1);
shade(x-1,y+1,z-1,2);
shade(x-1,y+1,z-1,3);
shade(x-1,y+1,z-1,4);
shade(x-1,y+1,z-1,5);
shade(x-1,y+1,z-1,6);
shade(x-1,y+1,z-1,7);
shade(x-1,y+1,z-1,8);
shade(x-1,y,z-1,1);
shade(x-1,y,z-1,2);
shade(x-1,y,z-1,3);
shade(x-1,y,z-1,4);
shade(x-1,y,z-1,6);
shade(x-1,y,z-1,8);
shade(x,y+1,z-1,5);
shade(x,y+1,z-1,7);
}
FOR(x,y,z,h)
for(int i=1;i<=8;++i)
v[x][y][z][i]^=u;
}
if(k==7){
memcpy(g,h,sizeof g);
for(int x=m-1;x;--x)
for(int y=n;y;--y)
g[x][y]=max(g[x][y],g[x+1][y]-1);
FOR(x,y,z,g){
shade(x-1,y,z,1);
shade(x-1,y,z,2);
shade(x-1,y,z,3);
shade(x-1,y,z,4);
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x-1,y,z-1,1);
shade(x-1,y,z-1,2);
shade(x-1,y,z-1,3);
shade(x-1,y,z-1,4);
shade(x-1,y,z-1,5);
shade(x-1,y,z-1,6);
shade(x-1,y,z-1,7);
shade(x-1,y,z-1,8);
}
FOR(x,y,z,h)
for(int i=1;i<=8;++i)
v[x][y][z][i]^=u;
}
if(k==8){
memcpy(g,h,sizeof g);
for(int x=m-1;x;--x)
for(int y=n-1;y;--y)
g[x][y]=max(g[x][y],g[x+1][y+1]-1);
FOR(x,y,z,g){
shade(x-1,y-1,z,2);
shade(x-1,y-1,z,3);
shade(x-1,y-1,z,10);
shade(x-1,y-1,z,11);
shade(x-1,y,z,1);
shade(x-1,y,z,2);
shade(x-1,y,z,3);
shade(x-1,y,z,4);
shade(x,y-1,z,9);
shade(x,y-1,z,0);
shade(x,y-1,z,10);
shade(x,y-1,z,11);
shade(x,y,z-1,5);
shade(x,y,z-1,6);
shade(x,y,z-1,7);
shade(x,y,z-1,8);
shade(x-1,y-1,z-1,1);
shade(x-1,y-1,z-1,2);
shade(x-1,y-1,z-1,3);
shade(x-1,y-1,z-1,4);
shade(x-1,y-1,z-1,5);
shade(x-1,y-1,z-1,6);
shade(x-1,y-1,z-1,7);
shade(x-1,y-1,z-1,8);
shade(x-1,y-1,z-1,9);
shade(x-1,y-1,z-1,0);
shade(x-1,y-1,z-1,10);
shade(x-1,y-1,z-1,11);
shade(x-1,y,z-1,1);
shade(x-1,y,z-1,2);
shade(x-1,y,z-1,3);
shade(x-1,y,z-1,4);
shade(x-1,y,z-1,5);
shade(x-1,y,z-1,6);
shade(x,y-1,z-1,7);
shade(x,y-1,z-1,8);
shade(x,y-1,z-1,9);
shade(x,y-1,z-1,0);
shade(x,y-1,z-1,10);
shade(x,y-1,z-1,11);
}
FOR(x,y,z,h)
for(int i=0;i!=12;++i)
v[x][y][z][i]^=u;
}
}
print();
}
BZOJ4088: [Sdoi2015]立体图的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab slice方法和包络法绘制三维立体图
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- [BZOJ3991][SDOI2015]寻宝游戏
[BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...
- NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
- 【BZOJ】【3991】【SDOI2015】寻宝游戏
dfs序 我哭啊……这题在考试的时候(我不是山东的,CH大法吼)没想出来……只写了50分的暴力QAQ 而且苦逼的写的比正解还长……我骗点分容易吗QAQ 骗分做法: 1.$n,m\leq 1000$: ...
- Vijos P1497 立体图【模拟】
立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子, ...
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- BZOJ 3990: [SDOI2015]排序 [搜索]
3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...
随机推荐
- mysql日期格式转化
select DATE_FORMAT( '20170701', '%Y-%m-%d'); 先挖坑
- vsftpd 虚拟用户限定在虚拟用户目录
1.安装vsftpd yum -y install pam pam-devel db4 db4-tcl vsftpd 2.更名默认配置文件,以便恢复 cp /etc/vsftpd/vsftpd.con ...
- MyBatis做动态模糊查询时,like后面要不要加单引号??
做项目遇到了个奇怪的问题,项目里面要对商品.账户.进行分别的多条件查询,于是我就采用动态多条件分页查询,起初在做账户部分的时候Mybatis是这样写的 <!-- 动态多条件分页查询 --> ...
- Tinker 热修复框架 简单上手教程
当你们看到Tinker的时候是不是有点愣逼这个是什么东西? 简单来说就是不需要重新下载app和重新安装app 来进行更新app的技术框架. 看看这个吧,我也是才学习 ,先做个学习记录 参考:Tinke ...
- LA 3882 And Then There Was One[约瑟夫问题的变形]
And Then There Was One UVALive - 3882 Sample Input Sample Output //设f[i]为(原约瑟夫问题)第i次要删除的标号 #includ ...
- Optimizer in SQL - Catalyst Optimizer in Spark SQL
SELECT sum(v) FROM ( SELECT score.id, 100+80+score.math_score+ score.english_score AS v FROM p ...
- 我的Java开发学习之旅------>使用Working Setst将Eclipse中的项目分类使项目一目了然
今天发现Eclipse中若有太多的项目,杂七杂八的,看起来会非常的痛苦.今天请教公司的前辈学会了一个方法,在Eclipse中,当项目比较多的时候,我们可以用WorkingSet将这些项目分类,把相关连 ...
- apache 网页301重定向、自定义400/403/404/500错误页面
首先简单介绍一下,.htaccess文件是Apache服务器中的一个配置文件(Nginx服务器没有),它负责相关目录下的网页配置.通过对.htaccess文件进行设置,可以帮我们实现:网页301重定向 ...
- JS的事件流概念*******
事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件. 事件流 事件流描述的 ...
- Ubuntu编译Android使用的FFmpeg
本文介绍在Ubuntu平台编译FFmpeg库,用于Android使用.前提需要配置好NDK的环境.可以参考之前的文章Android NDK环境搭建. 下载FFmpeg 在官网下载FFmpeg源码,ht ...