2024年国际信息学奥林匹克竞赛(IOI)试题

标签:
普通图片版
2024-09-14
| 21页
| 771人阅读
| 1人下载

内容正文:

THE 36"INTERNATIONAL nile ALEXANdrIA OLYMPIAD IN INFORMATICS Day 1 Tasks EGHPT 202H Chinese (CHN) 尼罗河船运(nile) 你想通过尼罗河来运输N件手工艺品。这些手工艺品从0到N-1编号。第i(0<i<N)件手工艺 品的重量是W[i]。 为了运输这些手工艺品,你使用了特制的船。每艘船最多可以运两件手工艺品。 如果你决定将单件手工艺品放在一艘船上,那么这件手工艺品的重量可以是任意的。 · 如果你想把两件手工艺品一起放在同一艘船上,你必须保证这艘船的平衡。具体来说,如果手工艺 品p和q(0<p<q<N)的重量差的绝对值不超过D,即满足W[pl-W[qll<D,那么你可 以将它们一起放在同一艘船上。 你必须付费来运一件手工艺品,其运费取决于同一艘船上所运载的手工艺品数量。手工艺品 (0<i<N)的运费是: · Ai,如果你把手工艺品i单独放在船上,或者 Bi,如果你把手工艺品i和另一件手工艺品一起放在船上。 注意在第二种情况中,你要为船上两件手工艺品都支付运费。具体来说,如果你决定用同一艘船运输手工 艺品p和q(0<p<q<N),你需要支付Bp]+B[q]。 一件手工艺品单独用一艘船运输的费用,总是比与其他手工艺品合用一嫂船时的费用要高,所以对任意满 足0<i<N的i,都有B]<Ai]。 麻烦的是,由于尼罗河变化莫测,导致D的值经常改变。你的任务是回答Q个问题,从0到Q一1编 号。这些问题用一个长度为Q的数组E来描述。问题i(0<j<Q)的答案,是在D的值等于Ei 时运输所有N件手工艺品的最小总代价。 实现细节 你需要实现以下函数。 std: :vector<long long> calculate costs( std::vector<int>W, std::vector<int> A. std::vector<int> B, std::vector<int> E) · W,A,B:长度均为N的整数数组,分别给出手工艺品的重量和运费 · E:长度为O的整数数组,给出每个问题中的D值。 nile(1of3) · 该函数应该返回一个包含Q个整数的数组R,给出运输手工艺品的最小总代价,其中Ril对应D 等于Ej](对每个满足0<j<Q的j)时的运费。 ·对于每个测试用例,该函数恰好被调用一次。 约束条件 · 1<N<100000 ·1<Q<100000 · 对每个满足0<i<N的i,都有1<Wlil<10 · 对每个满足0<i<N的i,都有1<B[]<A]<10{ ·对每个满足0<j<Q的j,都有1<Ej]<10 子任务 子任务 分数 额外的约束条件 6 1 Q<5;N<2000;对每个满足0<i<N的i,都有W[]=1 13 Q<5;对每个满足0<i<N的i,都有Wlil=i+1 3 $7 Q<5;对每个满足0<i<N的i,都有Al]-2且B]-1 4 11 Q<5;V<2000 5 20 Q<5 15 6 对每个满足0<i<N的i,都有Ai]=2且Bi]=1 7 18 没有额外的约束条件。 例子 考虑以下调用。 calculatecosts([15,12,2,10,21]. [5,4,5,6,3], [1,2,2,3,2], [5.9,1]) 在该例子中,我们有N一5件手工艺品和Q一3个问题 在第一个问题中,D=5。你可以把手工艺品0和手工艺品3放在同一艘船上(因为15一10<5), 而其他手工艺品都各自放在不同的船上。这使得运输所有手工艺品的总代价最小,即 1+4+5+3+3-16。 在第二个问题中,D一9。你可以把手工艺品0和手工艺品1放在同一嫂船上(因为15-12<9), 而把手工艺品2和手工艺品3放在同一艘船上(因为2一10<9)。剩下的手工艺品单独用一嫂船运 nile (2of3) 输。这使得运输所有手工艺品的总代价最小,即1+2+2+3+3=11。 在最后一个问题中,D一1。你需要把每件手工艺品都单独用一艘船运输。这使得运输所有手工艺品的总 代价最小,即5+4+5+6+3=23。 因此,该函数应该返回[16,11.23]。 评测程序示例 输入格式: N w[]A[]B[o] W[1]A[1]B[1] _ W[N-1] A[N-1] B[N-1] 0 Ef] E[] ,_ E[Q-1] 输出格式: R[o] R[1] . R[S-1] 这里,S是calculate costs所返回的数组R的长度 nile(3of3) THE 36"INTERNATIONAL message ALEXANdFIA OLYMPIAD IN INFORMATICS Day 1 Tasks EGHDT 202H Chinese (CHN) 消息篡改者 (message) Aisha和Basma是两位互相通信的朋友。Aisha有一条消息M想要发给Basma:该消息是由S个比特 (即若干0或1)组成的序列。Aisha通过发送数据包来跟Basma通信。一个数据包是由31个比特组成 的序列,对应的位置从0到30编号。Aisha想向Basma发送消息M时,会发送若干数据包。 然而第三个人Cleopatra在破坏Aisha和Basma之间的通信,能够篡改发送的数据包。在每个数据包 中,Cleopatra可以修改恰好15个位置的比特。具体来说,给定长度为31的数组C,其中每个元素为0 或1,含义如下: · Clil一1表示位置为i的比特可以被Cleopatra修改。我们称此类位置是被Cleopatra控制的。 · C[i]一0表示位置为i的比特不能被Cleopatra修改。 数组C恰好包含15个1和16个0。当发送消息M时,Cleopatra控制的位置集合对于所有数据包都是 相同的。Aisha清楚地知道哪15个位置被Cleopatra控制。Basma只知道有15个位置被Cleopatra控 制,但不知道是哪些位置。 令A为Aisha决定要发送的数据包(称之为原始数据包)。令B为Basma收到的数据包(称之为篡改数 据包)。对每个在0<i<31的i都有: · 如果Cleopatra不能控制位置为i的比特(Cil一0),那么Basma将能收到Aisha发送的第i个 比特(B]一A]): 否则,如果Cleopatra控制了位置为i的比特(Ci]三1),那么Bil的值由Cleopatra决定。 每个数据包发送后,Aisha会立刻知道被篡改后的数据包内容。 当Aisha发送完所有数据包后,Basma按照发送顺序接收到所有被篡改的数据包,她必须重建原始消息 M。 你的任务是制定并实现某种策略,使得Aisha给Basma发送消息M时,Basma能够从篡改数据包中恢 复M。具体来说,你要实现两个函数,第一个函数进行Aisha的动作:给定消息M和数组C,给 Basma发送若干数据包来传输消息。第二个函数进行Basma的动作:给定若干篡改数据包,恢复原始消 息M。 实现细节 你要实现的第一个函数是 void send message(std::vector<bool> M, std::vector<bool> c) message (1of4) · M:长度为S的数组,描述Aisha想要发给Basma的消息。 · C:长度为31的数组,标记Cleopatra控制的数据包中的位置。 · 每个测试用例中,该函数最多可被调用2100次。 该函数调用以下函数来发送数据包 std::vector<bool> send packet(std: :vector<bool>A) · A:原始数据包(长度为31的数组),表示Aisha发送的比特。 此函数返回篡改数据包B,表示Basma接收到的比特。 · 此函数在send message的一次调用过程中最多被调用100次 你要实现的第二个函数是 std::vector<bool>receive message(std::vector<std::vector<bool>>R · R:描述若干篡改数据包的数组。这些数据包源自Aisha在一次send message调用时发送的若干 数据包,且按照Aisha的发送顺序排列。R的每个元素是长度为31的数组,表示一个篡改数据 包。 该函数应返回包含S个比特的数组,且与原始消息M相同。 · 每个测试用例中,该函数可能被调用多次。对于每次sendmessaae的调用,对应地该函数要有 恰好一次调用。函数receive message的调用顺序不必与对应的send messaqe调用顺序一 致。 注意在评测系统中,send messaae和receive messaae两个函数是在不同的程序中来调用的 约束条件 · 1<S<1024 · C恰好有31个元素,且其中16个为0,15个为1。 子任务与评分 如果在任意的测试用例中,函数sendpacket的调用不符合上述规则,或者某个函数 receive message的调用的返回值不正确,你的解答在该测试用例上得0分。 否则,令Q为所有测试用例中,每次sendmessage调用时调用函数sendpacket的次数的最大值。 令X等于: ·1,如果Q<66 . 0.95-66,如果66<Q<100 ·0,如果100<Q 那么,得分将由以下式子计算获得: message (2of4) 子任务 分数 额外的约束条件 1 $0·t $<64 2 90.X 没有额外的约束条件。 注意在某些测试用例中,评测程序的行为是自适应的。这意味着sendpacket的返回值可能取决于它的 输入参数和以前调用该函数的返回值。 例子 考虑以下调用. sendmessage([o,1,1, o], [,。,,,,,,⊙,,,:,,,。,, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]) Aisha试图发给Basma的消息是[0.1.1.0]。数据包的第0至第15个比特不能被Cleopatra修改,而第 16至第30个比特可以被Cleopatra修改。 为便于解释这个例子,我们假设Cleopatra的行为是确定性的:她交替地用0和1填充所控制的比特,也 就是她把她控制的第一个位置赋0(例子中的第16位),把她控制的第二个位置赋1(第17位),把她 控制的第三个位置赋0(第18位),以此类推。 Aisha可以做出的一种决定是在一个数据包中发送原始消息中的两个比特,例如她是这样做的:通过她控 制的前8个位置来发送第一个比特,通过她控制的接下来8个位置来发送第二个比特。 于是Aisha发送以下数据包 sendpacket([o,,,⊙,6,e,。,⊙,1,1,1,1,1,1,1,1, 。,,,,,,,,。,,,,,,]) 由于Cleopatra可以更改最后15个比特,所以Aisha决定随意设置它们,因为它们可能会被覆盖。使用 前面假定的Cleopatra的策略,该函数返回 0,0,0,0,0,0,0,0.1,1.1.1,1.1,1,1,0,1,0,1,0,1,0,10,10,1.0,1,0。 Aisha决定在第二个数据包中发送M的最后两个比特,与之前类似 send_packet([1,1,1,1,1,1,1,1,9,,,。,6,。,0,9, 0,。,,,,,⊙,⊙,,,,,,⊙,。]) 根据假定的Cleopatra的策略,该函数返回: message (3 of4) 1.1.1.1.1.1.1.1.0.0.0.0.0.0.0.0.0.1.0.1.0.1.0.1.0.1.0.1.0.10 Aisha还可以发送更多的数据包,但她没有这样做。 然后评测程序进行以下函数调用 receivemessage([[o,,,⊙,⊙,。,。,,1,1,1,1,1,1,1,1, 0,1,⊙,1,6,1,⊙,1, 。,1,。,1,。,1,], [1,1,1,1,1,1,1,1, 。,,⊙,, 9,1,⊙,1:⊙,1,⊙,1,⊙,1,⊙,1,⊙,1, )]) Basma按照如下方式恢复消息M。她从每个数据包中提取出第一个连续出现两次的比特,以及最后一个 连续出现两次的比特。也就是说,她从第一个数据包提取出两个比特[0.1,从第二个数据包中提取出两 个比特[1.0l。把它们放在一起,她恢复了消息[0.1.1.0],这是对receive message调用的正确返回 值。 可以证明,在假设的Cleopatra的策略下,对于长度为4的消息,不管C的值是多少,Basma这样做能 够正确恢复M。然而,一般情况下这并不正确。 评测程序示例 评测程序示例不具备自适应性,Cleopatra的行为是确定性的,她交替地用0和1来填充她控制的比特, 就像她在例子中所做的那样。 输入格式:输入第一行包含一个整数T,指定测试用例的数量。接下来有T组测试用例,每组测试用例都 按以下格式描述: S M[o] M[1] 1 M[S-1] c[]C[1]... C30] 输出格式:评测程序示例按照输入的顺序,用以下格式输出T组测试用例的结果 K. D[] 1 D[1] 1..D[L-1] 这里,K是sendpacket的调用次数,D是receivemessage返回的消息,L是它的长度。 messaoe (4 of 4 THE 36"INTERNATIONAL tree ALEXANdrIA OLYMPIAD IN INFORMATICS Day 1 Tasks EGUDT 202H Chinese (CHN) 树上代价(tree) 有一棵包括N个结点的树,结点从0到N一1编号。结点0是树的根。除根以外的每个结点都有唯一的 父结点。对所有满足1<i<N的i,结点i的父结点为Pl,这里有Pi]<i。我们约定P0l=-1。 对所有结点i(0<i<N),i的子树是如下结点组成的集合 .2,以及 · 所有父结点为i的结点,以及 · 所有父结点的父结点为i的结点,以及 · 所有父结点的父结点的父结点为i的结点,以及 · 以此类推。 下图给出了一个包含N一6个结点的树的例子。每个箭头都从某个结点连向它的父结点(根结点除外 因为它没有父结点)。结点2的子树包括结点2.3.4和5。结点0的子树包括树中的全部6个结点,而结 点4的子树仅包括结点4自己。 每个结点都被赋以非负整数的权重。我们将结点i(0<i<N)的权重记为Wil。 你的任务是写一个程序来回答Q个询问,其中每个询问都用一对正整数(L,R)来表示。对于询问的回 答,应按照如下要求进行计算。 对树中的每个结点,都指派一个整数,称为系数。这样的指派结果被描述成一个序列 Cl0].....C[N一1,这里Cli](0<i<N)是指派给结点i的系数。我们称该序列为-个系数序列 注意,系数序列中的元素可以取负值、0或正值。 对某个询问(L.R),一个系数序列被称为是有效的,如果对于每个结点i(0<i<N)都有如下条件成 立:结点i的子树中的系数之和不小于L且不大于R。 对于一个给定的系数序列C0.....C[N-1],结点i的代价为ClilI·W],这里Cill表示C[il的绝 对值。最后,总体代价为所有结点的代价之和。你的任务是,对于每个询问,计算出可以由某个有效系数 tree(1of4) 序列达到的最小总体代价 可以证明,对于任意询问,都至少存在一个有效的系数序列。 实现细节 你需要实现如下两个函数: void init(std::vector<int>P, std::vector<int>W) · P,W:两个长度为N的整数数组,记录了结点的父结点和权重。 · 对于每个测试样例,在评测程序与你的程序开始交互时,该函数将被恰好调用一次。 long long query(int L, int R) · L,R:两个整数,描述一次询问。 · 对于每个测试样例,在1nit被调用后,该函数将被调用Q次。 · 该函数应该返回对给定询问的答案。 约束条件 · 1<N<200000 ·1<Q<100000 · P0]=-1 对所有满足1<i<N的i,都有0<Pil<i 对所有满足0<i<N的i,都有0<Wlil<1000000 · 在每次询问中,都有1<L<R<1000000 子任务 子任务 分数 额外的约束条件 10 1 Q<10;对所有满足1<i<N的i,都有W[Plill<W[i] 2 13 Q<10; N<2000 3 18 Q<10;N<60000 4 _ 对所有满足0<i<N的i,都有W[il=1 1 对所有满足0<i<N的i,都有Wi]<1 6 22 1-1 7 19 没有额外的约束条件。 tree (2of 4) 例子 考虑如下调用: init([-1,),],[1,1,1]) 这棵树包含3个结点:根结点以及它的2个子结点。所有结点的权重均为1。 query(1,1) 本次询问有L三R=1,这意味着每个子树中的系数之和都必须等于1。考虑系数序列[-1.1.1l。这棵 树以及相应的系数(在阴影矩形中)图示如下。 #回 1① 2① 对每个结点i(0<i<3),i的子树中全部结点的系数之和均为1。因此,系数序列是有效的。总体代 价的计算如下: 结点 权重 系数 代价 1 0 -1 1-11-1 1 1 1 11|:1-1 2 1 1 11:1-1 因此总体代价为3。这是唯一的有效系数序列,因此调用应该返回3。 query(1,2) 对于该询问的最小总体代价为2,可以在系数序列为0.1.1时达到。 评测程序示例 输入格式: tree (3of4)

资源预览图

2024年国际信息学奥林匹克竞赛(IOI)试题
1
2024年国际信息学奥林匹克竞赛(IOI)试题
2
2024年国际信息学奥林匹克竞赛(IOI)试题
3
2024年国际信息学奥林匹克竞赛(IOI)试题
4
相关资源
示范课
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。