TLE50pts求dalao帮忙卡常
查看原帖
TLE50pts求dalao帮忙卡常
1121412
Cute_Fish楼主2024/9/30 12:34

RT。

Loj上有差5ms卡进的。

#include<bits/stdc++.h>
using namespace std;
constexpr int mod=1e8+7;
bool g[20][22][(1<<19)];
int n,res=0,f[(1<<19)][20],x[20],y[20],t,Low;
bool check(const int &i,const int &j){
    if((x[t] - x[i]) * (y[j] - y[i]) ==(x[j] - x[i]) * (y[t] - y[i])  
       && min(x[i] , x[j])<=x[t] && x[t] <= max(x[i] , x[j])    
       && min(y[i] , y[j])<=y[t] && y[t] <= max(y[i] , y[j]))
        return 0;
    return 1;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;j+=5){
			g[i][j][0]=1;
			g[i][j+1][0]=1;
			g[i][j+2][0]=1;
			g[i][j+3][0]=1;
			g[i][j+4][0]=1;
			g[i][j+5][0]=1;
		}
	}
	for(int s=1;s<(1<<n);s++){
		Low=s&(-s);
		t=__lg(Low)+1;
		for(int i=1;i<=n;++i){
			if(!(s&(1<<i-1))){
				for(int j=1;j<=n;++j)
					if(!(s&(1<<j-1))&&i!=j)g[i][j][s]=(g[i][j][s^Low]&&check(i,j));
			}
		}
	}
	for(int i=1;i<=n;i++)f[(1<<i-1)][i]=1;
	for(int s=1;s<(1<<n);++s){
	    for(int i=1;i<=n;++i){
			if(!f[s][i])continue;
			if((s&(1<<i-1))){
				for(int j=1;j<=n;++j)
				    if(!(s&(1<<j-1))){
				    	int ns=(s|(1<<j-1));
				    	if(g[i][j][((1<<n)-1)^s^(1<<j-1)])
						f[ns][j]+=f[s][i],f[ns][j]=(f[ns][j]%mod+mod)%mod;
				    }
			}
		}
	}
	for(int s=15;s<(1<<n);++s){
		if(__builtin_popcount(s)<(1<<2))continue;
		for(int i=1;i<=n;++i)
			if(s&(1<<i-1))res+=f[s][i],res%=mod;
	}
	printf("%d\n",res);
}

2024/9/30 12:34
加载中...