BZOJ3073 : [Pa2011]Journeys
2015-06-23 14:19
316 查看
用线段树套链表维护所有边,用set维护未访问过的点
然后BFS,每次在线段树上找边,然后在set中查询点
一条边使用之后就没有用了,所以在链表中将它删去
时间复杂度$O((n+m)\log n+m\log^2n)$。
然后BFS,每次在线段树上找边,然后在set中查询点
一条边使用之后就没有用了,所以在链表中将它删去
时间复杂度$O((n+m)\log n+m\log^2n)$。
#include<cstdio> #include<set> #include<algorithm> #define N 500010 using namespace std; int n,m,S,i,c,d,x2,y2,x,z,q ,h,t,f ,cnt,pos ; struct Edge{int l,r;Edge*nxt;}*g[1048577],pool[9000000],*cur=pool,*p; set<int>T;set<int>::iterator y,tmp ; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} void build(int x,int a,int b){ if(a==b){pos[a]=x;return;} int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); } void ins(int x,int a,int b){ if(c<=a&&b<=d){ p=cur++,p->l=x2,p->r=y2,p->nxt=g[x],g[x]=p; return; } int mid=(a+b)>>1; if(c<=mid)ins(x<<1,a,mid); if(d>mid)ins(x<<1|1,mid+1,b); } int main(){ read(n),read(m),read(S); while(m--){ read(c),read(d),read(x2),read(y2),ins(1,1,n); swap(c,x2),swap(d,y2),ins(1,1,n); } build(1,1,n),q[h=t=1]=S; for(i=1;i<=n+1;i++)if(i!=S)T.insert(i); while(h<=t)for(z=f[x=q[h++]]+1,x=pos[x];x;g[x]=NULL,x>>=1)for(p=g[x];p;p=p->nxt){ for(cnt=0,y=T.lower_bound(p->l);*y<=p->r;y++)f[q[++t]=*y]=z,tmp[++cnt]=y; while(cnt)T.erase(tmp[cnt--]); } for(i=1;i<=n;i++)printf("%d\n",f[i]); return 0; }
相关文章推荐
- 公云怎么用?
- 一张表看清中国软件公司2014年谁家营收最多?
- 使用 Redis 实现分布式系统轻量级协调技术
- sendRedirect和forward原理及区别总结
- Matlab图像处理小结
- 幸福列车(多个优先队列)
- JSP验证码的实现
- linux下ctrl 常用组合键
- android 在onCreate方法中获得view的宽高
- u-boot.lds分析
- java.lang.UnsatisfiedLinkError: org.jblas.NativeBlas.dposv(CII[DII[DII)I
- IntelliJ IDEA 使用经验
- nginx图片上传失败
- SDWebImage基础应用
- 删除storyboard后需要进行设置
- sql server 判断是否存在数据库,表,列,视图
- SAT阅读词汇总结:语气限定词
- 透过IT大佬的高考专业选择,你的兄弟姐妹可以取得哪些“真经”?
- 【ASP.NET】验证控件
- 设计模式学习之简单工厂+反射+配置文件