福建省信息学奥林匹克CCF NOIP夏令营第六天训练Word文件下载.docx
- 文档编号:17185911
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:12
- 大小:18.38KB
福建省信息学奥林匹克CCF NOIP夏令营第六天训练Word文件下载.docx
《福建省信息学奥林匹克CCF NOIP夏令营第六天训练Word文件下载.docx》由会员分享,可在线阅读,更多相关《福建省信息学奥林匹克CCF NOIP夏令营第六天训练Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
老师指定编号为i的同学站在编号为1~i-1中某位同学(即之前已经入列的同学)的左边或右边;
3.
从队列中去掉M(M<
N)个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
【输入文件】
输入文件arrange.in的第1行为一个正整数N,表示了有N个同学。
第2~第N行,第i行包含两个整数k,p,其中k为小于i的正整数,p为0或者1。
若p为0,则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边。
第N+1行为一个正整数M,表示去掉的同学数目。
接下来M行,每行一个正整数x,表示将x号同学从队列中移去,如果x号同学已经不在队列中则忽略这一条指令。
【输出文件】
输入文件arrange.out仅包括1行,包含最多N个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。
【样例输入】
4
10
21
2
3
【样例输出】
241
【样例说明】
将同学2插入至同学1左边,此时队列为:
将同学3插入至同学2右边,此时队列为:
231
将同学4插入至同学1左边,此时队列为:
2341
将同学3从队列中移出,此时队列为:
同学3已经不在队列中,忽略最后一条指令
最终队列:
【数据规模与约定】
对于20%的数据,有N≤10;
对于40%的数据,有N≤1000;
对于100%的数据,有N,M≤100000。
题目大意:
按题目要求逐个安排位置,然后删除人,输出最终队列。
双向链表。
我为了使查找人的时间变成O
(1)。
。
又开了个100000的数组。
还有懒得去删除节点。
直接开个BOOLEAN数组。
其他的模拟就可以了。
type
pointer=^code;
code=record
left,right:
pointer;
data:
longint;
end;
var
a:
array[1..100000]ofpointer;
b:
array[1..100000]ofboolean;
head,p,q:
n,m,i,j,x,y:
procedureinit;
begin
assign(input,'
arrange.in'
);
assign(output,'
arrange.out'
reset(input);
rewrite(output);
readln(n);
new(a[1]);
a[1]^.left:
=nil;
a[1]^.right:
a[1]^.data:
=1;
head:
=a[1];
fori:
=2tondobegin
new(a[i]);
readln(x,y);
ify=0thenbegin
ifa[x]=headthenhead:
=a[i];
a[i]^.left:
=a[x]^.left;
a[i]^.right:
=a[x];
ifa[x]^.left<
>
nilthen
a[x]^.left^.right:
a[x]^.left:
ify=1thenbegin
=a[x]^.right;
ifa[x]^.right<
a[x]^.right^.left:
a[x]^.right:
a[i]^.data:
=i;
readln(m);
fillchar(b,sizeof(b),true);
=1tomdobegin
readln(x);
b[x]:
=false;
init;
whilehead<
nildobegin
ifb[head^.data]=truethenwrite(head^.data,'
'
=head^.right;
close(input);
close(output);
end.
日志分析(log)
M
海运公司最近要对旗下仓库的货物进出情况进行统计。
目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。
该日志记录了两类操作:
第一类操作为集装箱入库操作,以及该次入库的集装箱重量;
第二类操作为集装箱的出库操作。
这些记录都严格按时间顺序排列。
集装箱入库和出库的规则为先进后出,即每次出库操作出库的集装箱为当前在仓库里所有集装箱中最晚入库的集装箱。
出于分析目的,分析人员在日志中随机插入了若干第三类操作——查询操作。
分析日志时,每遇到一次查询操作,都要报告出当前仓库中最大集装箱的重量。
输入文件log.in包含N+1
行:
第一行为1
个正整数N,对应于日志内所含操作的总数。
接下来的N
行,分别属于以下三种格式之一:
格式1:
0X
//一次集装箱入库操作,正整数X表示该次入库的集装箱的重量
格式2:
1
//一次集装箱出库操作,(就当时而言)最后入库的集装箱出库
格式3:
2
//一次查询操作,要求分析程序输出当前仓库内最大集装箱的重量
当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出0。
输出文件log.out输出行数等于日志中查询操作的次数。
每行为一个正整数,表示查询结果。
13
01
02
04
1
对于100%的数据,有N≤200000,X≤108。
在一个栈里进行入栈,出栈及查找栈中最大值。
设f[i]为栈中自底向上i个元素的最大值。
当入了一个新元素X时,inc(top);
f[top]:
=max(x,f[top-1]);
出栈时直接top-1(当TOP=0时不动),查找就输出f[top](当TOP=0
时输出0);
n,i,j,x,y,top:
f:
array[0..200000]oflongint;
functionmax(a,b:
longint):
ifa>
bthenexit(a)
elseexit(b);
log.in'
log.out'
top:
=0;
f[0]:
=1tondobegin
read(x);
casexof
0:
readln(y);
inc(top);
f[top]:
=max(f[top-1],y);
1:
iftop<
0thendec(top);
readln;
2:
writeln(f[top]);
中位数(median)
给出一个长度为N的非负整数序列A[i],对于所有1≤k≤(N+1)/2,输出A[1],A[2],…,A[2k-1]的中位数。
即前1,3,5,……个数的中位数。
输入文件median.in的第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数A[i](A[i]
≤109)。
输出文件median.out包含(N+1)/2行,第i行为A[1],A[2],…,A[2i–1]的中位数。
7
13579116
5
6
对于20%的数据,N≤100;
对于40%的数据,N≤3000;
对于100%的数据,N≤100000。
对于一个序列a[i],输出前1个,3个,5个,7个……的中位数。
维护一个最大堆,一个最小堆。
假设目前有2*k+1个元素,那么最大堆里装k+1个较小的数,最小堆中装另外k个较大的数。
那么最大堆中的首元素就是这2*k+1个元素的中位数。
然后就是维护的过程。
读入一个数,如果大于等于maxheap[1]就插入到minheap中,小于的话就与maxheap[1]交换,把maxheap[1]插入到minheap中,调整maxheap;
再读入一个数,这次插入maxheap中(如果比minheap大,就把minheap[1]放到maxheap,然后minheap[1]变为新的数,调整minheap。
小等于的话直接插入maxheap)。
这样每次使得maxheap[1]为所求。
因为维护堆的操作复杂度为logn,所以很迅速就能出解。
maxheap,minheap:
array[0..100001]oflongint;
n,m,k,i,j,maxn,minn,x,t:
functionson(i:
boolean;
ifminn=1thenexit(false);
ifi*2<
=minnthenexit(true)
elseexit(false);
procedurepush(x,y:
longint);
vari,j,t:
inc(maxn);
maxheap[maxn]:
=x;
i:
=maxn;
while(i<
1)and(x>
maxheap[idiv2])dobegin
j:
=idiv2;
t:
=maxheap[i];
maxheap[i]:
=maxheap[j];
maxheap[j]:
=t;
=j;
ify=2thenbegin
inc(minn);
minheap[minn]:
=minn;
1)and(x<
minheap[idiv2])dobegin
=minheap[i];
minheap[i]:
=minheap[j];
minheap[j]:
median.in'
median.out'
k:
=(n+1)div2;
maxn:
minn:
maxheap[maxn]:
writeln(x);
form:
=1tok-1dobegin
ifx>
=maxheap[1]thenpush(x,2);
ifx<
maxheap[1]thenbegin
push(maxheap[1],2);
maxheap[1]:
whilei*2<
=maxndobegin
j:
if(i*2+1<
=maxn)and(maxheap[i*2+1]>
t)thenbeginj:
=i*2+1;
t:
end;
ifmaxheap[i*2]>
tthenbeginj:
=i*2;
ifi=jthenbreak;
=minheap[1]thenpush(x,1);
minheap[1]thenbegin
push(minheap[1],1);
minheap[1]:
=minndobegin
=minn)and(minheap[i*2+1]<
ifminheap[i*2]<
writeln(maxheap[1]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 福建省信息学奥林匹克CCF NOIP夏令营第六天训练 福建省 信息学 奥林匹克 CCF NOIP 夏令营 第六 训练
![提示](https://static.bdocx.com/images/bang_tan.gif)