求助
查看原帖
求助
414210
Iam1789楼主2021/8/3 14:13

求助这个代码复杂度是否正确,应在何处优化

#include <bits/stdc++.h>
using namespace std;
namespace INPUT_SPACE{
	const int BS=(1<<24)+5;char Buffer[BS],*HD,*TL;inline int gc() { if(HD==TL) TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);return (HD==TL)?EOF:*HD++; }
	inline int inn() { int x,ch;while((ch=gc())<'0'||ch>'9');x=ch^'0';while((ch=gc())>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^'0');return x; }
}using INPUT_SPACE::inn;
int t;
int n,m;
int js=0;
struct nodee{
	int fromm,too,nextt,l,aa;
}a[800007];
int headd[800007];
long long dis[800007];
bool vis[800007];
int v,p;
int q,k,s;
long long ans;
int fa[800007];
int root[800007];
int toproot[800007];
int broot[800007][31];
int maxn[800007];
int dep[800007];
int l[800007],r[800007];
int poee[27];
int zz;
inline int read()
{
	int f=0;
	char c=getchar();
	while(c<'0'||c>'9')
	c=getchar();
	while(c>='0'&&c<='9')
	{
		f=f*10+c-'0';
		c=getchar();
	}
	return f;
}
void dfs(int x,int h)
{
	if(x==0)
	return; 
	dep[x]=h;
/*	if(x==2)
	cout<<root[x]<<endl;*/
	broot[x][0]=root[x];
	int jl=broot[x][0];
	for(register int i=1;i<=18;++i)
	{
		if(!broot[jl][i-1])
		break;
		broot[x][i]=broot[jl][i-1];
		jl=broot[jl][i-1];
	}
	dfs(l[x],h+1);
	dfs(r[x],h+1);
}
inline void add(int fromm,int too,int l,int aa)
{
	++js;
	a[js].fromm=fromm;
	a[js].too=too;
	a[js].l=l;
	a[js].aa=aa;
	a[js].nextt=headd[fromm];
	headd[fromm]=js;
}
inline void dij()
{
	for(register int i=1;i<=n;++i)
	{
		dis[i]=1e18;
		vis[i]=0;
	}
	priority_queue <pair<int,int> >q;
	dis[1]=0;
	q.push(make_pair(-dis[1],1));
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u])
		continue;
		vis[u]=1;
		for(register int i=headd[u];i;i=a[i].nextt)
		{
			if(dis[a[i].too]>dis[u]+a[i].l)
			{
				dis[a[i].too]=dis[u]+a[i].l;
				q.push(make_pair(-dis[a[i].too],a[i].too));
			}
		}
	}
/*	for(register int i=1;i<=n;++i)
	cout<<dis[i]<<" ";*/
}
inline int find(int x)
{
	if(fa[x]==x)
	return x;
	return fa[x]=find(fa[x]);
}

inline int find2(int x)
{
	if(toproot[x])
	{
		toproot[x]=find2(toproot[x]);
		return toproot[x];
	}
	return x;
}/*
inline int find2(int x,int js)
{
	cout<<x<<" "<<js<<endl; 
	if(toproot[x])
	{
		toproot[x]=find2(toproot[x],js+1);
		return toproot[x];
	}
	return x;
}*/
inline void make_root(int u,int v,int hi)//**暴力找根 
{
	u=find2(u);
	v=find2(v);
//	cout<<u<<" "<<v<<endl;
	++zz;
	root[u]=root[v]=zz;
	l[zz]=u;
	r[zz]=v;
	toproot[u]=toproot[v]=zz;
	maxn[zz]=hi;
	dis[zz]=min(dis[u],dis[v]);
}
inline void kru()
{
	zz=n;
	priority_queue<pair<int,int> >q;
	for(register int i=2;i<=2*m;i+=2)
	q.push(make_pair(a[i].aa,i));
	int jss=2;
	while(jss<2*n)
	{
		int s=q.top().second;
		q.pop();
		int u=a[s].fromm;
		int v=a[s].too;
		int fu=find(u);
		int fv=find(v);
		if(fu==fv)
		continue;
		fa[fu]=fv;
	//	cout<<u<<" "<<v<<" "<<s<<endl; 
		make_root(u,v,a[s].aa);
		jss+=2;
	}
}
/*inline void kru()
{
	zz=n;
	priority_queue<pair<int,int> >q;
	for(register int i=2;i<=2*m;i+=2)
	q.push(make_pair(a[i].aa,i));
	int jss=2;
	int c=1;
	while(c<200000)
	{
	//	cout<<c++<<endl;
		c++;
		int s=q.top().second;
		q.pop();
		int u=a[s].fromm;
		int v=a[s].too;
		int fu=find(u);
		int fv=find(v);
		//if(fu==fv)
		//continue;
	//	fa[fu]=fv;
	//	cout<<u<<" "<<v<<" "<<s<<endl; 
	//	make_root(u,v,a[s].aa);
		jss+=2;
	}
	cout<<c;
}*/
/*inline long long find3(int v,int p)
{
	maxn[v]=INT_MAX;
	while(maxn[root[v]]>p)
	v=root[v];
	return dis[v];
}*/
inline long long find3(int v,int p)
{
	maxn[v]=INT_MAX;
	if(maxn[root[v]]<=p)
	return dis[v];
	while(v!=0)
	{
	//	cout<<v<<" ";
		int c=1;//c==0 
		while(maxn[broot[v][c]]>p)
		++c;
		--c;
		c=max(0,c);
		v=broot[v][c];
		if(maxn[v]>p&&maxn[root[v]]<=p)
		break;
	}
	return dis[v];
}
int main()
{
//	freopen("return5.in","r",stdin);
//	freopen("return5.out3","w",stdout);
	poee[0]=1;
	for(register int i=1;i<=18;++i)
	poee[i]=poee[i-1]*2; 
	t=inn();
	for(int ii=1;ii<=t;++ii)
	{
		for(register int i=1;i<=js;++i)
		{
			a[i].nextt=a[i].fromm=a[i].too=0;
		}
		for(register int i=1;i<=n;++i)
		headd[i]=0;
		n=inn();
		m=inn();
		js=0;
		int fromm,too,l,aa;
		for(register int i=1;i<=m;++i)
		{
		//	scanf("%d%d%d%d",&fromm,&too,&l,&aa);
			fromm=inn();
			too=inn();
			l=inn();
			aa=inn();
			add(fromm,too,l,aa);
			add(too,fromm,l,aa);
		}
		/*for(register int i=1;i<=m;++i)
		{
		//	scanf("%d%d%d%d",&fromm,&too,&l,&aa);
			fromm=i;
			too=;
			l=1;
			aa=1;
			add(fromm,too,l,aa);
			add(too,fromm,l,aa);
		}*/
		dij();
		
		for(register int i=1;i<=n;++i)
		maxn[i]=fa[i]=i;
		for(register int i=1;i<=2*n;++i)
		{
			toproot[i]=root[i]=0;
			for(register int j=0;j<=18;++j)
			broot[i][j]=0;
		}
		kru();
		dfs(zz,1);
		ans=0;
	//	scanf("%d%d%d",&q,&k,&s);
		q=inn();
		k=inn();
		s=inn();
		for(register int i=1;i<=q;++i)
		{
		//	scanf("%d%d",&v,&p);
			v=inn();
			p=inn();
			v=(v+k*ans-1)%n+1;
			p=(p+k*ans)%(s+1);
			ans=find3(v,p);
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2021/8/3 14:13
加载中...