#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
求大佬看看是哪里慢了