#L3649. 「2021 集训队互测」WereYouLast

    ID: 4536 传统题 1000ms 256MiB 尝试: 18 已通过: 1 难度: 10 上传者: 标签>其他构造线性代数位运算难度NOI/NOI+集训队互测交互题

「2021 集训队互测」WereYouLast

注意事项

由于编译上的问题,请在你的代码前加入如下语句:

#include "wereyoulast.h"

「影响」是指,只要某个位置被 query 或者 modify 了那么就算被影响了;禁止在 WereYouLast 中递归调用自己。

题目描述

这是一道交互题。

在本题中,你不需要实现主函数。你需要实现一个函数

bool WereYouLast(int n, int m)

这个函数会被调用恰好 nn 次,你需要正确地返回这是否是最后一次调用。

交互库会为你的程序提供 mm 个全局 bool 存储单元,它们的编号为 1,2,,m1,2,\dots, m,初始时的值为 False。你的程序可以调用如下函数:

  • bool query(int pos):该函数会返回第 pospos 个存储单元的值。
  • void modify(int pos, bool v):该函数会将第 pospos 个存储单元的值修改为 vv

记在第 ii 次调用中,你的程序的 query/modify 操作影响到了 cnticnt_i 个不同的位置,你需要最小化 C1=maxi=1ncntiC_1 = \max \limits _{i=1} ^ n cnt_i,在某些测试点中,最小化 C2=maxi=2ncntiC_2 = \max \limits _{i=2} ^ n cnt_i 也可以获得一定的分值。

注意:你的程序不能以任何自定义的形式在多次调用之间交换信息,这些被禁止的形式包括但不限于使用全局变量(允许当常量用的全局变量(即,你没有通过修改全局变量来传递信息)),或是含有 static 关键词的变量。禁止任意形式的攻击交互库,这些被禁止的形式包括但不限于修改交互库中的全局变量,或者在代码中使用主函数。得分程序可能会被人工检查,选手也可以对进行被禁止行为的程序进行申诉,若行为属实,将取消对应程序在本题的成绩。

注意:为了防止过度卡评测,在一次 WereYouLast 的调用中,你不能对同一个位置进行多于 55 次的 query 或者多于 55 次的 modify,如果在一次 WereYouLast 的调用中你的程序对一个位置调用了多于 55 次的 query 或者多于 55 次的 modify,超出上限的操作将会被判为 Invalid Operation,你的程序会被判为 Wrong Answer。

输入格式

可执行文件从标准输入中读取数据。

输入包含一行两个整数 n,mn, m 表示程序调用次数,和全局存储单元的个数。

如何测试你的程序

下发文件中包含一个参考程序 sample.cpp。

下发样例交互库 grader.cpp,设你的代码叫做 code.cpp 你可以采用如下命令进行编译:

g++ code.cpp -o code grader.cpp -O2 -std=c++11

你不能通过更改交互库得分。

你可以认为,最终测试的交互库与样例交互库的运行时间相差在 0.1s0.1\,\mathrm{s} 以内,空间限制相差在 5MB5\,\mathrm{MB} 以内。

评分标准

每个测试点有固定的 n,mn, m 和若干个评分参数 a1,a2,a10a_1,a_2,\dots a_{10}

如果你的程序不能正确地完成任务,你将得到 00 分。

在完成任务的基础上,

  • 在测试点 1 中,C1C_1\leq 一个评分参数就会得到 11 分。
  • 在测试点 2 中,C1C_1\leq 一个评分参数就会得到 11 分,C2C_2\leq 一个评分参数就会得到 11 分。
  • 在测试点 3 中,C1C_1\leq 一个评分参数就会得到 22 分,C2C_2\leq 一个评分参数就会得到 11 分。
  • 在测试点 4 中,C1C_1\leq 一个评分参数就会得到 22 分,C2C_2\leq 一个评分参数就会得到 22 分。

数据范围

测试点编号 测试点总分 nn mm a1a_1 a2a_2 a3a_3 a4a_4 a5a_5 a6a_6 a7a_7 a8a_8 a9a_9 a10a_{10}
1 10 =210=2^{10} =10=10 10
2 20 =216=2^{16} =105=10^5 14 13 12 11 1010 9 8 7 6
3 30 =220=2^{20}
4 40 =226=2^{26}