求时间复杂度
  • 板块灌水区
  • 楼主Mu_leaf
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/6/2 20:41
  • 上次更新2023/10/23 14:04:14
查看原帖
求时间复杂度
701254
Mu_leaf楼主2023/6/2 20:41

This problem。

这是代码。

#include <bits/stdc++.h>

using namespace std;
const int N=1e5+5;
struct node{
	int l,r,u,d,x,y;
}a[N];
int tot;
int ansk[N],sum[N],cnt,h[N];
int nn;
int L,R;
struct edge{
	int ans[20];
}ss[N];
bool cmp(edge i,edge j){
	int k=1;
	while(i.ans[k]==j.ans[k]){
		k++;
	}
	return i.ans[k]<j.ans[k];
}

void add(int x,int y){
	sum[y]++;
	a[cnt].x=x;
	a[cnt].y=y;
	//------------
	a[cnt].u=y;
	a[cnt].d=a[y].d;
	a[a[y].d].u=cnt;
	a[y].d=cnt;
	//-----------
	if(h[x]<0) h[x]=a[cnt].r=a[cnt].l=cnt;
	else{
		a[cnt].r=h[x];
		a[cnt].l=a[h[x]].l;
		a[a[h[x]].l].r=cnt;
		a[h[x]].l=cnt;
	}
	++cnt; 
}
void del(int c){
	a[a[c].l].r=a[c].r;
	a[a[c].r].l=a[c].l;
	for(int i=a[c].d;i!=c;i=a[i].d){
		for(int j=a[i].r;j!=i;j=a[j].r){
			a[a[j].u].d=a[j].d;
			a[a[j].d].u=a[j].u;
			sum[a[j].y]--;
			
		}
	}
}
void rev(int c){
	a[a[c].l].r=c;
	a[a[c].r].l=c;
	for(int i=a[c].u;i!=c;i=a[i].u){
		for(int j=a[i].l;j!=i;j=a[j].l){
			a[a[j].u].d=j;
			a[a[j].d].u=j;
			sum[a[j].y]++;
			
		}
	}
}
void init(int m){
	for(int i=0;i<=m;i++){
		a[i].r=i+1;
		a[i].l=i-1;
		a[i].u=a[i].d=i;
	}
	a[0].l=m;
	a[m].r=0;
	memset(h,-1,sizeof(h));
	int indx=0;
	cnt=m+1;
	for(int i=1;i<=nn;i++){
		for(int j=1;j<=nn;j++){
			indx++; 
			add(indx,i);
			add(indx,j+nn);
			add(indx,i-j+3*nn);
			add(indx,i+j+4*nn-2); 
		}
	}
}
void dance(int step){
	if(a[0].r>nn){
		tot++;
		int x,y;
		for(int i=0;i< step;i++){
			x=ansk[i]%nn;
			y=(ansk[i]-1)/nn+1;
			if(!x) x=nn;
			ss[tot].ans[x]=y;
		}
		for(int i=1;i<=nn;i++){
			cout << ss[1].ans[i] << " "; 
		}
		exit(0);
		return;
	}
	int cc=a[0].r;
	for(int i=a[0].r;i!=nn;i=a[i].r){
		if(sum[i]<sum[cc]) cc=i;
	}
	del(cc);
	for(int i=a[cc].d;i!=cc;i=a[i].d){
		ansk[step]=a[i].x;
		for(int j=a[i].r;j!=i;j=a[j].r) del(a[j].y);
		dance(step+1);
		ansk[step]=0;
		for(int j=a[i].l;j!=i;j=a[j].l) rev(a[j].y);
	}
	rev(cc);
	return;
}

int main(){
	scanf("%d",&nn);
	init(nn+nn+2*nn+2*nn-2);
	dance(0);
	cout << "No!";
	return 0;
}

为什么这个代码跑 n=150n=150 时,只需要 6ms6ms 但当开到 n=160n=160 时便 TLE 了呢?

2023/6/2 20:41
加载中...