tyvj的一道题,大意是这样的。。。
【问题描述】在 T 校的校门口有一条路,这条路上有一些摊位,按照离校门的远近关系标号为 1, 2, 3, . . . , N。
你突然发现在校门⼜卖煎饼(hualaishi)是一件很好的差事,于是你打算暑假在校门口(sushe)卖煎饼(hualaishi)。你发现这些摊位有一些是被占用的,有一些是没有被占用的。
你为了方便生意,需要占用两个连续的没有被占用的摊位来卖煎饼。
当然你希望你的煎饼摊离学校越近越好,所以你希望占用的两个连续摊位的的编号越小越好。现在给你一个长度为 M 的序列 a1, a2, ..., am,表示已经占用的摊位信息。
你需要回答 Q 个询问,每个询问有两个参数 L,R,表示问你当 aL, aL+1, ..., aR这些摊位被占用的时候你应该选择哪两个编号的摊位。
【输入格式】第一行三个整数,N,M,Q,分别表示摊位的编号范围,a 序列的长度,询问次数。
第二行M 个整数表示 a 序列。
之后 Q 行,每行两个整数 L,R。
【输出格式】输出一共 Q行,每行两个空格隔开的两个整数,表示你占用的连续两个摊位,如果没有找到合适摊位请输出-1 -1。
【样例输入】10 5 15
3 1 6 7 5
1 1
1 2
1 3
1 4
1 5
2 2
2 3
2 4
2 5
3 3
3 4
3 5
4 4
4 5
5 5
【样例输出】1 2
4 5
4 5
4 5
8 9
2 3
2 3
2 3
2 3
1 2
1 2
1 2
1 2
1 2
1 2
这一题说实话还是挺没良心的,因为。。。
【数据规模和约定】对于 10% 数据,保证 Q = 1。
对于其他 20% 数据,N, M, Q ≤ 100。
对于其他 20% 数据,N, M, Q ≤ 1000。
对于其他 20% 数据,N, M, Q ≤ 10000。
对于其他 20% 数据,N, M, Q ≤ 100000 。
对于 100% 的数据,1 ≤ N, M, Q ≤ 200000, 1 ≤ ai ≤ N。
暴力截的话一道会TLE掉好几个点。。。
然而我暂时想不到比暴力更好的办法了(蒟蒻表示十分无奈= =)
其实莫队这种算法是可以卡过的(没卡莫队),然而我不会。。。。。。(GG)
附上一篇丑陋的代码~\(≧▽≦)/~啦啦啦(pascal)
procedure fin;
begin
assign(input,'stall.in');
assign(output,'stall.out');
reset(input); rewrite(output);
end;
procedure fout;
begin
close(input); close(output);
end;
var
i,j,k,L,R,n,m,q:longint;
sta:array[1..200000]of longint;
len:array[0..200000]of longint;
begin
fin;
readln(n,m,q);
fillchar(sta,sizeof(sta),0);
for i:=1 to m do begin
read(k);sta[i]:=k;
end;
for k:=1 to q do begin
readln(L,R);
for i:=1 to n do len[i]:=1;
for i:=L to R do
len[sta[i]]:=-1;
for i:=1 to n do begin
if (len[i]=1)and(len[i-1]=1) then begin
writeln(i-1,' ',i); break; end;
if (i=n)and(len[i]<2)then writeln(-1,' ',-1);//暴力的主过程
end;
end;
fout;
end.
大佬们如果有更好的方法请@我O(∩_∩)O。