QOJ.ac

QOJ

Memory Limit: 1024 MB Total points: 100 Communication
[+23]

# 4912. WereYouLast

统计

提示:在 QOJ 中评测时,为了检查你是否使用了全局变量,你的程序可能被运行在若干个(至多 4 个)不同的进程中,每次将选择一个进程调用对应的 WereYouLast,不同进程间不能共享全局变量。本题的时间限制(14 秒)指你在所有进程中使用的时间之和,空间限制(1024 MB)指你在每个进程中使用的空间的最大值。

题意更新:T3中“影响”是指,只要某个位置被query或者modify了那么就算被影响了;禁止在WereYouLast中递归调用自己.

特别提醒:由于编译上的问题,请在你的代码前加入如下声明:

bool query(int);
void modify(int,bool);

题目描述

这是一道交互题。

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

bool WereYouLast(int n,int m)

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

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

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

记在第 i 次调用中,你的程序的 query/modify 操作影响到了 cnti 个不同的位置,你需要最小化

C1=max , 在某些测试点中,最小化 C_2 = \max\limits_{i=2}^n cnt_i 也可以获得一定的分值。

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

注意:为了防止过度卡评测,在一次 WereYouLast 的调用中,你不能对同一个位置进行多于 5 次的 query 或者 多于 5 次的 modify ,如果在一次 WereYouLast 的调用中你的程序对一个位置调用了多于 5 次的 query 或者 多于 5 次的 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.1s 以内,空间限制相差在 5MB 以内。

评分标准

每个测试点有固定的 n m 和若干个评分参数 a_1, a_2, \cdots, a_{10} .

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

在完成任务的基础上,

在测试点 1 中, C_1\leq 一个评分参数就会得到 1 分。

在测试点 2 中, C_1\leq 一个评分参数就会得到 1 分,C_2\leq 一个评分参数就会得到 1 分。

在测试点 3 中, C_1\leq 一个评分参数就会得到 2 分,C_2\leq 一个评分参数就会得到 1 分。

在测试点 4 中, C_1\leq 一个评分参数就会得到 2 分,C_2\leq 一个评分参数就会得到 2 分。

时间限制:见表格。

空间限制:1024 MB。

测试点编号 测试点总分 n m a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8 a_9 a_{10} 时间限制
1 10 = 2^{10} =10 10 10 10 10 10 10 10 10 10 10 3s
2 20 = 2^{16} =10^5 14 13 12 11 9 8 7 6 6 4s
3 30 = 2^{20} 5s
4 40 = 2^{26} 14s