首页 > 其他分享 >ABC351_F 题解

ABC351_F 题解

时间:2024-04-27 22:14:05浏览次数:26  
标签:int 题解 ll long ABC351 ans inf define

实际上很板。

考虑在 \(i\) 后小于 \(val_i\) 的数都对答案没贡献,所以我们只需要知道在 \(i\) 后且大于 \(val_i\) 的数的和以及有多少个这样的数就可以了。

知道了我们要求什么,就可以一眼权值线段树。

从后往前扫不断加入数,然后访问对应区间即可,当然因为值域比较大,所以还要离散化。

时间复杂度 \(O(n\log_2n)\)。

因为赛时写的比较急,所以比较丑。

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ull unsigned long long
#define m_p make_pair
#define m_t make_tuple
#define inf 0x7f7f7f7f7f7f7f7f
#define N 500010
using namespace std;
using namespace __gnu_pbds;
ll tr[N << 2], sum[N], A[N];
void build(int k, int l, int r)
{
	if (l == r)
	{
		tr[k] = sum[l];
		return;
	}
	int mid = l + r >> 1;
	build(k << 1, l, mid);
	build(k << 1 | 1, mid + 1, r);
	tr[k] = max(tr[k << 1], tr[k << 1 | 1]);
}
ll tr_a(int k, int l, int r, int x, int y)
{
	if (l > y || r < x)
		return -inf;
	if (l >= x && r <= y)
		return tr[k];
	ll mid = l + r >> 1, ans = -inf;
	if (x <= mid)
		ans = max(ans, tr_a(k << 1, l, mid, x, y));
	if (y > mid)
		ans = max(ans, tr_a(k << 1 | 1, mid + 1, r, x, y));
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n, k, L, R;
	cin >> n >> k >> L >> R;
	for (int i = 1; i <= n; i++)
		cin >> A[i];
	for (int i = 1; i <= n; i++)
		sum[i] = sum[i - 1] + A[i];
	build(1, 1, n);
	vector<ll> q;
	for (int i = 1; i + L - 1 <= n; i++)
		q.push_back(tr_a(1, 1, n, i + L - 1, min(i + R - 1, n)) - sum[i - 1]);
	sort(q.begin(), q.end(), greater<ll>());
	ll ans = 0;
	for (int i = 0; i < k; i++)
		ans +=q[i];
	cout << ans;
	return 0;
}

标签:int,题解,ll,long,ABC351,ans,inf,define
From: https://www.cnblogs.com/wryyy-233/p/18162643

相关文章

  • eclipse 题解
    Statement给定一个圆,圆按照顺时针排布着\(2n\)个点,依次编号为\(1\simn\),其中编号为\(1\simn\)的点属于Alice,编号为\((n+1)\sim2n\)的点属于Bob。同时给出两个长度为\(n\)的序列\(A,B\)。你需要确定一个最大的正整数\(K\),使得存在\(K\)个二元组\((x_i,y_i)\)......
  • 题解:洛谷 P1137 旅行计划
    标签:图论,拓扑,dp题意给定一张\(n\)个点\(m\)条边的DAG,对于每个\(i\),求以它为终点最多经过多少个点?思路由于是DAG,求的是终点\(i\)经过的所有点,而刚好拓扑序就满足这个。那么就可以考虑拓扑排序。设\(f_i\)是以\(i\)为终点的最多结点数,那么就有转移方程\(f_v=m......
  • CF1842H Tenzing and Random Real Numbers 题解
    题目链接点击打开链接题目解法实数的概率好反直觉!对\(1\)做限制不是很好做,考虑变成正负性的限制(即对\(0\)做限制)令\(y_i=x_i-0.5\),那么限制就变成了\(y_i+y_j\le0,\;y_i+y_j\ge0\)这里要给出一些实数概率的结论:实数下,\(x=y\)的概率为\(0\),因为\(\frac{1}{\inft......
  • CAUC_CTF 题解
    caucctfwpez_隐写如果计算机是中国人发明的Welcome!easy_rsafromCrypto.Util.numberimport*importgmpy2importlibnumimportrandomimporthashlibn=0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f7524......
  • [题解]P2015 二叉苹果树
    P2015二叉苹果树树形dp,一般用dfs辅助解决。当我们搜索到\(u\),此时剩下\(cnt\)条边可以用,也就是说\(u\)为根节点的子树最多可以保留\(cnt\)条边。由于上一层的需求,我们显然需要枚举剩余边数\(i\)(\(1\leqi\leqcnt\))。接下来对于每个\(i\),我们考虑剩余的\(u\)条边可以怎么放。......
  • 题解:P10329 [UESTCPC 2024] Add
    Add题意将序列进行一系列的操作,输出对\(a_{1}\)的期望值。题目中操作说的比较明了,再次就不特殊声明了。思路据题意所知,每一个\(n\)应该对应了一个固定的答案。于是我就想到可以打表,就打出了下面的式子。n=1时ans=1n=2时ans=5n=3时ans=14n=4时ans=30n=5时ans=5......
  • vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决
    1、先安装依赖:xlsx、xlsx-style、file-saver三个包npminstallxlsxxlsx-stylefile-saver2、引入:<script>import*asXLSXfrom'xlsx/xlsx.mjs'importXLSX_STYLEfrom'xlsx-style';import{saveAs}from'file-saver';exportdefau......
  • 题解笔记
    P1196银河英雄传说带权并查集(根搭积木很像):对于每个点,分别记录所属链的头结点、该点到头结点的距离以及它所在集合的大小。每次合并将y接在x的尾部,改变y头的权值和所属链的头结点,同时改变x的尾节点。注意:每次查找的时候也要维护每个节点的权值。每次查询时计算两点的权值差。......
  • 「洛谷」题解:P1008 三连击
    题目传送门题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将\(1,2,\ldots,9\)共\(9\)个数分成\(3\)组,分别组成\(3\)个三位数,且使这\(3\)个三位数构成\(1:2:3\)的比例,试求出所有满足条件的......
  • [题解][2021浙江CCPC] Shortest Path Query
    题目描述输入一张无向图,对于无向图的每条边u,v,w,将u和v转换成二进制后,u是v的前缀。给出q次询问,每次输入s,t,求s到t的最短距离。题解从题目数据而言,n为1e5,m为2e5,显然一般的多源最短路算法无法完成。考虑此题的特殊性质:由于边仅可能从u连向以u为前缀的v,那么若建立一颗以1为根的完......