拿到了一个数组,她有两种操作;
1. 输入1 x,代表所有数加x。
2. 输入2 x,代表所有数减x,如果数组元素小于x,就取0;
在操作结束后,希望你能告诉她所有数之和,答案对10的9次方+7取模。
public class Main {
private final static int mod = (int) Math.pow(10, 9) + 7;
;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
long count = 0;
int n = in.nextInt();
int k = in.nextInt();
int index = 0;
long num[] = new long[n];
int len = 0;
int opx[] = new int[k];
// 初始化数据 记录操作数组 转换为正负操作
while (in.hasNextInt()) {
if (index < n) {
num[index++] = in.nextInt();
} else {
int b = in.nextInt();
if (b == 1) {
opx[len] = in.nextInt();
} else {
opx[len] = -in.nextInt();
}
len++;
}
}
long add = 0;
long sub = 0;
long current = 0;
//模拟0在被加和被减的过程中,sub是过载的,add是最后的数据,因为如果在过程中有一回没抗住过载了,就是0,这个数到后面必然是add
//统一对操作数组进行替换 对于一个数 如果 前面的操作大于0 则可以把前面那一步操作和后面的操作加起来 ,按这个推 ,最后一定只剩下 一次减 和一次加
for (int i = 0; i < opx.length; i++) {
//操作一下(加或减)
//减数只记录过载的,并记为复数,方便后面看看数组元素够不够过载
current = (current + opx[i]);
//如果是减,减一下如果为0
if (opx[i] < -current) {
//减数+current
sub = (sub + current);
current = 0;
//如果没减到0就相当于加一个Nums【i】-opx【i】
}
//加数=current
add = current;
}
//遍历数组 如果这个数比总的减去的值还大 那么不为0 所以加起来,如果小于那么肯定为0直接等于最后操作的正数
for (int i = 0; i < n; i++) {
if (num[i] > -sub) {
//够过载的
num[i] = num[i] + add + sub;
} else {
//不够过载
num[i] = add;
}
count = (count + num[i]) % mod;
}
System.out.println(count);
}
}