#10 TLE,求hack
查看原帖
#10 TLE,求hack
175456
Licykoc楼主2021/3/18 22:45
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false),cout.tie(0)
#define UP(x,l,r) for (int x=l;x<=r;++x)
#define DOWN(x,l,r) for (int x=l;x>=r;--x)
#define pb push_back
#define low(x) (x&(-x))
using namespace std;
inline void read (int &x) {
	char c=getchar(); int w=0; x=0;
	for (;!isdigit(c);c=getchar()) w^=!(c^45);
	for (;isdigit(c);c=getchar()) x=(x*10)+(c^48);
	x=w?-x:x;
}
const int MAXN=3e3;
int n,m,k,K,Mx,x,y;
int add[MAXN];
int L[MAXN],R[MAXN],C[MAXN];
bool P[MAXN][MAXN];
char Map[MAXN][MAXN];
bool pd (int k,int x) {
	UP(i,x,Mx) if (Map[k][i]!=' ') return 0;
	return 1;
}
void Right (int x,int y) {
	Map[x][y]='a';
	while (Map[--x][++y]=='/') Map[x][y]=' ';
}
void Left (int x,int y) {
	Map[x][y]='a';
	while (Map[--x][--y]=='\\') Map[x][y]=' ';
}
void MLeft (int x,int y,int mx,char c) {
	while (x<=mx) {
		Map[x][y]=c;
		++x; --y;
	}
}
void MRight (int x,int y,int mx,char c) {
	while (x<=mx) {
		Map[x][y]=c;
		++x; ++y;
	}
}
void make (int k,int line) {
	if (!line) {K=k; return;}
	if (k==1) {
		UP(i,1,Mx) Map[k][i]=' ';
		Map[k][(Mx+1)/2]='o';
		if (!P[1][1]) make(k+1,line-1);
		return;
	}
	// cout<<k<<endl;
	UP(i,1,Mx) if (Map[k-1][i]=='o') {
		MLeft(k,i-1,k+add[line]-1,'/'),MRight(k,i+1,k+add[line]-1,'\\');
	} else if (Map[k-1][i]=='a') {
		MLeft(k,i-1,k+add[line]-1,'b'),MRight(k,i+1,k+add[line]-1,'c');
	}
	k=k+add[line];
	int last=0,last1=0,flag=0;
	int cnt_l=0,cnt_r=0,cnt=0;
	UP(i,1,Mx) {
		if (Map[k-1][i]=='o') Map[k][i-1]='/',Map[k][i+1]='\\'; 
		if (Map[k-1][i]=='a') Map[k][i-1]='b',Map[k][i+1]='c'; 
		if (Map[k-1][i]=='/') {
			if (i-1==Mx>>(n-line+1)||i-1==1) L[++cnt_l]=i-1,flag=1,Map[k][i-1]='o',last=i-1; else
				if (last&&((i-1)-last)%(Mx>>(n-line-1))==0) L[++cnt_l]=i-1,flag=1,Map[k][i-1]='o'; else 
					Map[k][i-1]='/';
			continue;
		}
		if (Map[k-1][i]=='b') {
			if (i-1==Mx>>(n-line+1)||i-1==1) L[++cnt_l]=i-1,flag=1,Map[k][i-1]='a',last=i-1; else
				if (last&&((i-1)-last)%(Mx>>(n-line-1))==0) L[++cnt_l]=i-1,flag=1,Map[k][i-1]='a'; else 
					Map[k][i-1]='b';
			continue;
		}
		if (Map[k-1][i]=='\\') {
			int T=Mx-(i+1);
			if (T%(Mx>>(n-line+1))==0) R[++cnt_r]=i+1,flag=1,Map[k][i+1]='o',last1=T; else
				if (last1&&(last1-T+1)%(Mx>>(n-line-1))==0) R[++cnt_r]=i+1,flag=1,Map[k][i+1]='o'; else 
					Map[k][i+1]='\\';
			continue;
		}
		if (Map[k-1][i]=='c') {
			int T=Mx-(i+1);
			if (T%(Mx>>(n-line+1))==0) R[++cnt_r]=i+1,flag=1,Map[k][i+1]='a',last1=T; else
				if (last1&&(last1-T+1)%(Mx>>(n-line-1))==0) R[++cnt_r]=i+1,flag=1,Map[k][i+1]='a'; else 
					Map[k][i+1]='c';
			continue;
		}
	}
	int i=1,j=1;
	while (i<=cnt_l&&j<=cnt_r)
		if (L[i]<R[j]) C[++cnt]=L[i],++i; else C[++cnt]=(int)1e6+R[j],++j;
	while (i<=cnt_l) C[++cnt]=L[i++];
	while (j<=cnt_r) C[++cnt]=(int)1e6+R[j++];
	UP(i,1,cnt) if (P[n-line+1][i]) {
		if (C[i]<1e6) Right(k,C[i]); else Left(k,C[i]-(int)1e6);
	}
	UP(i,1,Mx) if (Map[k][i]!='\\'&&Map[k][i]!='/'&&Map[k][i]!='o'&&Map[k][i]!='a'&&Map[k][i]!='b'&&Map[k][i]!='c') Map[k][i]=' ';
	make(k+1,line-1);
	// if (flag) make(k+1,line-1); else make(k+1,line);
}
int main () {
	IOS;
	read(n),read(m);
	UP(i,1,m) {read(x),read(y);if (x>10) continue;P[x][y]=1;}
	add[1]=1; int S=1;
	UP(i,2,14) add[i]=S+(i-1),S+=add[i];
	Mx=(1<<(n-2))*6;
	// cout<<1<<endl; return 0;
	make(1,n);
	UP(i,1,K) {
		UP(j,1,Mx) putchar(Map[i][j]!='/'&&Map[i][j]!='\\'&&Map[i][j]!='o'?' ':Map[i][j]);
		puts("");
	}
}
2021/3/18 22:45
加载中...