[loj3180]天桥

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define oo 1e15
5 #define L (k<<1)
6 #define R (L+1)
7 #define mid (l+r>>1)
8 #define pii pair<int,int>
9 #define mp make_pair
10 #define fi first
11 #define se second
12 struct ji{
13 int nex,to,len;
14 }edge[N*80];
15 struct build{
16 int x,h;
17 }bu[N];
18 struct bridge{
19 int l,r,y;
20 bool operator < (const bridge &k)const{
21 return (y<k.y)||(y==k.y)&&(l<k.l);
22 }
23 }br[N*5];
24 priority_queue<pair<long long,int> >q;
25 map<pii,int>mat;
26 vector<pii>v;
27 int V,E,n,m,s,t,f[N<<2],head[N*20],vis[N*20];
28 long long ans,d[N*20];
29 bool cmp(pii x,pii y){
30 return (x.se<y.se)||(x.se==y.se)&&(x.fi<y.fi);
31 }
32 void build(int k,int l,int r){
33 if (l==r){
34 f[k]=bu[l].h;
35 return;
36 }
37 build(L,l,mid);
38 build(R,mid+1,r);
39 f[k]=max(f[L],f[R]);
40 }
41 int find1(int k,int l,int r,int x,int y,int z){
42 if ((l>y)||(x>r)||(f[k]<z))return 0;
43 if (l==r)return l;
44 int a=find1(R,mid+1,r,x,y,z);
45 if (a)return a;
46 return find1(L,l,mid,x,y,z);
47 }
48 int find2(int k,int l,int r,int x,int y,int z){
49 if ((l>y)||(x>r)||(f[k]<z))return 0;
50 if (l==r)return l;
51 int a=find2(L,l,mid,x,y,z);
52 if (a)return a;
53 return find2(R,mid+1,r,x,y,z);
54 }
55 void update(int k,int l,int r,int x,int y,int z){
56 if ((l>y)||(x>r))return;
57 if ((x<=l)&&(r<=y)){
58 f[k]=max(f[k],z);
59 return;
60 }
61 update(L,l,mid,x,y,z);
62 update(R,mid+1,r,x,y,z);
63 }
64 int query(int k,int l,int r,int x){
65 if (l==r)return f[k];
66 if (x<=mid)return max(f[k],query(L,l,mid,x));
67 return max(f[k],query(R,mid+1,r,x));
68 }
69 void add(int x,int y,int z){
70 edge[E].nex=head[x];
71 edge[E].to=y;
72 edge[E].len=z;
73 head[x]=E++;
74 }
75 void split(int k,int x){
76 if ((x)&&(br[k].l<x)&&(x<br[k].r)){
77 br[++m]=bridge{br[k].l,x,br[k].y};
78 br[k].l=x;
79 }
80 }
81 void split(){
82 build(1,1,n);
83 for(int i=1;i<=m;i++){
84 int a,b;
85 if (br[i].l<s){
86 split(i,find1(1,1,n,1,s,br[i].y));
87 split(i,find2(1,1,n,s,n,br[i].y));
88 }
89 if (t<br[i].r){
90 split(i,find1(1,1,n,1,t,br[i].y));
91 split(i,find2(1,1,n,t,n,br[i].y));
92 }
93 }
94 }
95 void build(){
96 memset(head,-1,sizeof(head));
97 sort(v.begin(),v.end());
98 for(int i=0;i<v.size();i++)
99 if ((!i)||(v[i-1]!=v[i]))mat[v[i]]=++V;
100 for(int i=0,j=0;i<v.size();i=++j)
101 for(;((j<v.size())&&(v[j].fi==v[j+1].fi));j++)
102 if (v[j].se!=v[j+1].se){
103 add(mat[v[j]],mat[v[j+1]],v[j+1].se-v[j].se);
104 add(mat[v[j+1]],mat[v[j]],v[j+1].se-v[j].se);
105 }
106 sort(v.begin(),v.end(),cmp);
107 for(int i=1,j=0;i<=m;i++){
108 while ((br[i].y!=v[j].se)||(br[i].l!=v[j].fi))j++;
109 for(;((br[i].y!=v[j].se)||(br[i].r!=v[j].fi));j++)
110 if (v[j].fi!=v[j+1].fi){
111 add(mat[v[j]],mat[v[j+1]],bu[v[j+1].fi].x-bu[v[j].fi].x);
112 add(mat[v[j+1]],mat[v[j]],bu[v[j+1].fi].x-bu[v[j].fi].x);
113 }
114 }
115 }
116 long long dij(int s,int t){
117 memset(vis,0,sizeof(vis));
118 for(int i=1;i<=V;i++)d[i]=oo;
119 d[s]=0;
120 q.push(mp(0,s));
121 while (!q.empty()){
122 int k=q.top().se;
123 q.pop();
124 if (vis[k])continue;
125 vis[k]=1;
126 for(int i=head[k];i!=-1;i=edge[i].nex)
127 if (d[edge[i].to]>d[k]+edge[i].len){
128 d[edge[i].to]=d[k]+edge[i].len;
129 q.push(mp(-d[edge[i].to],edge[i].to));
130 }
131 }
132 return d[t];
133 }
134 int main(){
135 scanf("%d%d",&n,&m);
136 for(int i=1;i<=n;i++)scanf("%d%d",&bu[i].x,&bu[i].h);
137 for(int i=1;i<=m;i++){
138 scanf("%d%d%d",&br[i].l,&br[i].r,&br[i].y);
139 br[i].l++,br[i].r++;
140 }
141 scanf("%d%d",&s,&t);
142 s++,t++;
143 if (s>t)swap(s,t);
144 v.push_back(mp(s,0));
145 v.push_back(mp(t,0));
146 split();
147 sort(br+1,br+m+1);
148 memset(f,0,sizeof(f));
149 for(int i=1,j=1;i<=m;i++){
150 if (br[j].y<br[i].y)
151 for(;j<i;j++)update(1,1,n,br[j].l,br[j].r,br[j].y);
152 v.push_back(mp(br[i].l,br[i].y));
153 v.push_back(mp(br[i].r,br[i].y));
154 v.push_back(mp(br[i].l,query(1,1,n,br[i].l)));
155 v.push_back(mp(br[i].r,query(1,1,n,br[i].r)));
156 }
157 build();
158 ans=dij(mat[mp(s,0)],mat[mp(t,0)]);
159 if (ans==oo)ans=-1;
160 printf("%lld",ans);
161 }
[loj3180]天桥的更多相关文章
- .NET平台和C#编程的总结
第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...
- 深入.NET平台和C#编程总结大全
对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧! ...
- 站在风口,你或许就是那年薪20w+的程序猿
最近面试了一些人,也在群上跟一些群友聊起,发现现在的互联网真是热,一些工作才两三年的期望的薪资都是十几K的起,这真是让我们这些早几年就成为程序猿的情何以堪!正所谓是站在风口上,猪也能飞起来!我在这里就 ...
- VR/AR 非技术总结
VR/AR 非技术总结 **欢迎转载~转载请注明Erma的博客 http://www.cnblogs.com/Erma-king/** 都说2016是VR/AR的元年,上半年我随着新技术的潮流进入了V ...
- PHP 二维数组根据某个字段排序
二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数 一. 手写arraysort PHP的一维数组排序函数: sort 对数组的值按 ...
- 一鼓作气 博客--第二篇 note2
1.循环正常结束是指没有中间截断,即没有执行break; for i in range(10) print(i) else: print("循环正常结束") 2.嵌套循环 for ...
- Python之路第一课Day2--随堂笔记
入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8")) p ...
- 【与软件无关】2013赤峰地区C1科目三考试攻略【绝对原创】
期待很久的科目三,终于在开考了.传说中的全部电子评判,让习惯给考官送礼的赤峰人民无所是从.据说前几天曾经有一个驾校,考了一整天,八十多个人一个没过的. 我这个攻略是今天通过考试后的一点心得,希望能有用 ...
- 这些年正Android - 身在他乡
“从不敢想到想去做到,做到我想的,事实证明我并不像他们想象的那样脆弱.我只是需要一盏灯,一架钢琴,一支麦克风.曾经想象过做一名医生救死扶伤,也曾想过做律师,做记者,做奥运冠军,但是都没有结果.因为我最 ...
随机推荐
- 为什么下一个十年的主战场在 Serverless?
作者 | 不瞋 阿里云 Serverless 负责人 "唯有超越,才能让我们走下去." 这是不瞋在阿里的第十年.从 2010 年加入阿里云,不瞋参与了阿里云飞天分布式系统的研发,历 ...
- 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
问题描述 把Web Role服务发布到Azure Cloud Service后,需要在IIS的输出日志中,把每一个请求的HTTP Request Header中的User-Agent内容也输出到日志中 ...
- mybatis-plus最新版代码生成器(Swagger3)
写项目想用mybatis-plus+swagger3,百度最新版代码生成器都是旧版的,且官网的配置过于简洁,所以手敲一份,在官网的基础上加了一堆配置,lombok,restful,mvc三层结构目录等 ...
- 单体应用 适合采用 dapr 构建吗?
缘起今天在微信群里有同学问 "纯.net 项目,有必要上dapr吗?" 当时不假思索的说不是微服务没必要,其他群友也说没必要.下午细想了一下,觉得这个和微服务没有关系,如果我的应用 ...
- SpringBoot之日志注解和缓存优化
SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...
- SpringBoot-语言国际化
在resouce下新建i18ni18n 类似的还有k8s在i18n下新建signIn.properties再新建 signIn_zh_CN.properties此时,iden会帮助合并: 现在可以在这 ...
- java链接并操作数据库
链接准备 MySQL数据库驱动(连接器).mysql-connector-java-x.x.xx.jar会在MySQL安装时提供,若Mysql是默认安装路径,则连接器在:C:\Program File ...
- 树莓派4B学习札记
防静电 树莓派比较容易被静电损坏,要做好以下预防措施 使用的时候不要用手去触摸PCB和针脚!特别是上电之后! 拿板卡的时候,要习惯性拿板卡的边缘 勤洗手,勤摸墙壁,释放身上的静电 系统安装 8GB以上 ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- BUAA 2020 软件工程 提问回顾与个人总结
BUAA 2020 软件工程 提问回顾与个人总结 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾 ...