求优化空间
查看原帖
求优化空间
398152
MinimumSpanningTree最小生成树楼主2024/8/23 20:10

MLE on #2 #10,求优化空间。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2e6+100,LG=25;
int n,m,a,s[N],sk,st[N][LG],lg[N],deep[N],root;
struct node
{
	int val,cl,cr;
}c[N];
int quick_read()
{
	int num=0,fh=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') fh=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		num=num*10+(ch-'0');
		ch=getchar();
	}
	return num*fh;
}
void dfs(int x,int f)
{
	st[x][0]=f,deep[x]=deep[f]+1;
	if(c[x].cl) dfs(c[x].cl,x);
	if(c[x].cr) dfs(c[x].cr,x);
}
int lca(int x,int y)
{
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=lg[n];i>=0;i--)
	{
		if(deep[st[x][i]]>=deep[y]) x=st[x][i];
		if(x==y) return x;
	}
	for(int i=lg[n];i>=0;i--)
	{
		if(st[x][i]!=st[y][i]) x=st[x][i],y=st[y][i];
	}
	return st[x][0];
}
int main()
{
	n=quick_read(),m=quick_read();
	for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++)
	{
		a=quick_read();
		c[i].val=a;
		while(sk&&c[s[sk]].val>a) sk--;
		c[i].cl=s[sk+1];
		if(sk) c[s[sk]].cr=i;
		else root=i;
		s[++sk]=i,s[sk+1]=0;
	}
	dfs(root,0);
	for(int i=1;i<=lg[n];i++)
	{
		for(int j=1;j<=n;j++) st[j][i]=st[st[j][i-1]][i-1];
	}
	printf("0\n");
	for(int i=2;i<=n;i++) 
	{
		//printf("%d %d %d\n",i-m+1,i,lca(i-m+1,i));
		printf("%d\n",c[lca(max(1,i-m),i-1)].val);
	}
	return 0;
}
2024/8/23 20:10
加载中...