求大佬帮忙优化
  • 板块学术版
  • 楼主bh1234666
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/13 16:29
  • 上次更新2023/11/4 10:47:55
查看原帖
求大佬帮忙优化
48978
bh1234666楼主2021/8/13 16:29
#include<stdio.h>
#include<string.h>
//#pragma GCC optimize(2)
struct Heap{int v,l,r;}T[2000005];
int cnt;
unsigned int ans[1000005];
inline int New(int x){T[++cnt].v=x;return cnt;}
inline int Merge(int a,int b)
{
	if(!a) return b;if(!b) return a;
	if(ans[T[a].v]>ans[T[b].v]) 
	{
		T[a].r=T[b].l,T[b].l=a;
		return b;		
	}
	else
	{
		T[b].r=T[a].l,T[a].l=b;
		return a;
	}
}
int sta[100005];
inline int Merges(int a)
{
	register int fl(0);
	register int *l=sta,*l1=sta,*l2=sta+1,*l3=sta+2,*l4=sta+3,*l5=sta+4,*l6=sta+5,*l7=sta+6,*l8=sta+7;
	*l=a;
	while(*l)
	{
		*(l+1)=T[*l].r;++l;
		*(l+1)=T[*l].r;++l;
	}
	while(l8<l)
	{
		T[*l1].r=0;T[*l2].r=0;T[*l3].r=0;T[*l4].r=0;
		T[*l5].r=0;T[*l6].r=0;T[*l7].r=0;T[*l8].r=0;
		l1+=8;l2+=8;l3+=8;l4+=8;
		l5+=8;l6+=8;l7+=8;l8+=8;
	}
	while(*l1) 
	{
		T[*l1].r=0;
		++l1;
	}
	if(l==sta) return fl;
	while(l--!=sta)
	{
		fl=Merge(Merge(*l,*(l-1)),fl);
		--l;
	}
	return fl;
}
inline void Push(int& a,int x){a=Merge(a,New(x));}
inline int Top(int a){return T[a].v;}
inline void Pop(int& a){a=Merges(T[a].l);}
const int LEN=1<<21;
char BUF[LEN],*Pin,*Pin_last,PUF[LEN],*Pout=PUF,*Pout_last=PUF+LEN-1;
inline char Getchar(){return Pin==Pin_last&&(Pin_last=(Pin=BUF)+fread(BUF,1,LEN,stdin),Pin==Pin_last)?EOF:*Pin++;}
inline int read(){register int res=0,ch=' ';while(ch<=32&&ch!=EOF)ch=Getchar();while(ch>32)res=(res<<3)+(res<<1)+ch-48,ch=Getchar();return res;}
void sort_uint(unsigned int *f,unsigned int *l)
{
	unsigned int use[l-f];
	register unsigned int *t1=l,*t2,cnt1[256],cnt2[256],cnt3[256],cnt4[256];
	memset(cnt1,0,1024),memset(cnt2,0,1024),memset(cnt3,0,1024),memset(cnt4,0,1024);
	while(t1!=f) cnt1[(*--t1)&255]++,cnt2[((*t1)>>8)&255]++,cnt3[((*t1)>>16)&255]++,cnt4[(*t1)>>24]++;
	for(t1=cnt1+1,t2=cnt2+1;t1!=cnt1+256||t2!=cnt2+256;++t1,++t2) *t1+=*(t1-1),*t2+=*(t2-1);
	for(t1=cnt3+1,t2=cnt4+1;t1!=cnt3+256||t2!=cnt4+256;++t1,++t2) *t1+=*(t1-1),*t2+=*(t2-1);
	for(t1=l-1,t2=use;t1!=f-1;--t1) *(t2+--cnt1[(*t1)&255])=*t1;for(t2=use+(int)(l-f-1),t1++;t2!=use-1;--t2) *(t1+(--cnt2[((*t2)>>8)&255]))=*t2;
	for(t1=l-1,t2++;t1!=f-1;--t1) *(t2+--cnt3[((*t1)>>16)&255])=*t1;for(t2=use+(int)(l-f-1),t1++;t2!=use-1;--t2) *(t1+(--cnt4[(*t2)>>24]))=*t2;
}
struct node{
	int x,w;
	node* next;
}use[4000005];
node *ul1=use,*ul2=use+1,*ul3=use+2,*ul4=use+3,*ul5=use+4,*ul6=use+5,*ul7=use+6,*ul8=use+7;
node* mp[1000005];
bool flag[1000005];
inline void add(const int u,const int v,const int w,node* use)
{
	node* a=use;
	a->x=v;
	a->w=w;
	a->next=mp[u];
	mp[u]=a;
}
int main()
{
	freopen("ZY4.in","r",stdin);
	freopen("ZY4.out","w",stdout);
	register int i;
	register int n=read(),m=read(),t=read(),u1,u2,u3,u4,v1,v2,v3,v4,w1,w2,w3,w4,num,h(0);
	node* a;
	while(m>=4)
	{
		u1=read(),v1=read(),w1=read();
		u2=read(),v2=read(),w2=read();
		u3=read(),v3=read(),w3=read();
		u4=read(),v4=read(),w4=read();
		add(u1,v1,w1,ul1);add(v1,u1,w1,ul2);
		add(u2,v2,w2,ul3);add(v2,u2,w2,ul4);
		add(u3,v3,w3,ul5);add(v3,u3,w3,ul6);
		add(u4,v4,w4,ul7);add(v4,u4,w4,ul8);
		ul1+=8;ul2+=8;
		ul3+=8;ul4+=8;
		ul5+=8;ul6+=8;
		ul7+=8;ul8+=8;
		m-=4;
	}
	while(m--)
	{
		u1=read(),v1=read(),w1=read();
		add(u1,v1,w1,++ul8);
		add(v1,u1,w1,++ul8);
	}
	for(i=1;i<=n;i++)
		ans[i]=1000000001;
	ans[1]=0;
	Push(h,1);
	flag[1]=1;
	while(h)
	{
		num=Top(h),Pop(h);
		a=mp[num];
		while(a)
		{
			if(ans[num]+a->w<ans[a->x])
			{
				ans[a->x]=ans[num]+a->w;
				if(!flag[a->x])
				{
					Push(h,a->x);
					flag[a->x]=1;
				}
			}
			a=a->next;
		}
		flag[num]=0;
	}
	sort_uint(ans+1,ans+n+1);
	for(i=2;i<=n;i++)
	{
		if(t>=(ans[i]<<1)) t-=(ans[i]<<1);
		else break;		
	}
	printf("%d",i-1);
	return 0;
}

某道自己出的模拟赛题目的代码

在洛谷上开O2比不开O2快了将近一倍

但是模拟赛不开O2并且这个代码跑最大数据要跑1.15s(时限1s)

众所周知卡常卡死的代码O2是优化不了多少的

这个代码有更优的等价的代码

但是由于某些原因希望把它在不改变算法的情况下卡进1s

求大佬看看是哪里慢了

2021/8/13 16:29
加载中...