喵哈哈村的冒菜店-(线段树的区间合并)

来源:互联网 发布:unity3d 导入 box 编辑:程序博客网 时间:2024/05/18 12:02

喵哈哈村的冒菜店

发布时间: 2017年3月19日 16:00   最后更新: 2017年3月19日 16:01   时间限制: 1000ms   内存限制: 128M

喵哈哈村的冒菜店开张了,这里的冒菜特别好吃。

星星同学听闻后,就准备去吃冒菜。

星星同学开着自己才花了几十万买的宝马X5,就开进了冒菜店的停车场。

就在她停车的过程中,她发现一个有趣的现象,喵哈哈村的人们总是喜欢停车停在离别人车最远的地方,具体来说就是停在离所有车的距离最小值最大的位置,如果有多个,他们就喜欢停在编号小的位置上。

现在星星同学有一个疑问了:

这个停车场可以看做是拥有一排的停车位,这些停车位编号为1~n,初始都是空的。

如果有若干个汽车进进出出这停车场,那么这些汽车会停在哪些位置呢?

第一行两个整数n,m,表示停车场大小和操作数。
接下来m行,每行两个整数F和x。
F是1表示编号为x的车进停车场。
F是2表示编号为x的车出停车场。
保证操作合法。

满足n,m<=200000,x<=1000000

对于所有操作1,输出一个整数,表示该车车位的编号。

 复制
7 111 151 1231231 31 52 1231232 151 212 31 61 71 8
17427413
  
题解:http://www.cnblogs.com/qscqesze/p/6580390.html

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;typedef long long  ll;#define maxn 5000005#define Mod  1000000007int b[maxn],n,m;struct node{int l,r,mid,ans;}a[maxn];void merge(int id){if(a[id*2].l>0)a[id].l=a[id*2].l;elsea[id].l=a[id*2+1].l;if(a[id*2+1].r>0)a[id].r=a[id*2+1].r;elsea[id].r=a[id*2].r;a[id].mid=a[id*2].mid;a[id].ans=a[id*2].ans;if(a[id*2+1].l>0 && a[id*2].r>0){int tmp=(a[id*2+1].l-a[id*2].r)/2;if(tmp>a[id].mid){a[id].mid=tmp;a[id].ans=(a[id*2+1].l+a[id*2].r)/2;}if(a[id*2+1].mid>a[id].mid){a[id].mid=a[id*2+1].mid;a[id].ans=a[id*2+1].ans;}}}void work(int id,int l,int r,int num,int mark){if(l==r){if(mark==1){a[id].l=l;a[id].r=r;a[id].mid=a[id].ans=0;}else{a[id].l=a[id].r=0;a[id].mid=a[id].ans=0;}return;}int mid=(l+r)/2;if(num<=mid)   work(id*2,l,mid,num,mark);elsework(id*2+1,mid+1,r,num,mark);merge(id);  }int  main(void){int i,x,y,sum;scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d",&x,&y);if(x==1){if(a[1].l==0)b[y]=1;else{sum=-1000000001;if(a[1].l-1>sum){b[y]=1;sum=a[1].l-1;}if(a[1].mid>sum) {b[y]=a[1].ans;sum=a[1].mid;}if(n-a[1].r>sum){b[y]=n;sum=n-a[1].r;}}printf("%d\n",b[y]);work(1,1,n,b[y],1);}elsework(1,1,n,b[y],2);}return 0;}


0 0
原创粉丝点击