[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 - 身在他乡
“从不敢想到想去做到,做到我想的,事实证明我并不像他们想象的那样脆弱.我只是需要一盏灯,一架钢琴,一支麦克风.曾经想象过做一名医生救死扶伤,也曾想过做律师,做记者,做奥运冠军,但是都没有结果.因为我最 ...
随机推荐
- 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...
- js 判断一个变量是否有值
最近遇到一个面试题,判断一个变量是否有值,当时有点蒙,其实很简单,就是判断 变量是否为 undefined或者null function isFlag(val) { if(Object.prototy ...
- Netty 了解
1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid develop ...
- [kuangbin带你飞]专题一 简单搜索 棋盘问题
题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...
- 返回值优化 RVO
<深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化
- 如何快速体验鸿蒙全新声明式UI框架ArkUI?
HDC2021将于10月22日在东莞松山湖正式开幕,大会将设立Codelab体验专区,超多好玩.有趣的Demo等你体验.想快速入门HarmonyOS?学习HarmonyOS新特性?以下几个Codela ...
- 【UE4 C++ 基础知识】<15> 智能指针 TSharedPtr、UniquePtr、TWeakPtr、TSharedRef
基本概念 UE4 对 UObject 对象提供垃圾回收 UE4 对原生对象不提供垃圾回收,需要手动进行清理 方式 malloc / free new / delete new与malloc的区别在于, ...
- 新型活跃Mozi样本分析报告
基本信息 对象 值 文件名 Photo.scr 文件类型 PE32 executable for MS Windows (GUI) Intel 80386 32-bit 文件大小 6271259 by ...
- 占位符,SQL注入?
这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关.他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占 ...
- Go 语言实现 gRPC 的发布订阅模式,REST 接口和超时控制
原文链接: 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她 上篇文章 gRPC,爆赞 直接爆了,内容主要包括:简单的 gRPC 服务,流处理模式,验证器,Token 认证和证书认证. 在多 ...