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]
因为排序后,一旦某个数字在某次操作后小于等于0,那么他之前的数字都和他一样会变成0。因此设置两个变量acc0
和acc
,分别代表那些曾经变为0的数字要加的值和从来没有变为过0的数字要加上的值。
from bisect import bisect_right n, k = map(int, input().split()) a = list(map(int, input().split())) tmpa = a.copy() a.sort() acc = 0 accfor0 = 0 for _ in range(k): op, x = map(int, input().split()) if op == 1: acc += x accfor0 += x else: acc -= x accfor0 = max(0, accfor0 - x) if acc < 0: idx = bisect_right(tmpa, -acc) tmpa = tmpa[idx:] MOD = 10 ** 9 + 7 num1 = len(tmpa) num0 = n - num1 ans = accfor0 * num0 ans += sum(n + acc for n in tmpa) print(ans % MOD)
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; int main() { const int MOD = 1000000007; int n, k, op, x; cin >> n >> k; vector<ll> a(n); vector<ll> diff(n); // 差分数组 ll p = n, val; // 记录被变成 0 的位置,及其对应的值 for(int i = 0; i < n; ++i) { cin >> a[i]; } sort(a.begin(), a.end(), greater<ll>()); val = a[n - 1]; diff[0] = a[0]; for (int i = 1; i < n; ++i) diff[i] = a[i] - a[i - 1]; for (int i = 0; i < k; ++i) { cin >> op >> x; // op 1 if (op == 1) { diff[0] += x; val += x; } // op 2 else if (op == 2) { diff[0] -= x; val -= x; while (p > 0 && val < 0) { val -= diff[--p]; if (val > 0) val = 0; } if (p == 0 && val < 0) diff[0] = 0, val = 0; } } ll ans = diff[0], cnt = diff[0]; if (p == 0) ans = (val % MOD)* n; else { for (int i = 1; i < p; ++i) { cnt += diff[i]; ans += cnt; ans %= MOD; } ans += (n - p) * val; } ans %= MOD; printf("%lld", ans); return 0; }
nk = list(map(int, input().split())) # 获取数组 my_list = list(map(int, input().split())) # 经过我缜密的分析,数据只有两种情况,要么比基准线高,要么比基准线低, # 基准线及对应值 ji = 1 number = 1 # 计算基准线对应值 for _ in range(nk[1]): op_x = list(map(int, input().split())) if op_x[0] == 1: number += op_x[1] else: number -= op_x[1] if number < 0: # 上调基准值 ji -= number number = 0 # 计算和 my_sum = number * len(my_list) my_sum += sum(item - ji for item in my_list if item > ji) print(my_sum % (10**9 + 7))
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const lines = [] rl.on('line', function (line) { lines.push(line) const [n, k] = lines[0].split(' ').map(Number) if (lines.length === k + 2) { const arr = lines[1].split(' ').map(Number) let add = 0, sub = 0 for (let i = 2; i < lines.length; i++) { const [op, x] = lines[i].split(' ').map(Number) if (op === 1) add += x else { if (x > add) { sub += x - add add = 0 } else add -= x } } let sum = 0 for (let i = 0; i < arr.length; i++) { arr[i] = Math.max(arr[i] - sub,0) sum = (sum + arr[i] + add) % 1000000007 } console.log(sum) } });
#include <bits/stdc++.h> using namespace std; using in = __int128; const int MOD = 1e9 + 7; vector<long long> f , ops; int n , k ; bool check(int c){ long long sum = f[c] ; for(long long i : ops){ sum += i; if (sum < 0){ return true; } } return false; } int main() { long long res = 0, opsum = 0; cin>> n >> k ; for(int i = 0 ; i < n ; i ++){ int tp; cin>> tp ; f.push_back(tp); } sort(f.begin(),f.end()); int preop = 0; for(int i = 0 ; i < k ; i ++){ int op, x; cin>> op >> x ; if(op == 2){ x = -x; } ops.push_back(x); opsum = (x + opsum)%MOD; } // 找到 在操作过程中,所有不会变为负数的部分,另一部分则代表,在操作过程中会产生负数 long long left = 0, right = n-1; while(left < right){ int mid = (left + right) /2; if(check(mid)){ left = mid + 1; }else { right = mid -1; } } // 此时 找到left,代表left右边所有的数,在操作过程中不会产生小于0的情况 for(int i = left + 1; i < n ; i ++){ res = (f[i] + res)%MOD ; } res = (res%MOD + (opsum * (n - left - 1) )%MOD)%MOD ; // 此时左边的数,最终都会相等 // 这里要用 128位 不然会爆炸 in left_sum = f[left] ; for(long long o : ops){ left_sum = (left_sum + o) ; left_sum = max( (in)0 , left_sum); } res = res%MOD + ((left + 1) * left_sum%MOD)%MOD; cout<<res%MOD<<endl; }
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; } }