UOJ Logo Universal Online Judge

UOJ

#232. 【IOI2015】Horses

附件下载 统计

像他的祖先一样,Mansur 喜欢繁殖马匹。目前,他拥有哈萨克斯坦最大的马场。以前情况可不是这样,N 年前 Mansur 年轻时,他只拥有一匹马,但他一直梦想着成为富豪,最终,他美梦成真。

按照时间的先后顺序将年份编号为 0N1(即 N1 年是最近的一年)。每年的天气会影响马匹的繁殖。Mansur 用一个正整数 X[i] 记录第 i 年的繁殖系数,如果第 i 年开始时有 h 匹马,那么这一年结束时有 hX[i] 匹马。

每年,只有年底的时候可以出售马匹。Mansur 用一个正整数 Y[i] 记录第 i 年末卖出一匹马的售价。Mansur 可以卖出任意多匹马,每匹售价均为 Y[i]

现在,Mansur 想知道如果在 N 年中,他总能在最佳时间出售马匹,他能获得的最大收益是多少?你正好在 Mansur 家做客,所以他想请你帮他回答这个问题。

Mansur 对记录下的 XY 做了 M 次更新,每次更新,Mansur 要么改变一个 X[i],要么改变一个 Y[i]。每次更新后,他都会问你出售马匹能获得的最大收益。Mansur 的更新是累加的,即你的每个回答时都应该考虑之前的所有更新。注意:某个 X[i] 或者 Y[i] 可能会被更新多次。

对于 Mansur 的问题,实际的答案可能是一个非常大的数字,你只要给出实际答案模 109+7 后的结果即可。

N=3XY 如下所示:

0 1 2
X213
Y341

上述情况下,Mansur 在 1 年末卖掉他的马可以获得最大收益。具体说明如下:

  • 起初,Mansur 有 1 匹马。
  • 0 年末,他有 1X[0]=2 匹马。
  • 1 年末,他有 2X[1]=2 匹马。
  • 1 年末,他卖掉 2 匹马,总收益是 2Y[1]=8

然后,设 M=1:将 Y[1] 更新为 2,更新后的信息如下:

0 1 2
X213
Y321

这种情况下,一种获得最大收益的方案是 0 年末卖掉 1 匹马,然后 2 年末卖掉 3 匹马。整个过程说明如下:

  • 起初,Mansur 有1匹马。
  • 0 年末,他有 1X[0]=2 匹马。
  • 0 年末,他卖掉 1 匹马,获益 Y[0]=3,于是他只剩下 1 匹马。
  • 1 年末,他有 1X[1]=1 匹马。
  • 2 年末,他有 1X[2]=3 匹马。
  • 2 年末,他卖掉 3 匹马,获益 3Y[2]=3,总收益是 3+3=6

任务

给定 N,X,Y 和一系列更新操作。第一次更新前和每次更新后,计算 Mansur 可以获得的最大收益(注意:给出实际最大收益模 109+7 后的结果)。你需要实现函数 init, updateX 和 updateY。

  • init(N, X, Y) — grader首先调用此函数恰好一次。
    • N: 表示总共有 N 年。
    • X: 长度为 N 的数组,对 0iN1X[i] 表示 i 年的繁殖系数。
    • Y: 长度为 N 的数组,对 0iN1Y[i] 表示 i 年末出售一匹马的价格。
    • 注意:X、Y均为Mansur给定的初值(更新前的值)。
    • init 函数结束后,数组 X 和 Y 仍然有效,你可以随意修改这两个数组的内容。
    • 该函数返回初始状态下,Mansur 获得的最大收益模 109+7 后的值。
  • updateX(pos, val)
    • pos: 一个整数,范围是 0,,N1
    • val: X[pos] 更新后的值。
    • 该函数返回这次更新后Mansur获得的最大收益模 109+7 的值。
  • updateY(pos, val)
    • pos: 一个整数,范围是 0,,N1
    • val: Y[pos] 更新后的值。
    • 该函数返回这次更新后Mansur获得的最大收益模 109+7 的值。

X[i]Y[i] 的初值以及更新后值范围均为 [1,109]。 调用 init 后,grader 会调用 updateX 和 updateY 若干次,调用 updateX 和 updateY 的总次数是 M

子任务

子任务 分值 N M 限制
1171N10M=0X[i],Y[i]10,X[0]X[1]X[N1]1000
2171N10000M1000
3201N5000000M100000调用 init 时的 X[i]2, 且 updateX 调用时的 val2
4231N5000000M10000
5231N5000000M100000

实现细节

你只能提交一个源文件实现如上所述的 init, updateX和updateY 函数,并且遵循下面的命名和接口。你需要包含头文件 horses.h。

int init(int N, int X[], int Y[]);
int updateX(int pos, int val);
int updateY(int pos, int val);

评测方式

评测系统将读入如下格式的输入数据:

  • 1 行:N
  • 2 行:X[0]X[N1]
  • 3 行:Y[0]Y[N1]
  • 4 行:M
  • 5,M+4 行:每行 3 个数字 type pos val(type = 1 表示 updateX,type = 2 表示 updateY)

评测系统将打印 init 的返回值,以及所有调用 updateX 和 updateY 后的返回值。

交互式类型的题目怎么本地测试

时间限制:2s

空间限制:512MB

下载

样例及测评库下载