首页 > 其他分享 >CodeForces 1827 B Range Sorting

CodeForces 1827 B Range Sorting

时间:2023-05-16 18:33:40浏览次数:47  
标签:typedef Sorting int 1827 mid long Range maxn ll

洛谷传送门

CF 传送门

考虑拆贡献 \(i - 1 \sim i\),发现当 \([1, i - 1]\) 的最大值大于 \([i, n]\) 的最小值时 \(i - 1 \sim i\) 产生 \(1\) 的贡献。

考虑枚举左端点 \(j\),设 \(x = \max\limits_{k=j}^{i-1} a_k\)。设 \(i\) 及 \(i\) 以后第一个 \(< x\) 的数位置是 \(p\),那么右端点 \(\in [p, n]\),贡献系数为 \(n - p + 1\)。

这个容易用单调栈优化至 \(O(n \log n)\),当弹栈时计算贡献即可。

code
// Problem: B2. Range Sorting (Hard Version)
// Contest: Codeforces - Codeforces Round 873 (Div. 1)
// URL: https://codeforces.com/contest/1827/problem/B2
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 300100;
const int logn = 22;

ll n, a[maxn], stk[maxn], top, lg[maxn], f[maxn][logn];

inline ll qmin(int l, int r) {
	int k = lg[r - l + 1];
	return min(f[l][k], f[r - (1 << k) + 1][k]);
}

inline int ask(int i, int x) {
	int l = i + 1, r = n, p = n + 1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (qmin(i + 1, mid) < x) {
			p = mid;
			r = mid - 1;
		} else {
			l = mid + 1;
		}
	}
	return p;
}

void solve() {
	scanf("%lld", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		f[i][0] = a[i];
	}
	for (int j = 1; (1 << j) <= n; ++j) {
		for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
			f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
		}
	}
	for (int i = 2; i <= n; ++i) {
		lg[i] = lg[i >> 1] + 1;
	}
	ll ans = 0;
	top = 0;
	for (int i = 1; i <= n; ++i) {
		while (top && a[stk[top]] < a[i]) {
			ans += (stk[top] - stk[top - 1]) * (n - ask(i, a[stk[top]]) + 1);
			--top;
		}
		ans += stk[top] * (n - i + 1);
		stk[++top] = i;
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,Sorting,int,1827,mid,long,Range,maxn,ll
From: https://www.cnblogs.com/zltzlt-blog/p/17406466.html

相关文章

  • Codeforces 1158E - Strange device(交互)
    一个有点烦的\(8\logn\)的做法。大致想法大家都一样:以\(1\)为根,然后先问出每个点深度,再问出每个点的父亲。首先先用一个log的做法问出树高,具体做法是直接令根节点的\(f\)为二分出的\(mid\),看能否覆盖所有点即可,记最大深度为\(mxdep\)。可以在二分过程中顺带着求出深......
  • D1. Range Sorting (Easy Version)(单调栈+思维)
    题目D1.RangeSorting(EasyVersion)题意给一个整数n和一个数组a[1~n]一次次排序操作的代价是,r-l求把所有子数组,排成有序的最小代价和思路easy版本可以用O(\(n^2\))的算法,我们可以枚举左右端点假设一段的最优排序方法如图任意长度的一段序列排序可能是排序多个子......
  • 3D打印机报错!! {"code":"key243","msg":"Move out of range: 20.852 29.68
    修改配置文件stepper_z的配置终点需要改下,看你热床允许的倾斜度,相对于归零点,负的,最大的值 ......
  • Lagrange Multiplier Method
    LagrangeMultiplierMethod目录LagrangeMultiplierMethodPrerequisiteknowledge-partialderivativesUsageExSummaryTheEndofInequality:"\(\textsf{LagrangeMultiplierMethod}\)"Prerequisiteknowledge-partialderivativesInanutshell:pri......
  • Range Pair Distance Query
    洛谷6778给定一棵\(n\)个点的树,边带权(\(<2^{32}\)),\(q\)次查询\(\sum_{l\lei<j\ler}dis(i,j)\)。其中\(dis(i,j)\)代表点\(i\)到\(j\)的距离。......
  • Python range function All In One
    PythonrangefunctionAllInOnerange函数函数语法range(stop)range(start,stop[,step])参数说明:start:计数从start开始。默认是从0开始。例如range(5)等价于range(0,5)stop:计数到stop结束,但不包括stop。例如:range(0,5)是[0,1,2,3,4]没有......
  • 在计算语义相似度中,我看网上说要加range,我不知道往哪里加?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【王王雪饼】问了一个Python处理语义相似度的问题,这里拿出来给大家分享下。二、实现过程这里【eric】了解到她的原始数据和停用词啥的都在自己的,代码套用的作者的,估计还是会遇到些问题的,如下图所示:后来【甯同学】给了一个......
  • R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析CPI和PPI
    全文链接:http://tecdat.cn/?p=31108最近我们被客户要求撰写关于VAR模型的研究报告,包括一些图形和统计输出。作为衡量通货膨胀的基本指标,消费者价格指数CPI和生产者价格指数PPI的作用关系与传导机制一直是宏观经济研究的核心问题。对此问题的研究显然具有重要的学术价值与现实意......
  • global_size local_size clEnqueueNDRangeKernel OpenCL
    clEnqueueNDRangeKernel填入的形参:global_sizelocal_size global_size控制最终的workgroup数量,而且会平均分配到几个core上,比如global_size=8 然后有2个core,那么每个core分到4个wglocal_size控制每个core分到几个workitem,每个.cl文件里,已经hardcoding了一个workitem计......
  • Mysql Query error: BIGINT UNSIGNED value is out of range in..解决方法(转)
    原文:https://blog.51cto.com/bstdn/19510641、问题当字段类型为unsigned时,使用相关结果为负值时就会报错,报错如下:BIGINTUNSIGNEDvalueisoutofrangein..1.2、解决使用cast()修改字段类型为signedselectcast(quantityassigned)-cast(quantity2assign......