题目描述
这是一道交互题。
二维平面上初始有 n 个点 (i,pi),每个点有权值 di,0≤i<n;
共 m 次操作,操作编号为 0 到 m−1,按编号升序执行;
编号为 w 的操作给出 x1,x2,y1,y2,满足 0<x1<x2<n,0<y1<y2<n。
一个点 (x,y) 的网格坐标被定义为 ([x≥x1]+[x≥x2],[y≥y1]+[y≥y2])。
依次进行以下步骤:
- 查询网格坐标为 (X,Y) 的点的权值之和,记录在 ans[X][Y]。
- 对每个网格坐标为 (X,Y) 的点,进行修改 o[X][Y]。
- 所有点的坐标同时发生改变,对于一个网格坐标为 (X,Y) 的点,它的坐标从 (x,y) 变为 (x+dx[X],y+dy[Y]);
其中
dx[0]=0,dx[1]=n−x2,dx[2]=x1−x2。
dy[0]=0,dy[1]=n−y2,dy[2]=y1−y2。
x1,x2,y1,y2,o,ans 都是数组,下标对应操作的编号。
其中 di 属于抽象的数据类型 D,o[X][Y] 属于抽象的数据类型 O;
D 上定义了抽象的运算 +:D×D→D;
D,O 上定义了抽象的运算 ⋅:O×D→D;
O 上定义了抽象的运算 ⋅:O×O→O;
ϵD 是 D 中的一个特殊的元素,称为单位元;
ϵO 是 O 中的一个特殊的元素,称为单位元;
这些操作满足性质:
对任意 a,b,c∈D,有 a+b=b+a,(a+b)+c=a+(b+c),a+ϵD=ϵD+a=a;
对任意 u,v,w∈O,有(u⋅v)⋅w=u⋅(v⋅w),u⋅ϵO=ϵO⋅u=u;
对任意 u,v∈O,a,b∈D,有(u⋅v)⋅a=u⋅(v⋅a),u⋅(a+b)=(u⋅a)+(u⋅b),ϵO⋅a=a,u⋅ϵD=ϵD;
执行每次 + 或 ⋅ 运算有一定的代价,具体地,在计算 a+b 或 a⋅b 时如果 a,b 都不是 ϵD 或 ϵO,则代价为 1,否则代价为 0。你需要保证每个答案正确,且总代价不能超过当前子任务的代价上限。
实现细节
头文件中定义了数据类型 Data
(D)和 Operation
(O),你可以使用以下已定义的成员函数对类型为 Data
和 Operation
的数据进行操作:
w.add(a)
计算 w+a,并将结果保存在 w,每次调用的代价在 w,a 都不是单位元时为 1,否则为 0;
w.add(a,b)
计算 a+b,并将结果保存在 w,每次调用的代价在 a,b 都不是单位元时为 1,否则为 0;
w.clr()
可以将 ϵD 保存在 w,每次调用的代价为 0;
w.empty()
判断 w 是否为 ϵD,若是则返回 true,否则返回 false,每次调用的代价为 0;
w.apply(a)
计算 w⋅a,并将结果保存在 a,每次调用的代价在 w,a 都不是单位元时为 1,否则为 0;
w.apply(u)
计算 w⋅u,并将结果保存在 u,每次调用的代价在 w,u 都不是单位元时为 1,否则为 0;
w.print()
可以将 ϵO 存储在 w,每次调用的代价为 0;
w.empty()
判断 w 是否为 ϵO,若是则返回 true,否则返回 false,每次调用的代价为 0;
另外,你还可以使用 Data
或 Operation
类型的赋值运算符、拷贝构造函数或无参构造函数,以 Data
类型为例:
w=u
可以将 u 复制一份存储在 w,每次调用的代价为 0;
Data w(u);
或 Data w=u;
可以将 u 复制一份存储在新定义的 w,每次调用的代价为 0;
Data w;
可以将 ϵD 存储在新定义的 w,代价为 0;
Operation w;
可以将 ϵO 存储在新定义的 w,代价为 0;
除了以上描述的对 Data
或 Operation
的操作外,其余操作根据情况可能被视为攻击评测系统。
sizeof(Data)
和 sizeof(Operation)
都不超过 64,此外交互库还需要不超过 64MB 的空间。时间和空间限制包括交互库使用的时间和空间。仅使用赋值、构造函数、apply
和 add
就可以写出正确的程序,其它函数可能可以提供便利。
你需要实现以下函数:
- n:点的个数;
- m:操作的个数;
- p:(i,p[i]) 表示每个点的坐标,0≤i<n;
- d:d[i] 表示每个点的初始权值,0≤i<n;
- x1,x2,y1,y2,o,ans:x1[i],y1[i],x2[i],y2[i],o[i] 表示每次操作的输入,你需要将相应的答案存储到 ans[i],0≤i<m。
为了您的方便,这里提供模板。请完善以下代码:
由于洛谷的交互方法比较奇怪,所以提交的时候需要把本地的代码复制过来,放在这个 solve 函数这里,和前面的 HEADER 一起提交。提交时不引用 "data.h" 头文件。
输入格式
下发的交互库以如下格式读取输入数据:
- 第一行:n
- 接下来 n 行:pidi(di 由两个整数表示)
- 第 n+2 行:m
- 接下来 m 行:x1ix2iy1iy2ioi(oi 由 9×4 个整数表示)
D 中的元素是 2×1 的矩阵,O 中元素是 2×2 的矩阵,矩阵中的元素是对 232 取模的整数;
+ 对应矩阵加法,⋅ 对应矩阵乘法,具体可以参考下发的交互库的实现;
实际评测环境中输入输出格式以及 D,O 等可能有不同的定义;
输出格式
下发的交互库以如下格式打印你的答案:
- 对每个询问,输出 13 行,其中第 1,2,3,5,6,7,9,10,11 行有两个整数,依次表示这次询问对应的ans[0][0],ans[0][1],ans[0][2],ans[1][0],ans[1][1],ans[1][2],ans[2][0],ans[2][1],ans[2][2],其余为空行;
- 向 stderr 打印总代价,以及在总代价超过代价上限时进行提示。
提示
Idea:ccz181078,Solution:ccz181078,Code:ccz181078,Data:ccz181078
Special thanks:w33z8kqrqk8zzzx33 修改交互库使得能在洛谷上运行。
对于 100% 的数据,满足 n≤105,m≤2×104。
共 10 组数据,满足 n=105;
每组数据的 m 分别为 10,100,1000,2000,5000,10000,12500,15000,17500,20000;
所有数据的代价上限为 108。
每组数据对应 10 分。