普通模拟
put 表示将要输出的一行的内容
fl 表示某一行某一列(节点)是否被删除
a 表示高度为 i 的节点要分出多大的叉
pre 单纯为求 a 服务
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int put[1<<15][2];
bool fl[15][1<<15];
inline ll read(){
ll ref=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) ref=(ref<<1)+(ref<<3)+ch-48,ch=getchar();
return ref*f;
}
int main(){
// freopen("aaa.txt","w",stdout);
int n=read(),m=read();
int a[20]={1},pre[20]={1};
for(int i=1;i<20;i++){
a[i]=pre[i-1]+i;
pre[i]=pre[i-1]+a[i];
}
for(int i=0;i<m;i++){
int ik=read(),un=read();
fl[ik][un]=1;
}
if(!fl[1][1]) put[a[n-1]][0]=5;
for(int i=n-1;i>0;i--){
int cnt=0;
for(int j=0;j<a[n];j++){
if(put[j][0]){
printf("o");cnt++;
put[j-1][1]=1,put[j+1][1]=2;
if(fl[n-i+1][(cnt<<1)-1]) put[j-1][1]=0;
if(fl[n-i+1][cnt<<1]) put[j+1][1]=0;
}else printf(" ");
}puts("");
for(int j=0;j<a[n];j++) put[j][0]=put[j][1],put[j][1]=0;
for(int j=0;j<a[i-1];j++){
for(int k=0;k<a[n];k++){
if(put[k][0]==1){
printf("/");
put[k-1][1]=1;
}else if(put[k][0]==2){
printf("\\");
put[k+1][1]=2;
}else printf(" ");
}
puts("");
for(int k=0;k<a[n];k++) put[k][0]=put[k][1],put[k][1]=0;
}
}
for(int j=0;j<a[n];j++){
if(put[j][0]) printf("o");
else printf(" ");
}
return 0;
}