牛客网NOIP赛前集训营-提高组(第八场)-B-推箱子[最短路优化建图]
题意
有 \(n\) 个箱子,指定一个箱子开始向右推,如果碰到了别的箱子会令其移动,问 \(k\) 秒之后每个箱子所在的位置。
\(n\leq 10^5\).
分析
转化成最短路模型,如果两个箱子 \(a,b\) 在 \(y\) 轴方向上投影有交,连边 \(a \rightarrow b\),边长为 \(x_{1b}-x_{2a}\).
考虑优化建图,发现如果三个箱子 \(a,b,c\) 投影两两有交,\(a\) 和 \(c\) 之间不用连边。
所以如果两个箱子 \(a,b\) 之间需要连边,当且仅当在从 \(a\) 到 \(b\) 的过程中不存在一个 \(x\) 满足 \(x\) 和 \(a,b\) 的投影都有交。
考虑扫描线按 \(y\) 排序,因为此时加入的所有箱子的投影都是两两有交的,在加入一个箱子的时候和他左右相邻的两个箱子连边即可。容易证明如果两个箱子满足之前的条件,他们一定会连边。
边数 \(O(n)\), 总时间复杂度为 \(O(nlogn)\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].lst,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=2e5 + 7;
const LL inf=1e13;
int n,S,k,ndc,edc;
int vis[N],head[N];
LL dis[N],xl[N],xr[N],yl[N],yr[N];
struct data{
int opt,id;LL y;
bool operator <(const data &rhs)const{
if(xl[id]!=xl[rhs.id]) return xl[id]<xl[rhs.id];
return xr[id]<xr[rhs.id];
}
}q[N<<1];
set<data>s;
set<data>::iterator l,r;
struct edge{ int lst,to,c; }e[N<<2];
void Add(int a,int b,int c){
e[++edc]=(edge){head[a],b,c},head[a]=edc;
}
struct Heap{
int u;LL dis;
bool operator <(const Heap &b)const{
return b.dis<dis;
}
};
void dijk(){
priority_queue<Heap>Q;
fill(dis+1,dis+1+n,inf);dis[S]=0;
Q.push((Heap){S,dis[S]});
while(!Q.empty()){
int u=Q.top().u;Q.pop();
if(vis[u]) continue;vis[u]=1;
go(u)if(dis[u]+e[i].c<dis[v]){
dis[v]=dis[u]+e[i].c;
Q.push((Heap){v,dis[v]});
}
}
}
int main(){
n=gi(),S=gi(),k=gi();
rep(i,1,n){
xl[i]=gi(),yl[i]=gi(),xr[i]=gi(),yr[i]=gi();
q[++ndc]=(data){1,i,yl[i]};
q[++ndc]=(data){0,i,yr[i]+1};
}
sort(q+1,q+1+ndc,[&](const data &a,const data &b){return a.y<b.y||a.y==b.y&&a.opt<b.opt;});
rep(i,1,ndc){
if(q[i].opt){
s.insert( (data){0,q[i].id,0} );
r=s.lower_bound( (data){0,q[i].id,0} ),l=r++;
if(l!=s.begin()) --l,Add(l->id,q[i].id,xl[q[i].id]-xr[l->id]);
if(r!=s.end()) Add(q[i].id,r->id,xl[r->id]-xr[q[i].id]);
}else s.erase( (data){0,q[i].id,0} );
}
dijk();
rep(i,1,n){
LL res;
if(dis[i]==inf||dis[i]>=k) res=0;
else res=k-dis[i];
printf("%lld%c",xl[i]+res,i==n?'\n':' ');
}
return 0;
}
牛客网NOIP赛前集训营-提高组(第八场)-B-推箱子[最短路优化建图]的更多相关文章
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- 牛客网NOIP赛前集训营-提高组(第二场)A 方差
链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中 表示序列的平 ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- 牛客网NOIP赛前集训营-提高组(第一场)B 数数字
数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营-提高组(第一场)A 中位数
中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1 \dots a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...
随机推荐
- Prometheus Node_exporter 之 Network Netstat ICMP
Network Netstat ICMP /proc/net/snmp 1. ICMP Errors 1 type: GraphUnit: shortLabel: Messages out (-) / ...
- CAC的Debian-8-64bit安装BBR正确打开方式
装过三台debian 64 bit, CAC, 2欧, KVM虚拟机 做法都一样---下面说下正确安装方式 0. 有装锐速记得先删除,免得换核心后,锐速在扯后腿. 1.换4.9版kernel ...
- Safari中的Date
在js中处理Date时,发现Safari和其他浏览器的支持方式不一致 1.例如:2017-01-01 12:00:00 在其他浏览器中,使用这个格式的字符串进行new Date操作没有问题,但是在Sa ...
- 入坑Vue
长期的后端数据开发着实有些枯燥无趣,项目完工,闲暇之际,最近一直在研究前端方面的东西,不得感叹,前端技术发展速度快的让人有些目不暇接,从jQuery开启的插件化时代,几乎许多网站都被jQuery支配, ...
- Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录
Linux的目录下面形如: [root@:vg_adn_tidbCkhsTest:172.31.17.203 /var/lib/mysql]#ll /tmp total drwxr root root ...
- sql点滴—mysql中查询表的信息
mysql中查询表的信息 查询mysql表字段信息的sql语句 SHOW DATABASES //列出 MySQL Server 数据库. SHOW TABLES [FROM db_name] //列 ...
- ES6中变量解构的用途—遍历Map结构
- [CTSC2018]混合果汁
题目连接:https://www.luogu.org/problemnew/show/P4602 因为题中说是让最小值最大,所以自然想到二分答案.对于每一个二分的值,判断是否合法,若合法,在右区间二分 ...
- C++的技术探究
C++深究 函数指针 double pam(int, double); // prototype double (*pf)(int, double); // declare function poin ...
- MetaMask/json-rpc-engine
https://github.com/MetaMask/json-rpc-engine RpcEngine——MetaMask/json-rpc-engine https://github.com/M ...