首页 > 其他分享 >C. Least Prefix Sum

C. Least Prefix Sum

时间:2024-07-21 15:51:48浏览次数:12  
标签:pq int Sum Least Prefix sum1 include top define

链接

https://codeforces.com/problemset/problem/1779/C

题目

思路

1-m的前缀和最小。那么显然知道[1,m-1]的前缀和更大,所以a[m]<0,同理a[m-1]+a[m]<0,...,a[2]+...+a[m]<0。采用大根堆优先队列管理其中的值,如果上面的任何一个大于零,弹出优先队列的top,减掉两倍的top,让他重新变成负数即可,然后计数器ans++。对m后半段的序列同理操作

代码

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#define IOS ios::sync_with_stdio(false), cin.tie(0) ,cout.tie(0)
using namespace std;

#define int long long 
const int N = 2e5 + 10;
int a[N];
signed main()
{
	IOS;
	int t; cin >> t;

	while (t--)
	{
		int n, m; cin >> n >> m;
		for (int i = 1; i <= n; i++)cin >> a[i];
		priority_queue<int>pq;
		int sum1 = 0;
		int ans = 0;
		
		for (int i = m; i > 1; i--)
		{
			pq.push(a[i]);
			sum1 += a[i];
			if (sum1 > 0)
			{
				ans++;
				int top = pq.top();
				pq.pop();
				sum1 -= 2 * top;
				pq.push(-top);
			}
		}
		priority_queue<int, vector<int>, greater<int>>pq2;
		sum1 = 0;
		for (int i = m + 1; i <= n; i++)
		{
			pq2.push(a[i]);
			sum1 += a[i];
			if (sum1 < 0)
			{
				ans++;
				int top = pq2.top();
				pq2.pop();
				sum1 -= 2 * top;
				pq.push(-top);
			}
		}
		cout << ans << '\n';
	}

	return 0;
}

标签:pq,int,Sum,Least,Prefix,sum1,include,top,define
From: https://www.cnblogs.com/zzzsacmblog/p/18314559

相关文章

  • [CCPC2022 广东] XOR Sum
    数位dp看到这样求和价值的计算,考虑可不可以交换求和符号或者改变计算方式。这题中的位运算使我们考虑按位计算贡献,价值可以写成:\[f(A)=\sum_{i=0}2^i\timesc_i\times(k-c_i)\]其中\(c_i\)表示第\(i\)位上为\(1\)的\(a_i\)数量。题目第二个要求即\(f(A)=n\)。考......
  • LLM基础模型系列:Prefix-Tuning
    ------->更多内容,请移步“鲁班秘笈”!!<------PrefixTuning和PromptTuning最大的区别就是向每层的TransformerBlock添加可训练的张量,而上一期的PromptTuning只是在输入的时候添加。此外,通过全连接层(具有两层的迷你MLP和介于两者之间的非线性激活函数)来进行桥接。下图左侧......
  • A. Sum of Three
    原题链接题解要让abc不同,我们可以先固定ab取两个较小值,然后看看最大的c有没有重复code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voidsolve(){intn;cin>>n;if(n<7){cout<<"NO\n";return;}......
  • A. Least Product
    原题链接题解1.如果初始乘起来小于等于0,由于操作无法使该乘积更小,所以不用再修改2.否则代表初始值大于零,随便找一个地方改成03.注意由于a很大,所以要用统计的方式来判断乘积的性质code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voidsolve(){......
  • SMU Summer 2024 Contest Round 5
    SMUSummer2024ContestRound5RobotTakahashi思路按照Wi......
  • SMU Summer 2024 Contest Round 5
    ARobotTakahashi思路:将所有数排序,枚举孩子成人的分解点X,同时根据s的标识维护正真的孩子成人的个数voidsolve(){intn;cin>>n;strings;cin>>s;intsum=0;for(inti=0;i<s.size();++i){if(s[i]=='1')sum++;......
  • D. Maximum Sum of Products
    链接https://codeforces.com/problemset/problem/1519/D题目分析总的来说不算难的一道题,主要是敢写就行,控制在O(n^2),枚举中心点,分成两类:一类是奇数,一类是偶数对称就行。代码#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<algorithm>#in......
  • 题解:CF1381A1 Prefix Flip (Easy Version)
    思路这道题直接用下一题的代码就行了\(C1\):注意到限制\(3n\)很大,于是看每一位是不是一样的,再操作,如样例一:转化第一位:\(01\to11\)。转化第二位:\(11\to00\to10\)。每次把当前位子提到第一位,然后翻转第一位,最后翻转回去,最多\(3n\)次,不用暴力操作直接计答案时间复杂度......
  • java8四个函数式接口:Function, Predicate, Consumer, Supplier使用
    目录1、前言2. 四大函数式接口1.Function,>2.Predicate 3.Consumer4.Supplier1、前言Java8引入了一种新的接口特性,叫做函数式接口。这种接口只能有一个抽象方法,通常用注解@FunctionalInterface标识。函数式接口可以被隐式地转换为lambda表达式。以下是一个......
  • SMU Summer 2024 Contest Round 4
    1.HandV原题链接:http://162.14.124.219/contest/1008/problem/B二进制枚举行列即可查看代码#include<bits/stdc++.h>#defineintlonglong#definePIIpair<int,int>usingnamespacestd;intn,m,k;chara[10][10];signedmain(){ios::sync_with_stdio(fals......