简单暴力0分求调,悬关
查看原帖
简单暴力0分求调,悬关
549999
sail_with_pleasure楼主2023/6/27 17:16

自己测极限数据是过了的,三个暴力点都是第九组数据出现的错误

#include<bits/stdc++.h>
#define pi pair<int,int> 
#define mid (l+r)/2
#define N 100001
using namespace std;
int t,n,k,l[N],r[N],a[N],ans;
int dfs2(int s){
	if(s==n+1){
		return 1;
	}
	int z=0;
	if(a[s]>=2||a[s]==0)z|=dfs2(s+1);
	if(a[s]>0&&a[s+1]>0&&a[s+2]>0){
		a[s]--;
		a[s+1]--;
		a[s+2]--;
		z|=dfs2(s);
		a[s]++;
		a[s+1]++;
		a[s+2]++;
	}
	if(a[s]>0&&a[s+1]>0&&a[s+2]>0&&a[s+3]>0){
		a[s]--;
		a[s+1]--;
		a[s+2]--;
		a[s+3]--;
		z|=dfs2(s);
		a[s]++;
		a[s+1]++;
		a[s+2]++;
		a[s+3]++;
	}
	if(a[s]>0&&a[s+1]>0&&a[s+2]>0&&a[s+3]>0&&a[s+4]>0){
		a[s]--;
		a[s+1]--;
		a[s+2]--;
		a[s+3]--;
		a[s+4]--;
		z|=dfs2(s);
		a[s]++;
		a[s+1]++;
		a[s+2]++;
		a[s+3]++;
		a[s+4]++;
	}
	return z;
}
void dfs(int s){
	if(s==n+1){
		int cnt=0;
		if(k==0)cnt|=dfs2(1);
		if(k==1){
			for(int i=1;i<=n;i++){
				if(cnt)break;
				a[i]++;
				cnt|=dfs2(1);
				a[i]--;
			}
		}
		if(k==2){
			for(int i=1;i<=n;i++){
				a[i]++;
				if(cnt)break;
				for(int j=i;j<=n;j++){
					a[j]++;
					cnt|=dfs2(1);
					if(cnt)break;
					a[j]--;
				}
				a[i]--;
			}
		}
		ans+=cnt;
		return;
	}
	for(int i=l[s];i<=r[s];i++){
		a[s]=i;
		dfs(s+1);
	}
	return;
}
int main(){
	cin>>t;
	while(t--){
		ans=0;
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			scanf("%d%d",&l[i],&r[i]);
		}
		dfs(1);
		printf("%d\n",ans);
	}
	return 0;
}
2023/6/27 17:16
加载中...