首页 > 试题广场 >

小苯的数组查询(二)

[编程题]小苯的数组查询(二)
  • 热度指数:10 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小苯有一个长度为 n 的数组 a,他希望在 a 上处理一些操作,具体如下:

\bulleta 中所有奇数都加上 x
\bulleta 中所有偶数都加上 x
\bullet 查询数组 a 中所有数字的和。

请你帮他处理所有的操作吧。

输入描述:
输入包含 q + 2 行。
第一行两个正整数 n, q\ (1 \leq n, q \leq 200000),表示数组的长度,和操作的个数。
第二行 n 个正整数 a_i\ (1 \leq a_i \leq 10^5),表示数组的元素值。
接下来 q 行,每行一个操作,格式为:1\ x\ y 或 2 (1 \leq x \leq 2, 1 \leq y \leq 10^5) 。
\bullet 如果 op = 1,则表示修改操作,如果 x = 1,则表示将所有值奇数的数字都加上 y,否则 x=2 表示将所有值为偶数的数字都加上 y
\bullet 如果 op = 2,则表示查询操作,查询数组 a 中所有数字的总和。


输出描述:
输出包含若干行。
对于每个 op = 2 的询问,做出对应的回答。
示例1

输入

3 4
1 2 3
1 1 2
2
1 2 1
2

输出

10
11

说明

一开始数组为 [1,2,3]
执行完第一次修改操作(给所有奇数加上 2 )后变成:[3, 2, 5]
此时进行第一次查询,数组总和为:3 + 2 + 5 = 10,因此输出 10
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt() , q = in.nextInt();
        int [] arr = new int [n];
        int ji = 0 ,ou = 0;
        long sum = 0;
        for(int i = 0 ; i < n ; i++) {
            int num = in.nextInt();
            arr[i] = num;
            if(num % 2 == 0) ou++;
            else ji++;
            sum += num;
        }
        for(int i = 0;  i < q ; i++){
            int word = in.nextInt();
            if(word == 1){
               int x = in.nextInt();
               int y = in.nextInt();
               if(x == 1){ 
                    sum += 1L * y * ji;
                    if(y % 2 != 0) {
                       ou += ji;
                       ji = 0;
                    } 
               }else if(x == 2){
                    sum += 1L * y * ou;
                    if(y % 2 != 0){
                       ji += ou;
                       ou = 0; 
                    }
               }
            }else if(word == 2){
                System.out.println(sum);
            }
        }
    }
}

发表于 2025-06-29 20:36:34 回复(0)