代码打印

2025-cpc-21 2025-05-18 16:05:06

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int read()
{
	int r=0, f=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9') {r=r*10+ch-'0'; ch=getchar();}
	return r*f;	
}
struct Node{
	int v,x,p;
	inline friend bool operator <(const Node &x,const Node &y){
		if(x.p==y.p)return x.x<y.x;
		return x.p<y.p;
	}
}a[N];
int f[N],ans[N],b[N],c[N][2];
int main()
{
	//freopen("testdata.in","r",stdin);
    int t=read();
    while(t--){
    	int flag=1,n=read(),m=read();
    	for(register int i=1;i<=n;++i){
		    b[i]=ans[i]=0;
			c[i][0]=0;c[i][1]=n;
		}
    	for(register int i=1;i<=m;++i){
    		a[i].v=read();a[i].x=read();a[i].p=read();
    		if(a[i].p==0)c[a[i].v][1]=min(c[a[i].v][1],a[i].x);
    		else c[a[i].v][0]=max(c[a[i].v][0],a[i].x);
    		b[a[i].v]=1;
		}
		for(register int i=2;i<=n;++i)
		    if(c[i][1]<c[i][0]){flag=0;break;}
		for(register int i=1;i<=m;++i){
			if(c[a[i].v][0]==0||c[a[i].v][1]==n)continue;
			a[i].x=c[a[i].v][1];a[i].p=0;
		}
		sort(a+1,a+m+1);
		int cnt=1,ff=0;f[1]=1;
		for(register int i=1;i<=m&&flag;++i)
		    if(a[i].p==0){
		    	if(ans[a[i].v])continue;
		    	if(a[i].x>=cnt){f[++cnt]=a[i].v;ans[a[i].v]=f[cnt-1];}
		    	else ans[a[i].v]=f[a[i].x];
			}
			else{
				if(!ff){
		            for(register int i=2;i<=n;++i)
		            if(!b[i]){f[++cnt]=i;ans[i]=f[cnt-1];}
		            ff=1;
				}
				if(ans[a[i].v])continue;
				if(a[i].x>cnt){flag=0;break;}
				else{f[++cnt]=a[i].v;ans[a[i].v]=f[cnt-1];}
			}
	    if(flag==0)printf("Ugly\n");
	    else{
	    	printf("Beautiful\n");
	    	for(register int i=2;i<=n;++i)
	    	    printf("%d %d\n",i,ans[i]);
		}
	}
	return (0-0);
}

共 1 条回复

2025-cpc-root

1