题干:
https://buaacoding.cn/contest-ng/index.html#/334/problems
K
wjj 的自动售货机
时间限制:1000ms 内存限制:131072kb
通过率:14/26 (53.85%)
正确率:14/119 (11.76%)
wjj 最近很看好线下实体销售的行业, 他觉得可以先投资自动售货机来试试水。
于是他在北航的新主楼中安装了一台可以售卖 nn 种物品的售货机, 第 ii 种物品共有 aiai 个。
为了方便用户,用户每次购买时, 可以选定某个区间 [l,r][l,r] 内的种类, 然后自动售货机根据选定的区间进行出货。
记 al,al+1,⋯,ar−1,aral,al+1,⋯,ar−1,ar 非零值中的最小值为 xx, 每种物品会以 xx 个为一组、尽可能多地出货; 即出货后,物品数量 ai←(aimodx),∀i∈[l,r]ai←(aimodx),∀i∈[l,r]。
wjj 最终按顺序记录了 qq 个这样的区间信息。 他希望你能帮他计算,每次出货前和出货后,选定区间内的剩余物品数量的总和; 即分别以每次出货前和出货后的 aiai,计算 ∑ri=lai∑i=lrai。
输入
第一行包含一个正整数 TT(1≤T≤101≤T≤10),表示有 TT 组测试数据。
接下来依次给出每组测试数据。对于每组测试数据:
第一行,包含两个整数 nn 和 qq,含义见题目描述。
第二行,nn 个空格分隔的整数,依次表示序列的每一项。0≤ai≤10130≤ai≤1013(1≤i≤n1≤i≤n)。
接下来 qq 行,每行表示一组询问,格式如下:
1≤L≤R≤n1≤L≤R≤n。
对于所有的测试数据,满足 ∑n,∑q≤2×105∑n,∑q≤2×105。
输出
对于每组数据,对于每个询问,输出空格分隔的两个整数表示答案。
输入样例
1
5 2
5 4 2 2 10
1 5
1 5
输出样例
23 1
1 0
题目大意:
n个数,q次询问,每次询问给出一段区间,找到区间内非零的最小的数x,对该区间的每个数都更新为a[i]取模x,对于每次操作,输出更新前和更新后的区间和。
解题报告:
由于取模运算可以使得改数字最少减小一半(证明很简单),所以对于每个数字最多logn次就降为0,所以对于更新操作可以直接暴力。对于查询最小值,注意一下排除为0的情况就可以了。
AC代码:
#include
#include
#include
#include
#include
WA代码1:
#include
#include
#include
#include
#include
WA代码2::
#include
#include
#include
#include
#include
总结:
WA了好几发,,
首先RE因为没有开四倍。
1WA首先是没有所有的变量都开longlong,后来一个一个变量检查的。
2WA是INF设置的不够大,因为单个数据是1e13,而总共2e5个数,所以最大可能值是2e18,所以保险起见就设置INF为9e18好了。
3WA在求最小值的时候不太对,(也就是WA代码1那样写的)这样会导致只要有一个儿子节点的minn是0,就直接返回0了。
4WA在求最小值的时候不太对,因为这样有可能返回INF,比如左子树的minn是0,右子树的minn是2,那么应该返回 2,但是这样的话就返回INF了。。。
5WA在qSum的时候,,,里面递归竟然写成了qMin。。。我再也不复制粘贴了55555.