1. 输入1 x,代表所有数加x。
2. 输入2 x,代表所有数减x,同时将所有的负数变成0。即对于每个
游游在操作结束后,希望你能告诉她所有数之和,答案对
第一行输入两个正整数和
,代表数组长度以及操作次数。
第二行输入个正整数
。代表初始的数组。
接下来的行,每行输入两个正整数
和
。其中op代表操作类型。
操作结束后所有数之和对取模的值。
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; } }