bzoj 3073 Journeys —— 线段树优化连边
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073
建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边;
区间向区间连边时,可以新建一个节点,log2n 条边就能变成 2logn 条边;
注意区间向区间连边也要连反边,别忘了连反边时 ++cnt !
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #define mid ((l+r)>>1)
- using namespace std;
- int const xxn=5e5+,xn=4e6+,xm=3e7+;
- int n,m,hd[xn],ct,to[xm],nxt[xm],w[xm],dis[xn];
- int rt[],cnt,ls[xxn<<],rs[xxn<<],st[xxn],ed[xxn];
- bool vis[xn];
- struct N{
- int d,id;
- bool operator < (const N &y) const
- {return d==y.d?id<y.id:d>y.d;}
- };
- priority_queue<N>q;
- int rd()
- {
- int ret=,f=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
- while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
- return f?ret:-ret;
- }
- int gt[];
- void wr(int x)
- {
- if(!x){puts(""); return;}
- if(x<)putchar('-'),x=-x;
- int t=;
- while(x)gt[++t]=x%,x/=;
- for(int i=t;i;i--)putchar(gt[i]+'');
- puts("");
- }
- void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
- void build(int x,int l,int r,bool tp)
- {
- if(l==r)
- {
- if(!tp)st[l]=x; else ed[l]=x;
- return;
- }
- ls[x]=++cnt; rs[x]=++cnt;
- build(ls[x],l,mid,tp); build(rs[x],mid+,r,tp);
- if(!tp)add(ls[x],x,),add(rs[x],x,);
- else add(x,ls[x],),add(x,rs[x],);
- }
- void link(int x,int l,int r,int L,int R,int c,bool tp)
- {
- if(l>=L&&r<=R)
- {
- if(!tp)add(x,c,); else add(c,x,);
- return;
- }
- if(mid>=L)link(ls[x],l,mid,L,R,c,tp);
- if(mid<R)link(rs[x],mid+,r,L,R,c,tp);
- }
- void dij(int s)
- {
- memset(dis,0x3f,sizeof dis);
- dis[s]=; q.push((N){,s});
- while(q.size())
- {
- int x=q.top().id; q.pop();
- if(vis[x])continue; vis[x]=;
- for(int i=hd[x],u;i;i=nxt[i])
- if(dis[u=to[i]]>dis[x]+w[i])
- dis[u]=dis[x]+w[i],q.push((N){dis[u],u});
- }
- }
- int main()
- {
- n=rd(); m=rd(); int p=rd();
- rt[]=++cnt; build(rt[],,n,);
- rt[]=++cnt; build(rt[],,n,);
- for(int i=;i<=n;i++)add(ed[i],st[i],);
- for(int i=,a,b,c,d;i<=m;i++)
- {
- a=rd(); b=rd(); c=rd(); d=rd(); int t=++cnt;
- link(rt[],,n,a,b,t,); link(rt[],,n,c,d,t,);
- t=++cnt;//!!!
- link(rt[],,n,c,d,t,); link(rt[],,n,a,b,t,);
- }
- dij(ed[p]);
- for(int i=;i<=n;i++)wr(dis[ed[i]]);
- return ;
- }
bzoj 3073 Journeys —— 线段树优化连边的更多相关文章
- 【题解】Journeys(线段树优化连边)
[#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...
- 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...
- bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路
3073: [Pa2011]Journeys Time Limit: 20 Sec Memory Limit: 512 MB Description Seter建造了一个很大的星球,他准备建 ...
- bzoj 3073 [Pa2011]Journeys ——线段树优化连边
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵孩子向父亲连边,是走出去的:一棵父亲向孩子连边,是走进来的. 注意第 ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
[BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...
- bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...
- BZOJ 3790 神奇项链(回文自动机+线段树优化DP)
我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...
随机推荐
- [Bzoj3675][Apio2014]序列分割(斜率优化)
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4021 Solved: 1569[Submit][Stat ...
- springBoot 跨域处理
首先喝水不忘挖井人,博客参考:https://www.cnblogs.com/nananana/p/8492185.html 方式一:新增一个configration类 或 在Application中 ...
- http://www.cnblogs.com/shihaiming/
原文:http://www.bubuko.com/infodetail-917303.html 右击项目,点击Run as,如下图: 即可看到有很多现有的maven命令,点击即可运行,并在控制台可以看 ...
- Android Studio 1.3RC版 build加速
Android Studio 确实是好用.但build的速度却是奇慢无比!.! ! 我上网找了非常多build加速的设置,却不能适配到我的1.3RC版... . .心塞.无耐,忍着超级无敌慢的速度硬是 ...
- 全卷积网络FCN详解
http://www.cnblogs.com/gujianhan/p/6030639.html CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体? (图像语义分割) FCN(Fully ...
- linux shell操作
---------------------------------------------------- 原文:http://unix.stackexchange.com/questions/2863 ...
- Windows-速度优化的几个方面
One. Win+R - > cmd- > msconfig 禁用不需要的启动项! Two. 关闭一些视觉选项 Three. 设置应用启动快捷键
- Qt:解析命令行
Qt从5.2版開始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行參数. 一.命令行写法 命令行:"-abc" 在QComm ...
- Javascript中没有引用传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- 20170218-取值Domain
1.通过视图DD07V, 例子:取SD 凭证类别的DOMAIN(VBTYP)DATA: LT_DD07V TYPE TABLE OF DD07V.SELECT * INTO T_DD07V FROM ...