求助!sub4超时了一半的点,这个思路有可能过吗。
查看原帖
求助!sub4超时了一半的点,这个思路有可能过吗。
782904
哈哈人生楼主2023/9/3 18:59

悬赏关注+赞博客。

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
typedef int type;
inline type read(){
	type x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(type x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x / 10);
	putchar(x%10+'0');
}
int n,d,k;
bool pd=0,ans[1000005];
void dfs(int ls,int bs,int jh) {
    if(bs>n+1||jh>d||pd)return;
	else if(jh+ls*((n+1)-bs)>d)return;
	else if(jh+ls*((n+1)-bs)==d){
		pd=1;
		return;
	}
	else if(jh+(ls+1+((n+1)-bs+ls+1))*(n+1-bs)/2<d)return;
	if(bs==n+1) {
		if(jh==d)pd=1;
		return;
	}	
	if(bs+k<=n+1) {
		ans[bs]=ls+1;
		dfs(ls+1,bs+k,jh+(ls+1)*k);
		if(pd)return;
		ans[bs]=0;
	}
	if(true) {
		dfs(ls,bs+1,jh+ls);
		if(pd)return;
	}
}
inline void sc() {
	register int cs=1;
	write(cs),putchar(' ');
	for(register int i=3; i<=n; i++) {
		if(ans[i]!=0)cs=i-1,ans[i]=0;
		write(cs),putchar(' ');
	}
}
int t;
signed main() {
	ans[2]=true;
	t=read();
	while(t--) {
		n=read(),d=read(),k=read();
		dfs(1,2+k,k);
		if(pd)putchar('Y'),putchar('E'),putchar('S'),putchar('\n'),sc();
		else putchar('N'),putchar('O');
		putchar('\n');
		pd=0;
	}
	return 0;
}
2023/9/3 18:59
加载中...