#HK5011. 「POI2013 R2」洒水壶 Watering can

「POI2013 R2」洒水壶 Watering can

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++

请在提交源代码前添加 #include "koninc.h"

题目描述

题目译自 XX Olimpiada Informatyczna — II etap Konewka

你被任命为 Bajtolina 女王的园丁,倍感荣幸,对吧?但这份工作的挑战远不止表面光鲜。女王的城堡旁有一座巨大的花园,种植了 nn 棵依次排列的树木。看似简单,但你必须随时向女王汇报哪些树木已经成熟——我们规定,树木高度达到至少 kk 米时即为成熟。

女王不时要求你用魔法洒水壶为某些树木浇水,每次浇水使受影响的树木高度增加正好 11 米。快证明你的能力,迅速回应女王的所有询问吧!

交互方式

你需要编写一个与评测程序交互的库,至少包含以下三个函数,供评测程序调用:

  • inicjuj(n, k, D):此函数在评测开始时调用一次,用于初始化你的数据结构。参数包括树木数量 nn、成熟高度下限 kk 和长度为 nn 的数组 DD,存储每棵树的初始高度。树木编号为 00n1n-1
    • C/C++: void inicjuj(int n, int k, int *D);
    • Pascal: procedure inicjuj(n, k: LongInt; var D: array of LongInt);
  • podlej(a, b):表示女王要求你浇灌从第 aa 棵到第 bb 棵树(包含两端,0abn10 \leq a \leq b \leq n-1)。调用此函数后,这些树木高度各增加 11 米。
    • C/C++: void podlej(int a, int b);
    • Pascal: procedure podlej(a, b: LongInt);
  • dojrzale(a, b):女王询问从第 aa 棵到第 bb 棵树(包含两端,0abn10 \leq a \leq b \leq n-1)中有多少棵树已成熟。
    • C/C++: int dojrzale(int a, int b);
    • Pascal: function dojrzale(a, b: LongInt): LongInt;

你的库不得读取任何数据(包括标准输入或文件),也不得向文件或标准输出写入内容。可向标准错误输出(stderr)写入诊断信息,但需注意这会消耗时间。

若使用 C/C++,库不得包含 main 函数。若使用 Pascal,需提供模块(参考你的磁盘上的示例程序)。

只有当你的库满足上述技术要求并正确回答女王的所有询问时,测试才会得分。

编译与运行

你的库文件(kon.ckon.cppkon.pas)将与评测程序一起编译,使用以下命令:

  • C: gcc -O2 -static -lm kon.c kongrader.c -o kon
  • C++: g++ -O2 -static -lm kon.cpp kongrader.cpp -o kon
  • Pascal:
    ppc386 -O2 -XS -Xt kon.pas
    ppc386 -O2 -XS -Xt kongrader.pas
    mv kongrader kon

样例

调用 结果 解释
inicjuj(4, 6, D) (D[0]=5, D[1]=4, D[2]=3, D[3]=7) 我们有 n=4n=4 棵树,高度分别为 5,4,3,75, 4, 3, 7,而 k=6k=6
dojrzale(2, 3) 1 在区间 [2,3][2, 3] 上有多少棵成熟的树?
podlej(0, 2) 浇灌树 0,1,20, 1, 2
dojrzale(1, 2) 0 在区间 [1,2][1, 2] 上有多少棵成熟的树?
podlej(2, 3) 浇灌树 2,32, 3
podlej(0, 1) 浇灌树 0,10, 1
dojrzale(0, 3) 3 在区间 [0,3][0, 3] 上有多少棵成熟的树?

示例评测程序

「文件」下包含示例评测程序(kongrader.ckongrader.cppkongrader.pas)。要运行评测程序,需将你的库命名为 kon.ckon.cppkon.pas,放入对应目录(ccpppas)。比赛开始时,这些目录包含示例的错误代码。使用以下命令编译评测程序与你的库:

make kon

此命令与「编译与运行」的描述一致。C/C++ 编译需包含 koninc.h 文件,位于对应目录。

编译后的评测程序从标准输入读取输入数据,调用你的库函数,并将结果输出到标准输出。

输入数据格式如下:

第一行包含两个整数 n,kn, k

第二行包含 nn 个整数,表示各树初始高度。

第三行包含一个整数 qq

接下来的 qq 行,每行包含一个字母(pd)和两个非负整数。字母表示调用函数:ppodlejddojrzale;数字为函数参数。函数 inicjuj 在读取前两行后立即调用。注意,示例评测程序不验证输入格式或限制条件。

「文件」下包含文件 kon0.in,对应上述样例运行。使用以下命令运行:

./kon < kon0.in

函数 dojrzale 的结果将输出到标准输出。正确结果在文件 kon0.out 中。

附加样例

  1. n=2000n=2000podlejdojrzale 调用总数为 1000010000,均针对单棵树,初始高度随机从 [1,100][1, 100]k=100k=100
  2. n=100000n=100000,先 100000100000podlej 调用,覆盖所有树,后 100000100000dojrzale 调用,针对单棵树,初始高度随机从 [1,1000][1, 1000]k=100500k=100500

数据范围与提示

对于所有输入数据,满足:

  • 1n3000001 \leq n \leq 300000
  • 1k1091 \leq k \leq 10^9
  • 函数 podlejdojrzale 的总调用次数不超过 300000300000
  • 树木初始高度为不超过 10910^9 的正整数。

对于 20%20\% 的测试数据,n2000n \leq 2000,且 podlejdojrzale 调用总数 10000\leq 10000
对于 70%70\% 的测试数据,所有 podlej 调用先于 dojrzale 调用。