T1 帽子戏法
问题描述
小 Y 有一个n∗n∗nn∗n∗n的“帽子立方体” ,即一个nn层的立方体,每层的帽子都
可以排成n∗nn∗n的矩阵。 “帽子立方体”中的每一个帽子都有一个颜色,颜色共 26
种,用 26 个大写字母来表示。
现在,小 Y 邀请小 F 来表演她的帽子戏法。小 F 会 22 种帽子戏法:
指定一个长方体形状的区域,将指定区域内的所有帽子全部变成指定的
颜色。
指定一个长方体形状的区域,将指定区域内所有指定颜色帽子全部变成
绿色(用大写字母GG表示) 。
小Y很喜欢绿色, 所以初始时立方体内的所有帽子都是绿色的。 不仅如此,
小Y还会时不时地提出问题:他会指定一个长方体形状的区域,并询问在这个
区域内有多少绿色的帽子。
小Y的帽子琳琅满目,请你来帮他数一数吧!
输入格式
第一行 2 个正整数n,Qn,Q,分别描述立方体的大小、以及小 F 表演帽子戏法和
小 Y 提问的总次数。
接下来Q行,每行第一个数op(0≤op≤2)op(0≤op≤2)表示这次询问或帽子戏法的类型。
若op=0op=0,表示这是小 Y 的一个提问,接下来 6 个正整数描述询问指定的
区域。
若op=1op=1,接下来 6 个正整数表示帽子戏法指定的区域,之后一个大写字母
/%0表示小 F 会把指定区域内的所有帽子都变成colcol颜色。
若op=2op=2, 接下来 6 个正整数表示帽子戏法指定的区域, 表示小 F 会把指定
区域内的所有帽子都变成绿色。
描述一个区域的方法为:用 6 个整数x0,y0,z0,x1,y1,z1x0,y0,z0,x1,y1,z1 表示从第x0x0层至第x1x1
层,从第y0y0行至第y1y1行,从第z0z0列至第z1z1列的区域(层、行、列编号的范围都是
1…n) 。
输出格式
对于每个询问,输出一行一个整数表示答案。
样例
样例输入
3 5
1 2 2 2 3 3 3 B
1 1 3 2 3 3 2 R
0 1 1 1 3 3 3
2 3 3 3 3 3 3 B
0 2 1 3 3 3 3
样例输出
18
3
数据范围
对于 10%的数据,保证n=1n=1。
对于另外 10%的数据,保证只有询问操作,即保证op=0op=0。
对于 30%的数据,保证n≤5,Q≤10n≤5,Q≤10。
对于 100%的数据,保证n≤40,Q≤200n≤40,Q≤200。
题解
看一下数据范围就应该知道是暴力的吧。maxn∗maxn∗maxn∗maxQ=12800000maxn∗maxn∗maxn∗maxQ=12800000,排除每一次查询、更改操作全部为最大操作的情况可知,O(n3)O(n3)可解
贴出代码
#include<bits/stdc++.h>
#define maxn 405
using namespace std;
int n,q,ans;
int x1,z1,x2,y2,z2;
int y01,cmd;
char cas;
char a[maxn][maxn][maxn];
int main(){
//freopen("hat.in","r",stdin);
//freopen("hat.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>q;
for(register int i=0;i<=n;i++){
for(register int j=0;j<=n;j++){
for(register int k=0;k<=n;k++)a[i][j][k]='G';
}
}
while(q--){
cin>>cmd;
if(cmd==0){
ans=0;
cin>>x1>>y01>>z1>>x2>>y2>>z2;
//cout<<x1<<" "<<y01<<" "<<z1<<" "<<x2<<" "<<y2<<" "<<z2<<endl;
for(register int i=x1;i<=x2;i++){
for(register int j=y01;j<=y2;j++){
for(register int k=z1;k<=z2;k++){
//cout<<"now:"<<i<<" "<<j<<" "<<k<<" "<<a[i][j][k]<<endl;
if(a[i][j][k]=='G')ans++;
}
}
}
cout<<ans<<endl;
}
else if(cmd==1){
cin>>x1>>y01>>z1>>x2>>y2>>z2;
//cout<<x1<<" "<<y01<<" "<<z1<<" "<<x2<<" "<<y2<<' '<<z2<<endl;
cin>>cas;
for(register int i=x1;i<=x2;i++){
for(register int j=y01;j<=y2;j++){
for(register int k=z1;k<=z2;k++){
a[i][j][k]=cas;
}
}
}
}
else if(cmd==2){
cin>>x1>>y01>>z1>>x2>>y2>>z2;
//cout<<x1<<" "<<y01<<" "<<z1<<" "<<x2<<" "<<y2<<' '<<z2<<endl;
cin>>cas;
for(register int i=x1;i<=x2;i++){
for(register int j=y01;j<=y2;j++){
for(register int k=z1;k<=z2;k++){
if(a[i][j][k]==cas){
a[i][j][k]='G';
//cout<<i<<" "<<j<<" "<<k<<" "<<a[i][j][k]<<endl;
}
}
}
}
}
}
return 0;
}