求卡常
查看原帖
求卡常
1078013
qsn123楼主2025/1/8 20:06

RT,#22 1.04s 98pts TLE

做法确实不是最优的,没有预处理,但是第一次交只TLE了五个点,且所有点都没到1.20s。都到这个时间了我真不想重写了,然后就卡了一个下午的常数并宣告失败。

#include<bits/stdc++.h>
using namespace std;
const int N=28,inf=1e9+7;
int a[N][N],ans=0,sum=inf,n;
void dfs(int x,int s,int cnt,int num1,int num2){
	if(cnt>=sum)return ;
	if(x==n+1){
		sum=cnt;
		ans=s;
		return ;
	}
	int cnt1=0,cnt2=0;
	for(int i=0;i<(x-1);i++){
		if((s&(1<<i)))cnt1+=a[x][i+1];
		else cnt2+=a[x][i+1];
	}
	if(num1<n/2)dfs(x+1,s,cnt+cnt1,num1+1,num2);
	if(num2<n/2)dfs(x+1,s+(1<<(x-1)),cnt+cnt2,num1,num2+1);
	return ;
}//这里不能开inline,我试了,会跑的巨慢
inline int read()
{
    int k=0,f=1;
    char c=getchar_unlocked();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar_unlocked();
    }
    while(c>='0'&&c<='9')k=(k<<3)+(k<<1)+(c-'0'),c=getchar_unlocked();
    return k*f;
}
int main()
{
	int m,x,y;
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		x=read(),y=read();
		a[x][y]=a[y][x]=1;
	}
	dfs(1,0,0,0,0);
        //我尝试过减少传参,但是直接计算会变慢。__builtin_popcount()并没有使我的代码变快。
	for(int i=0;i<n;i++){
		if(ans&(1<<i))printf("%d ",i+1);
	}
	return 0;
} 
2025/1/8 20:06
加载中...