题目描述
刚拿到驾照的KJ 总喜欢开着车到处兜风,玩完了再把车停到阿Q的停车场里,虽然她对自己停车的水平很有信心,但她还是不放心其他人的停车水平,尤其是Kelukin。于是,她每次都把自己的爱车停在距离其它车最远的一个车位。KJ 觉得自己这样的策略非常科学,于是她开始想:在一个停车场中有一排车位,从左到右编号为 1 到 n,初始时全部是空的。有若干汽车,进出停车场共 m 次。对于每辆进入停车场的汽车,会选择与其它车距离最小值最大的一个车位,若有多个符合条件,选择最左边一个。KJ 想着想着就睡着了,在她一旁的Kelukin想帮她完成这个心愿,但是他又非常的懒,不愿意自己动手,于是就把这个问题就留给了你:在KJ 理想的阿 Q 的停车场中,给你车辆进出的操作序列,依次输出每辆车的车位编号。
输入格式
第一行,两个整数 n 和 m,表示停车场大小和操作数;
接下来 m 行,每行两个整数,F 和 x
F 是 1 表示编号为 x 的车进停车场;
F 是 2 表示编号为 x 的车出停车场;
保证操作合法,即:
出停车场的车一定目前仍在停车场里;
停车场内的车不会超过 n;
输出格式
对于所有操作 1,输出一个整数,表示该车车位的编号。
样例输入
7 11
1 15
1 123123
1 3
1 5
2 123123
2 15
1 21
2 3
1 6
1 7
1 8
样例输出
1
7
4
2
7
4
1
3
数据范围
对30%的数据 n<=1000 ,m<=1000
对60%的数据 n<=200000,m<=2000
对100%的数据n,m<=200000,车的编号小于等于 10^6
思路
30%
第一边做打了一个爆搜,维护停车场和距离最大值两个数组,进出车辆各自维护,进车的时候两个指针分别指向左右端点,维护值即为原值和更新值中较小的;出车的时候因为不知道此时的值是谁赋给它的,所有把空车位全部填满重来一遍。
const ma=200000; var f:array[1..ma] of longint; a:array[1..ma] of longint; n,m,k,x,y,num,ss,kk:longint; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; procedure intt; begin assign(input,'park.in'); assign(output,'park.out'); reset(input); rewrite(output); end; procedure outt; begin close(input); close(output); end; function update1(x:longint):longint; var i,j,k,sum,num:longint; begin i:=x;j:=x; while i>=1 do begin if a[i]=0 then f[i]:=min(f[i],abs(x-i)); dec(i); end; while j<=n do begin if a[j]=0 then f[j]:=min(f[j],abs(x-j)); inc(j); end; num:=0;sum:=0; for i:=1 to n do if (a[i]=0)and(f[i]>sum) then begin sum:=f[i]; num:=i; end; exit(num); end; //car in function update2(x:longint):longint; var i,j,num,sum:longint; begin for i:=1 to n do if a[i]=0 then f[i]:=2139062143; for i:=1 to n do if a[i]<>0 then for j:=1 to n do if a[j]=0 then f[j]:=min(f[j],abs(i-j)); num:=0;sum:=0; for i:=1 to n do if (a[i]=0)and(f[i]>sum) then begin sum:=f[i]; num:=i; end; exit(num); end; //car out begin intt; fillchar(f,sizeof(f),127); fillchar(a,sizeof(a),0); readln(n,m); for k:=1 to m do begin readln(x,y); if k=1 then begin a[1]:=y; writeln(1); ss:=update1(1); continue; end; if x=1 then begin writeln(ss); a[ss]:=y; f[ss]:=2139062143; ss:=update1(ss); continue; end; if x=2 then begin for kk:=1 to n do if a[kk]=y then begin a[kk]:=0; f[kk]:=2139062143; ss:=update2(kk); break; end; continue; end; end; outt; end.