题目描述

刚拿到驾照的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

样例输出








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.
View Code

相关文章:

  • 2022-12-23
  • 2021-06-23
  • 2022-01-02
  • 2021-07-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-24
  • 2022-01-10
  • 2022-12-23
  • 2022-12-23
  • 2021-12-24
  • 2021-09-03
相关资源
相似解决方案