NOIP-2018 提高组(复赛) 模拟试题之--T1 帽子戏法

NOIP 2018资料下载

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;
}

猜你喜欢

转载自blog.csdn.net/tianli315/article/details/84851982