首页 > 其他分享 >CF1550C 题解

CF1550C 题解

时间:2022-08-27 13:24:41浏览次数:91  
标签:return int 题解 long ++ CF1550C 单调

前言

题目传送门!

更好的阅读体验?

比赛时,这题写了一个 \(O(n^3)\) 算法,然后就过了。

以为是数据水,实际上可以证明时间复杂度是 \(O(n)\) 的。

思路

关键是一个结论:当 \(i < j < k\) 时,若 \(a_i, a_j, a_k\) 单调不降或单调不升,则三元组 \((a_i, i), (a_j, j), (a_k, k)\) 必定是坏的。

为什么呢?画个图就很容易理解了。

同理,单调不增也是这样的。

所以,我们利用这一点 \(O(n^2)\) 实现 check 函数。

const int N = 2e5 + 5;
int a[N];
bool chk(int l, int r) // [l,r] 区间是否是坏的
{
	for (int i = l; i < r; i++)
		for (int j = l; j < i; j++) //j<i<r
		{
			if (a[j] <= a[i] && a[i] <= a[r]) return true;
			if (a[j] >= a[i] && a[i] >= a[r]) return true; //符号反过来 
		}
	return false;
}

接着打个尺取,即可在 \(O(n \times n^2)\) 的时间内完成程序。

void solve()
{
	int n;
	long long cnt = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int l = 1, r = 1; r <= n; r++) //顺序枚举右端点,左端点尺取
	{
		for (; l <= r && chk(l, r); l++);
		cnt += (r - l + 1);
	}
	printf("%lld\n", cnt);
}

那为什么可以跑过去呢?原因在于,\(\texttt{check()}\) 函数不会执行这么多次,实际是趋于 \(O(1)\) 的!

画一个图,可以发现,不会有长度大于等于 \(5\) 的好子段。

所以这个方法去掉常数,就是 \(O(n)\) 的。那么就可以欢快地打出代码了。

完整代码

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 2e5 + 5;
int a[N];
bool chk(int l, int r)
{
	for (int i = l; i < r; i++)
		for (int j = l; j < i; j++)
		{
			if (a[j] <= a[i] && a[i] <= a[r]) return true;
			if (a[j] >= a[i] && a[i] >= a[r]) return true; //符号反过来 
		}
	return false;
}
void solve()
{
	int n;
	long long cnt = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int l = 1, r = 1; r <= n; r++)
	{
		for (; l <= r && chk(l, r); l++);
		cnt += (r - l + 1);
	}
	printf("%lld\n", cnt);
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--) solve();
	return 0;
}

希望能帮助到大家!
首发:2022-08-09 07:39:00

标签:return,int,题解,long,++,CF1550C,单调
From: https://www.cnblogs.com/liangbowen/p/16622906.html

相关文章

  • CF1720C 题解
    前言题目传送门!更好的阅读体验?赛时锁题后看别人代码,怎么都和我想法不一样?幸好没有被hack。思路以下把L字形的覆盖网格,直接称为L。贪心思考,我们想让每次L覆盖......
  • CF1720D1 题解
    前言题目传送门!更好的阅读体验?有点思维难度的DP优化题。小知识在做这道题之前,你需要知道:\(x-y,y-x\lex\oplusy\lex+y\)。证明非常简单,利用异或的性......
  • CF1548B 题解
    前言题目传送门!更好的阅读体验?做法:ST表加尺取。思路看到同余,立刻想到作差。我们建立差分数组\(c_i=|a_i-a_{i-1}|\),注意取了绝对值。此时,我们只需在\(c_i\)......
  • CF1715A 题解
    前言题目传送门!更好的阅读体验?赛时瞎胡了个结论,然后就过了。思路Megan从左下角到右上角,至少也得要\((n+m-1)\)步。于是考虑让Stanley少走几步。如图,容易......
  • CF1715C 题解
    前言题目传送门!更好的阅读体验?简单的数学题。思路每次只变一个数,因此考虑在短时间内计算:每个位置的数产生的贡献。容易发现以下的条件:不管\(a_i\)是什么,当它作......
  • CF1715B 题解
    前言题目传送门!更好的阅读体验?看起来挺难,其实一分钟就能想出来。思路首先考虑什么时候无解。由于\(k\times\left\lfloor\dfrac{a}{k}\right\rfloor\lea\le\le......
  • CF1715D 题解
    前言题目传送门!更好的阅读体验?感觉挺不错的一道图论转化题。(其实也和图论关系不大。)思路对于每个条件\(a_u\mida_v=x\),二进制拆掉\(x\)。如果\(x\)的二进制......
  • 「NOI2016」网格 题解
    「NOI2016」网格题解前言感谢zqm学长提供调代码服务!本文中,所有没有特殊说明的连通都是指四连通,相邻都是指上下左右相邻。题目大意有一个$n\timesm$的网格,上......
  • 【IAP Kit】应用内支付订单参数相关问题解析
    ​1、创建的订单orderId长度是多少?答:orderId的长度最大是255。 2、InappPurchaseDetails中orderId和payOrderId有什么区别呢?答:orderId和payOrderId这两者的区别如下:o......
  • 优先队列-多路归并系列题解
    373.查找和最小的K对数字问题描述给定两个以升序排列的整数数组nums1和nums2 , 以及一个整数k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来......