科大讯飞测开第二题 蹲题解 oc60%

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    // 给出一个长度为n的数组a,下标从1开始,q次询问,每次询问给两个区间,先让第一个区间的元素x2,
    // 再让第二个区间的元素x2,输出操作后数组目标总和
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int q = in.nextInt();
        int[] nn = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            nn[i] = in.nextInt();
            nn[i] += nn[i - 1] ;
            //System.out.print(nn[i]+" ");
        }
        //System.out.println("??");
while (q > 0) {
            q--;
            int l1 = in.nextInt();
            int r1 = in.nextInt();
            int l2 = in.nextInt();
            int r2 = in.nextInt();

if ((l1 >= l2 && l1 <= r2) || (r1 >= l2 && r1 <= r2) || (l2 >= l1 &&
                    r1 <= r1) || (r2 >= l1 && r2 <= r1)) {
                int left = Math.min(l1, l2);
                int right = Math.max(r1, r2);

                int ll = Math.max(l1, l2);
                int rr = Math.min(r1, r2);

                int res = nn[left - 1] + nn[n] - nn[right] + (nn[ll - 1] - nn[left - 1]) * 2 +
                          (nn[right] - nn[rr]) * 2 + (nn[rr] - nn[ll - 1]) * 4;
                System.out.println(res);
            } else {
if (l1 > l2) {
                    int tl = l1;
                    int tr = r1;
                    l1 = l2;
                    r1 = r2;
                    l2 = tl;
                    r2 = tr;
                }
                int res = nn[l1 - 1] + (nn[r1] - nn[l1 - 1]) * 2 + nn[l2 - 1] - nn[r1] +
                          (nn[r2] - nn[l2 - 1]) * 2 + nn[n] - nn[r2];
                System.out.println(res);
            }

        }
    }
}
全部评论
存一个前缀和数组就行了,额外多判断一下重叠的情况
点赞 回复 分享
发布于 2024-09-28 20:41 江苏
Scanner过不了,要换成BufferedReader
点赞 回复 分享
发布于 2024-09-28 20:45 河南
前缀和+快读 快写
点赞 回复 分享
发布于 2024-09-28 21:01 湖南

相关推荐

昨天 10:35
已编辑
西安科技大学 后端
点赞 评论 收藏
分享
2024-12-21 01:36
电子科技大学 Java
牛客850385388号:员工福利查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务