关于ST表
  • 板块学术版
  • 楼主xiongjunxiang
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/2/9 08:16
  • 上次更新2023/10/28 09:21:10
查看原帖
关于ST表
409437
xiongjunxiang楼主2022/2/9 08:16

只交换ST表i,j的位置和时间有关系?

TLE的代码:

#include<bits/stdc++.h>
#define add(x,y) eu[++l]=el[x],ev[l]=y,el[x]=l
using namespace std;
const int N=2000005;
struct edge{
	int u,v,w;
}e[N];
int a[N],fa[N],f[20][N],d[N],t[N],s[N],el[N],eu[N],ev[N];
int n,m,x,y,z,c,ct,q,ki,la,ans,l;
#define gc ZZ==zz&&(zz=(ZZ=buf)+fread(buf,1,2000005,stdin),ZZ==zz)?EOF:*ZZ++
static char buf[2000005],*ZZ=buf,*zz=buf;
inline int read()
{
	int x(0);char ch(gc);
	while(ch<'0'||ch>'9')ch=gc;
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=gc;
	return x;
}
bool cmp(edge x,edge y){return x.w>y.w;}
bool cmp1(int x,int y){return s[x]<s[y];}
int find(int x){return fa[x]?fa[x]=find(fa[x]):x;}
void dfs(int u,int dep){
	for(int i=1;i<=19;++i)f[i][u]=f[i-1][f[i-1][u]];
	d[u]=dep,s[u]=++ct;
	for(int i=el[u];i;i=eu[i])
		if(!d[ev[i]])
			f[0][ev[i]]=u,dfs(ev[i],dep+1);
}
int lca(int u,int v){
	if(d[u]>d[v])swap(u,v);
	int tmp=d[v]-d[u];
	for(int i=19;i>=0;--i)
		if(tmp>=(1<<i))v=f[i][v],tmp-=(1<<i);
	if(u==v)return t[u];
	for(int i=19;i>=0;--i)
		if(f[i][u]!=f[i][v])
			u=f[i][u],v=f[i][v];
	return t[f[0][v]];
}
signed main()
{
	n=read(),m=read(),q=read();c=n;
	for(int i=1;i<=m;++i){
		x=read(),y=read(),z=read();
		e[i].v=x,e[i].u=y,e[i].w=z;
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;++i){
		int f1=find(e[i].u),f2=find(e[i].v);
		if(f1!=f2){
			t[++c]=e[i].w,fa[f1]=fa[f2]=c;
			add(c,f1),add(c,f2);
		}	
	}
	for(dfs(c,1);q--;){
		ki=read();
		for(int i=1;i<=ki;++i)
			a[i]=read(),a[i]^=la;
		sort(a+1,a+ki+1,cmp1);
		ans=0;
		for(int i=1;i<ki;++i){
			ans=max(ans,lca(a[i],a[i+1]));
		}
		la=ans;
		printf("%d\n",ans);
	}
}

AC代码:

//一样

int f[N][20];\colorbox{yellow}{f[N][20];}

//一样
void dfs(int u,int dep){

for(int i=1;i<=19;++i)f[u][i]=f[f[u][i-1]][i-1];\colorbox{yellow}{for(int i=1;i<=19;++i)f[u][i]=f[f[u][i-1]][i-1];}

	//一样
	for(int i=el[u];i;i=eu[i])
		if(!d[ev[i]])
			f[ev[i]][0]=u,dfs(ev[i],dep+1);
}
int lca(int u,int v){
	//一样
	for(int i=19;i>=0;--i)
		if(tmp>=(1<<i))v=f[v][i],tmp-=(1<<i);
	//一样
	for(int i=19;i>=0;--i)

if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];\colorbox{yellow}{if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];}

return t[f[v][0]];
}
signed main()
{
	//一样
}
2022/2/9 08:16
加载中...