MnZn 求助,WA on #5,调不出来
查看原帖
MnZn 求助,WA on #5,调不出来
122641
GIFBMP楼主2022/4/24 15:02

Rt,

#include <cstdio>
#include <cstring>
using namespace std ;
const int MAXN = 5e3 + 10 ;
int T , n , d , t[MAXN] , dep[MAXN] ;
struct node {
	int lc , rc , fa ;
	node () {lc = rc = fa = 0 ;}
} a[MAXN] ;
int main () {
	scanf ("%d" , &T) ;
	while (T--) {
		scanf ("%d%d" , &n , &d) ;
		memset (a , 0 , sizeof (a)) ;
		for (int i = 1 ; i <= n ; i++) t[i] = dep[i] = 0 ;
		int mx = n * (n - 1) / 2 , mn = 0 , nw = 1 ;
		t[0] = 1 ;
		for (int i = 2 ; i <= n ; i++) {
			if (t[nw] < 2 * t[nw - 1]) mn += nw , t[nw]++ ;
			else nw++ , mn += nw , t[nw]++ ;
		}
		if (d > mx || d < mn) {
			puts ("NO") ;
			continue ;
		}
		//printf ("*%d %d\n" , mx , mn) ;
		puts ("YES") ;
		for (int i = 1 ; i <= n ; i++)
			a[i].lc = (i < n) * (i + 1) , a[i].fa = i - 1 , dep[i] = i - 1 ;
		nw = mx ;
		for (int i = n ; i > 1 ; i--) {
			if (nw > d) {
				if (a[a[i].fa].lc == i) a[a[i].fa].lc = 0 ;
				else a[a[i].fa].rc = 0 ;
				//printf ("%d %d\n" , nw , d) ;
				int tmp = nw - d ;
				if (tmp < dep[i]) {
					int mnd = n , p = 0 ;
//					for (int j = 1 ; j <= n ; j++) printf ("%d " , dep[j]) ;
//					puts ("") ;
					for (int j = 1 ; j <= n ; j++) {
						//if (j == 11) printf ("*%d %d:%d %d %d %d\n" , dep[i] - dep[j] - 1 , tmp , dep[j] , mnd , a[j].lc , a[j].rc) ;
						if (j != i && dep[i] - dep[j] - 1 <= tmp && dep[j] < mnd && (!a[j].lc || !a[j].rc))
							mnd = dep[j] , p = j ;
					}
					nw -= dep[i] - dep[p] - 1 ; dep[i] = mnd + 1 ; a[i].fa = p ; 
					//printf ("%d->%d\n" , p , i) ;
					if (!a[p].lc) a[p].lc = i ;
					else a[p].rc = i ;
				}
				else {
					for (int j = 1 , k = n ; j < k ;) {
						//printf ("**%d-%d:%d %d\n" , j , k , dep[j] , dep[k]) ;
						if (dep[j] <= dep[k] && j != i && (!a[j].lc || !a[j].rc)) {
							//printf ("*") ;
							if (!a[j].lc) {
								a[i].fa = j , a[j].lc = i ; nw -= dep[i] - dep[j] - 1 ;
								dep[i] = dep[j] + 1 ;
								break ;
							}
							if (!a[j].rc) {
								a[i].fa = j , a[j].rc = i ; nw -= dep[i] - dep[j] - 1 ;
								dep[i] = dep[j] + 1 ; //printf ("%d->%d\n" , j , i) ;
								break ;
							}
							j++ ;
						}
						else if (k != i && (!a[k].lc || !a[k].rc)) {
							if (!a[k].lc) {
								a[i].fa = k , a[k].lc = i ; nw -= dep[i] - dep[k] - 1 ;
								dep[i] = dep[k] + 1 ; //printf ("%d->%d\n" , k , i) ;
								break ;
							}
							if (!a[k].rc) {
								a[i].fa = k , a[k].rc = i ; nw -= dep[i] - dep[k] - 1 ;
								dep[i] = dep[k] + 1 ; //printf ("%d->%d\n" , k , i) ;
								break ;
							}
							k-- ;
						}
						else j++ , k-- ;
					}
				}
			}
			else break ;
		}
		for (int i = 2 ; i <= n ; i++) printf ("%d " , a[i].fa) ;
		puts ("") ;
	}
	return 0 ;
}
/*
1
668 4999
*/
2022/4/24 15:02
加载中...