70pts求助,第10个点数据点下载下来后 fc 后答案正确
查看原帖
70pts求助,第10个点数据点下载下来后 fc 后答案正确
1015770
Arteg楼主2024/9/4 11:43
/*
 前之君待,湿露月九。
 问有我无,谁为方彼。
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define eb emplace_back
#define lb(x) (x&-x);

const int maxn=200010;
const int mo=1000000007;
const int inf=0x3f3f3f3f3f3f3f3f;

//#define Finline __inline__ __attribute__((always_inline))
//
//Finline char gc(){
//	static char buf[200000001],*p1=buf,*p2=buf+fread(buf,1,200000000,stdin);
//	return p1==p2?EOF:*p1++;
//}
//
//inline int read(){
//	int num=0,f=1;
//	char c=gc();
//	while(c<'0'||c>'9'){
//		if(c=='-')
//			f=-1;
//		c=gc();
//	}
//	while(c>='0'&&c<='9'){
//		num=num*10+c-'0';
//		c=gc();
//	}
//	return num*f;
//}

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return ;
}

int n,hm,hr,hc,hx,hy,m;
int tot,ice[18][18][22],freeze[18][18],vis[18][18][22],mh,block,door,wall,corner,rd,cd,hd,cr,cc;

char s[50];

int dx[9]={-1,-1,0,1,1,1,0,-1};
int dy[9]={0,-1,-1,-1,0,1,1,1};

int dr[6]={1,-1,0,0,0,0};
int dc[6]={0,0,1,-1,0,0};
int dh[6]={0,0,0,0,1,-1};

void ICE_BARRAGE(int r=0,int c=0,int d=0,int s=0){
	r=read();
	c=read();
	d=read();
	s=read();
	int dis=0,cnt=0;
	while(dis<=s){
		if(r<0||r>=n||c<0||c>=n||ice[r][c][0])
			break;
		if(freeze[r][c]!=4){
			freeze[r][c]++;
			cnt++;
		}
		r=r+dx[d];
		c=c+dy[d];
		dis++;
	}
	printf("CIRNO FREEZED %lld BLOCK(S)\n",cnt);
	return ;
}

void MAKE_ICE_BLOCK(){
	int cnt=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(freeze[i][j]==4){
				cnt++;
				freeze[i][j]=0;
			}
		}
	}
	tot+=cnt;
	printf("CIRNO MADE %lld ICE BLOCK(S),NOW SHE HAS %lld ICE BLOCK(S)\n",cnt,tot);
	return ;
}

bool out(int r,int c,int h){
	return r<0||r>=n||c<0||c>=n||h<0||h>hm;
}

bool check(int r,int c,int h){
	if(ice[r][c][h])
		return 0;
	if(h==0)
		return 1;		
	for(int i=0;i<6;i++){
		int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
		if(out(nr,nc,nh))
			continue;
		if(ice[nr][nc][nh])
			return 1;
	}
	return 0;
}

void PUT_ICE_BLOCK(int r=0,int c=0,int h=0){
	r=read();
	c=read();
	h=read();
	if(tot==0){
		printf("CIRNO HAS NO ICE_BLOCK\n");
		return ;
	}
	if(!check(r,c,h)){
		printf("BAKA CIRNO,CAN'T PUT HERE\n");
		return ;
	}
	tot--;
	ice[r][c][h]=1;
	if(h==0)
		freeze[r][c]=0;
	if(r<hr||r>hr+hx-1||c<hc||c>hc+hy-1)
		printf("CIRNO MISSED THE PLACE\n");
	else if(r>=hr+1&&r<=hr+hx-2&&c>=hc+1&&c<=hc+hy-2)
		printf("CIRNO PUT AN ICE_BLOCK INSIDE THE HOUSE\n");
	else
		printf("CIRNO SUCCESSFULLY PUT AN ICE_BLOCK,NOW SHE HAS %lld ICE_BLOCK(S)\n",tot);
	return ;
}

bool findearth(int r,int c,int h){
	if(h==0)
		return 1;
	vis[r][c][h]=1;
	int cnt=0;
	for(int i=0;i<6;i++){
		int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
		if(out(nr,nc,nh)||!ice[nr][nc][nh]||vis[nr][nc][nh])
			continue;
		int ccc=findearth(nr,nc,nh);
		if(ccc)
			return 1;
	}
	return 0;
}

int erase(int r,int c,int h){
	ice[r][c][h]=0;
	int cnt=1;
	for(int i=0;i<6;i++){
		int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
		if(out(nr,nc,nh)||!ice[nr][nc][nh])
			continue;
		cnt+=erase(nr,nc,nh);
	}
	return cnt;	
}

void REMOVE_ICE_BLOCK(int r=0,int c=0,int h=0){
	r=read();
	c=read();
	h=read();
	if(!ice[r][c][h]){
		printf("BAKA CIRNO,THERE IS NO ICE_BLOCK\n");
		return ;
	}
	tot++;
	ice[r][c][h]=0;
	int cnt=0;
	for(int i=0;i<6;i++){
		int nr=r+dr[i],nc=c+dc[i],nh=h+dh[i];
		if(out(nr,nc,nh)||!ice[nr][nc][nh])
			continue;
		memset(vis,0,sizeof(vis));
		if(!findearth(nr,nc,nh))
			cnt+=erase(nr,nc,nh);
	}
	if(!cnt)
		printf("CIRNO REMOVED AN ICE_BLOCK\n");
	else
		printf("CIRNO REMOVED AN ICE_BLOCK,AND %lld BLOCK(S) ARE BROKEN\n",cnt);
	return ;	
}

int pd(int r,int c,int h){
	if(r>hr&&r<hr+hx-1&&c>hc&&c<hc+hy-1&&h<mh)
		return 1;
	else if(r>=hr&&r<=hr+hx-1&&c>=hc&&c<=hc+hy-1&&h<=mh)
		return 2;
	return 3;
}

int onco(int r,int c){
	if((r==hr&&c==hc)||(r==hr&&c==hc+hy-1)||(r==hr+hx-1&&c==hc)||(r==hr+hx-1&&c==hc+hy-1))
		return 1;
	return 0;
}

bool getcor(int r,int c){
	if(r==hr+1){
		cr=hr;
		cc=c;
		return 1;
	}
	else if(r==hr+hx-2){
		cr=hr+hx-1;
		cc=c;
		return 1;
	}
	else if(c==hc+1){
		cr=r;
		cc=hc;
		return 1;
	}
	else if(c==hc+hy-2){
		cr=r;
		cc=hc+hy-1;
		return 1;
	}
	return 0;
}

void MAKE_ROOF(){
	int cnt=0;
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			int pos=pd(i,j,-1);
			//cout<<pos<<endl;
			//cout<<i<<" "<<j<<endl;			
			if(pos!=2)
				continue;

			for(int k=0;k<hm;k++)
				if(ice[i][j][k])
					mh=max(mh,k+1);
		}
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			if(ice[i][j][mh])
				cnt++;	
			ice[i][j][mh]=1;		
		}
	if(tot+cnt<hx*hy){
		printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCK(S) TO MAKE ROOF\n");
		return ;
	}
	tot-=hx*hy-cnt;
	if(mh<2||(hx-2)*(hy-2)*mh<2){
		printf("SORRY CIRNO,HOUSE IS TOO SMALL\n");
		return ;
	}
	int k1=0,k2=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<hm;k++){
				if(!ice[i][j][k])
					continue;
				int pos=pd(i,j,k);
				if(pos==2)
					continue;
				if(pos==1)
					k1++;
				else if(pos==3)
					k2++;
				ice[i][j][k]=0;
			}
		}
	}
	printf("%lld ICE_BLOCK(S) INSIDE THE HOUSE NEED TO BE REMOVED\n",k1);
	printf("%lld ICE_BLOCK(S) OUTSIDE THE HOUSE NEED TO BE REMOVED\n",k2);
	if(k1||k2)
		block=1;
	tot+=k1+k2;
	cnt=findearth(hr,hc,mh);
	if(!cnt){
		printf("SORRY CIRNO,HOUSE IS BROKEN WHEN REMOVING BLOCKS\n");
		return ;
	}
	cnt=0;
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			for(int k=1;k<=mh-2;k++){
				int pos=pd(i,j,k);
				if(pos!=2)
					continue;
				if(!ice[i][j][k])
					continue;
				memset(vis,0,sizeof(vis));
				if(!findearth(i,j,k))
					cnt+=erase(i,j,k);
			}				
		}
	tot+=cnt;
	cnt=inf;
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			int pos=pd(i,j,0);
			if(pos!=2)
				continue;
			if(ice[i][j][0]||ice[i][j][1]||onco(i,j))
				continue;
			if((i==((hr+hr+hx-1)/2))||(j==((hc+hc+hy-1)/2))||(((hx&1)==0)&&(i==((hr+hr+hx-1)/2+1)))||(((hy&1)==0)&&(j==((hc+hc+hy-1)/2+1)))){
				door=5;
				rd=i;
				cd=j;
			}		
			else if(door<5)
				if(!getcor(i,j)){
					door=4;
					rd=i;
					cd=j;
				}	
				else if(door<4){
					door=3;
					int kkk=(ice[cr][cc][0]==1?0:1)+(ice[cr][cc][1]==1?0:1);
					if(cnt>kkk){
						cnt=kkk;
						rd=i;
						cd=j;
					}
				}
		}
	if(door==3&&cnt){
		getcor(rd,cd);
		wall=1;
		ice[cr][cc][0]=ice[cr][cc][1]=1;
		tot-=cnt;
		if(tot<0){
			printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
			return ;			
		}
	}
	if(door==0){
		cnt=inf;
		for(int i=hr;i<=hr+hx-1;i++)
			for(int j=hc;j<=hc+hy-1;j++){
				int pos=pd(i,j,0);				
				if(pos!=2||onco(i,j)||(ice[i][j][0]&&ice[i][j][1]))
					continue;
				if(!getcor(i,j)){
					door=2;
					rd=i;
					cd=j;
				}
				else if(door<2){
					door=1;
					int hh=(ice[i][j][1]==0?1:0);
					int kkk=(ice[cr][cc][hh]==1?0:1);
					if(cnt>kkk){
						cnt=kkk;
						rd=i;
						cd=j;
						hd=hh;
					}
				}
			}	
		ice[rd][cd][0]=ice[rd][cd][1]=0;
		tot++;
		if(door==1&&cnt){
			getcor(rd,cd);
			ice[cr][cc][hd]=1;
			wall=1;
			tot-=cnt;
			if(tot<0){
				printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
				return ;			
			}
		}	
	}
	cnt=0;
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			if(onco(i,j))
				continue;
			for(int k=0;k<mh;k++){
				int pos=pd(i,j,k);
				if(pos!=2||ice[i][j][k]||((i==rd)&&(j==cd)&&(k<=1)))
					continue;
				wall=1;
				ice[i][j][k]=1;
				cnt++;						
			}	
		}	
	if(cnt>tot){
		printf("SORRY CIRNO,NOT ENOUGH ICE_BLOCKS TO FIX THE WALL\n");
		return ;
	}
	tot-=cnt;
	printf("GOOD JOB CIRNO,SUCCESSFULLY BUILT THE HOUSE\n");
	if(door<=2)
		printf("HOUSE HAS NO DOOR\n");
	else
		printf("DOOR IS OK\n");
	if(wall)
		printf("WALL NEED TO BE FIXED\n");
	else
		printf("WALL IS OK\n");
	cnt=0;
	for(int i=hr;i<=hr+hx-1;i++)
		for(int j=hc;j<=hc+hy-1;j++){
			if(!onco(i,j))
				continue;
			for(int k=0;k<mh;k++){
				if(!ice[i][j][k]){
					corner=1;
					ice[i][j][k]=1;
					cnt++;
				}
			}
		}
	tot=max(0ll,tot-cnt);
	if(cnt)
		printf("CORNER NEED TO BE FIXED\n");
	else
		printf("CORNER IS OK\n");
	printf("CIRNO FINALLY HAS %lld ICE_BLOCK(S)\n",tot);
	if((!wall)&&(!block)&&(door==5)&&(!corner))
		printf("CIRNO IS PERFECT!\n");	
	return ;
}

signed main(){
//	freopen("qln.out","w",stdout);
	n=read();
	hm=read();
	hr=read();
	hc=read();
	hx=read();
	hy=read();
	m=read();
	while(m--){
		scanf("%s",s);
		if(s[0]=='I')
			ICE_BARRAGE();
		else if(s[0]=='M'&&s[5]=='I')
			MAKE_ICE_BLOCK();
		else if(s[0]=='P')
			PUT_ICE_BLOCK();
		else if(s[0]=='R')
			REMOVE_ICE_BLOCK();
		else if(s[0]=='M'&&s[5]=='R')
			MAKE_ROOF();
	}
	return 0;
}
2024/9/4 11:43
加载中...