1. 程式人生 > >NOIP-2018 提高組(複賽) 模擬試題之--T1 帽子戲法

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