[CF46D]Parking Lot
题目:Parking Lot
传送门:http://codeforces.com/problemset/problem/46/D
分析:
做法一:
1)这题和Hotel那题一样,也可以看做是求区间空位的问题,不过相对于Hotel那题细节会更多一些。
2)头和尾是不用考虑前和后是否有车的,但可以在$-B$和$L+F$这两个位置假装停了一辆车,这样就不用考虑第一辆插入的车和插入在最后的车啦,减少思考量。
代码:
#include <cstdio> #include <algorithm> using namespace std; const int maxN=100500; int a[110],b[110]; struct Segment{int setL,setR,setN;int l0[maxN<<2],r0[maxN<<2],m0[maxN<<2],tag[maxN<<2];void Down(int v,int l,int r){if(tag[v]==-1)return;int mid=(l+r)>>1;l0[v<<1]=r0[v<<1]=m0[v<<1]=(!tag[v])*(mid-l+1);l0[v<<1^1]=r0[v<<1^1]=m0[v<<1^1]=(!tag[v])*(r-mid);tag[v<<1]=tag[v<<1^1]=tag[v];tag[v]=-1;}void Up(int v,int l,int r){int mid=(l+r)>>1;if(l0[v<<1]==(mid-l+1))l0[v]=l0[v<<1]+l0[v<<1^1];else l0[v]=l0[v<<1];if(r0[v<<1^1]==(r-mid))r0[v]=r0[v<<1]+r0[v<<1^1];else r0[v]=r0[v<<1^1];m0[v]=max(max(m0[v<<1],m0[v<<1^1]),r0[v<<1]+l0[v<<1^1]);}int que(int v,int l,int r){if(l==r)return l;Down(v,l,r);int mid=(l+r)>>1;if(m0[v<<1]>=setN)return que(v<<1,l,mid);if(r0[v<<1]+l0[v<<1^1]>=setN) return mid-r0[v<<1]+1;return que(v<<1^1,mid+1,r);}void set(int v,int l,int r){if(setL<=l && r<=setR){l0[v]=r0[v]=m0[v]=(!setN)*(r-l+1);tag[v]=setN;return;}Down(v,l,r);int mid=(l+r)>>1;if(setL<=mid)set(v<<1,l,mid);if(mid< setR)set(v<<1^1,mid+1,r);Up(v,l,r);} }T; int main(){int L,B,F,n;scanf("%d%d%d%d",&L,&B,&F,&n);T.l0[1]=T.r0[1]=T.m0[1]=B+L+F;for(int op,x,d,td,i=1;i<=n;++i){scanf("%d",&op);if(op==1){scanf("%d",&td);d=B+td+F;if(T.m0[1]<d)puts("-1");else{T.setN=d;x=T.que(1,-B,L+F-1);a[i]=T.setL=x+B;b[i]=T.setR=a[i]+td-1;T.setN=1;T.set(1,-B,L+F-1);printf("%d\n",a[i]);}}else{scanf("%d",&td);T.setL=a[td];T.setR=b[td];T.setN=0;T.set(1,-B,L+F-1);}}return 0; }
做法二:
2)关注到$n$非常小
3)利用map来储存停了车区间,保留区间头尾就好了
4)插入车:遍历map,查看两个停车区间的中间是否可以停下当前这辆车
代码:
#include <bits/stdc++.h> using namespace std; map<int,int>mp; int a[110]; int main(){int L,B,F,n;scanf("%d%d%d%d",&L,&B,&F,&n);mp[-B]=-B;mp[L+F]=L+F;for(int i=1,op,x;i<=n;++i){scanf("%d%d",&op,&x);if(op==1){a[i]=-1;for(auto it1=mp.begin(),it2=++mp.begin();it2!=mp.end();++it1,++it2) {if(it2->first - it1->second >=B+x+F) {a[i]=it1->second + B;mp[a[i]]=a[i]+x;break;}}printf("%d\n",a[i]);}else mp.erase(a[x]);}return 0; }
转载于:https://www.cnblogs.com/hjj1871984569/p/10426409.html
[CF46D]Parking Lot相关推荐
- 数据结构---线段树
线段树 转载请注明出处,谢谢!http://blog.csdn.net/metalseed/article/details/8039326 持续更新中··· 一:线段树基本概念 1:概述 线段树 ...
- 【转】线段树题目 汇总 讲解(by not only success)
转载自:http://www.notonlysuccess.com/ 非常喜欢他的代码风格以及简洁的思路,感谢notonlysuccess! PS:他的个人网站好像是上不去了-.- 线段树 很早前写的 ...
- ACM大牛总结的线段树专辑
https://blog.csdn.net/qq_25605637/article/details/46967529 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章 ...
- 【转载】完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
- 转载自杭电大牛的博客 线段树 绝对经典
转载自:http://www.notonlysuccess.com/ 不可不看的经典 学线段树必看,大牛很多,给后人留下记录的却没有几个,谢谢这位大牛~! 因为我这最近他博客打不开了...特意从别人那 ...
- 线段树模板(来自胡浩大牛)
http://www.notonlysuccess.com/(今天看二叉树,想回来看看,发现大牛博客进不去...) 如果要学,就要好好学.我copy的,如有错,请看http://www.cnblogs ...
- 大牛整理的线段树集锦
转载自:http://www.notonlysuccess.com/ 膜拜之... [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pk ...
- ACM_大牛总结的线段树专辑
附上原出处:http://blog.csdn.net/qq_25605637/article/details/46967529 [完全版]线段树 这是从大牛那里粘过来的总结,对于刚训练线段树的我来说帮 ...
- 信息收集之Github搜索语法搜集敏感信息
转载https://blog.csdn.net/qq_36119192/article/details/99690742 目录 使用 Github 进行邮件配置信息收集 使用Github进行数据库信息 ...
最新文章
- PDF文字怎么编辑,PDF文档编辑方法
- shell 获取字符串/文件的MD5值
- 长沙网络推广浅析如何增加网站的蜘蛛爬取频次?
- 如何评价rcnn、fast-rcnn和faster-rcnn这一系列方法?
- python django bootstrap_导入 201901
- mysql可能锁的表命令_mysql 默许是表级锁一些不太常用命令
- 凑个热闹-LayoutInflater相关分析
- 学习笔记11-C语言-指针
- Spring Data JPA 从入门到精通~SpEL表达式的支持
- 常见网络命令整理(ping、trcert、netstat)
- python获取文件修改时间与创建时间
- Try increasing heap size with java option '-Xmxlt;sizegt;’.
- 移动端安全 - 安卓Android - 工具相关
- 管理感悟:怎样讲清楚自己的想法
- paip.c语言gtk开发环境CodeBlocks /QT建立最佳实践
- python pygame 的下载方法
- Simulink之PWM整流器
- “码头工人”的Docker进阶之路:从轻装上路到网络、存储和安全
- 通过phpstudy(小皮面板)搭建DVWA靶场教程
- Linux中find命令基本使用方法