首页 > 试题广场 >

游游的整数操作

[编程题]游游的整数操作
  • 热度指数:858 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
游游拿到了一个数组,她有两种操作;
1. 输入1 x,代表所有数加x。
2. 输入2 x,代表所有数减x,同时将所有的负数变成0。即对于每个a_i,把a_i变成max(a_i-x,0)

游游在操作结束后,希望你能告诉她所有数之和,答案对10^9+7取模。

输入描述:
第一行输入两个正整数nk,代表数组长度以及操作次数。
第二行输入n个正整数a_i。代表初始的数组。
接下来的k行,每行输入两个正整数opx。其中op代表操作类型。
1\leq n,k \leq 10^5
1\leq x,a_i \leq 10^9
1\leq op \leq 2


输出描述:
操作结束后所有数之和对10^9+7取模的值。
示例1

输入

5 2
1 2 3 4 5
2 2
1 1

输出

11

说明

第一次操作后,数组变成 [0,0,1,2,3]
第二次操作后,数组变成 [1,1,2,3,4]
import java.io.*;
import java.util.*;

public class Main {
    static long[] nums,op;
    static boolean check(int p){
        long ans=nums[p];
        for(int i=0;i<op.length;i++){
            ans+=op[i];
            if(ans<=0)
                return false;
        }
        return true;
    }
    public static void main(String[] args) {
        FastReader in = new FastReader();
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        int n=in.nextInt(),k=in.nextInt(),mod=(int)1e9+7;
        long res=0,sum=0;
        nums=new long[n];
        op=new long[k];
        for(int i=0;i<n;i++){
            nums[i]=in.nextInt();
        }
        for(int i=0;i<k;i++){
            int c=in.nextInt();
            if(c==2)
                c=-1;
            else
                c=1;
            op[i]=c*in.nextInt();
            sum+=op[i];
            sum%=mod;
        }
        Arrays.sort(nums);
        int l=0,r=n-1,mid=0,left=n;
        while(l<=r){
            mid=l+(r-l)/2;
            if(check(mid)){
                left=mid;
                r=mid-1;
            }
            else{
                l=mid+1;
            }
        }
        for(int i=left;i<n;i++){
            res+=nums[i];
            res%=mod;
        }
        res+=(long)(n-left)*sum%mod;
        if(left>=1){
            long ans=nums[left-1];
            for(int i=0;i<op.length;i++){
                ans+=op[i];
                if(ans<0)
                    ans=0;
            }
            res+=ans%mod*left;
        }
        res%=mod;
        out.println(res%mod);
        out.flush();
    }
}

class FastReader {
    StringTokenizer st;
    BufferedReader br;

    public FastReader() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    String next() {
        while (st == null || !st.hasMoreElements()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return st.nextToken();
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    double nextDouble() {
        return Double.parseDouble(next());
    }

    String nextLine() {
        String str = "";
        try {
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

}

发表于 2023-07-11 16:15:21 回复(2)