首页 > 其他分享 >CF1270B - Interesting Subarray | 思维

CF1270B - Interesting Subarray | 思维

时间:2024-03-26 16:59:51浏览次数:28  
标签:min int Interesting NO cdots max CF1270B Subarray include

links

给出一个长度为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\) ,求一子段 \(a_l, a_{l + 1}, a_{l + 2}, \cdots, a_{r - 1}, a_r\) ,满足 \(\max\{a_l,\cdots,a_r\} - \min\{a_l,\cdots,a_r\} \geq r - l + 1\)。若有多个,输出任意一个子段的左右端点即可。若不存在,输出NO
\(n \leq 2 \times 10 ^ 5\)

虽然做出来了,但做复杂了。所以又没有完全做出来(

当时想的是直接把 \(\max - \min\) 的条件改成 \(a_r - a_l\) ,然后再找。因为最优的情况必然是一端为 \(\min\) 另一端为 \(\max\) 。然后忘记考虑 \(a_l - a_r\) 的情况还 WA 了一发。

后来讲题的时候,说先考虑相邻两个是否有合适的,如果有就有了。如果没有,说明相邻两个的差值不超过 \(1\) ,那么随着子段的延伸,\(\max - \min\) 永远追不上子段长度,就肯定是 NO 了。

很妙,可惜我错过了,很多事情,错过一次,就没有第二次了。

先从局部着手,考虑动态的变化。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
	using namespace std;
int main() {
	int T = 0;
	scanf("%d", &T);
	for (int G = 1; G <= T; G++) {
		int n = 0, lst = -1;
		int l = -1, r = -1;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++) {
			int a = 0;
			scanf("%d", &a);
			if (i >= 2 && abs(lst - a) >= 2) {
				l = i - 1, r = i;
			}
			lst = a;
		}
		if (l == -1) printf("NO\n");
		else printf("YES\n%d %d\n", l, r);
	}
	return 0;
} 

标签:min,int,Interesting,NO,cdots,max,CF1270B,Subarray,include
From: https://www.cnblogs.com/kirakiraa/p/18097039

相关文章

  • SP20848 IGAME - Interesting Game 题解
    分析数位DP一眼题。对于一个\(k\)位的数\(s\),我们不妨将其看做由数字\(s_1,s_2,s_3,\dots,s_k\)这\(k\)个数字拼接起来的。而题意是每个人可以将\(s_1,s_2,s_3,\dots,s_k\)中的任意一个减去任意数字,保证不减去\(0\)且结果\(\ge0\)。显然,在我们将这\(k\)个数看......
  • CF1398C Good Subarrays(写给我们萌新团体)
    GoodSubarrays传送门:GoodSubarrays-洛谷|计算机科学教育新生态(luogu.com.cn)思路暴力!!!!!一如既往的暴力!!!复杂度O(n^2)数据n到1e5TLE必定TLE我们可以用一个桶来优化实质上其实还是高中所学的排列组合思想第一步:当然是前缀和了,这边讲给新手写一下,有点冗杂,是高手直接......
  • C1. Good Subarrays (Easy Version)
    找子数组的个数双指针#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e5+10;inta[N];voidsolve(){ intn; cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; intl=1,r=1; intans=0; while(l<=r){ if(l>n||r>......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......
  • CodeForces 1609F Interesting Sections
    洛谷传送门CF传送门看到\(\max,\min\)考虑单调栈。枚举右端点,计算有多少个符合条件的左端点。单调栈维护的是对于每个右端点,以每个点为左端点的后缀\(\max,\min\)形成的极长的段。先枚举\(\text{popcount}=k\),然后如果一个段的\(\max\)的\(\text{popcount}=k\)......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......
  • C1. Good Subarrays (Easy Version)
    思路:我们枚举每一个左端点,对于每一个左端点,寻找最长的满足条件的区间,这个区间长度就是左端点对答案的贡献,可以发现具有单调性,右端点只会前进不会倒退。所以我们两个指针各扫一遍区间就可以。#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,......
  • C1. Good Subarrays (Easy Version)(推公式找性质)
    思路:\[能想到平方是比较特殊的,因为x*x一定是x的倍数也就是说\sqrt[2]{x*x}={x}\]\[所以需要考虑平法之间的数手模一下样例可以发现[x^2,(x+1)^2)之间是x倍数的有x^2\]\[x*(x+1),x*(x+2)这三个,所以可以知道平方之间有三个,只要讨论一下出来整个区间边界还有多少个\]这里可......
  • [LeetCode] 1630. Arithmetic Subarrays
    Asequenceofnumbersiscalledarithmeticifitconsistsofatleasttwoelements,andthedifferencebetweeneverytwoconsecutiveelementsisthesame.Moreformally,asequencesisarithmeticifandonlyifs[i+1]-s[i]==s[1]-s[0]forallvalid......
  • [USACO23FEB] Equal Sum Subarrays G 题解
    [USACO23FEB]EqualSumSubarraysG题解题目链接\(O(n^5)\)暴力显然,如果修改\(a_i\)的值,只会影响包含\(a_i\)的区间的区间和。于是对于每个\(a_i\),可以将所有区间分成两类,即包含\(a_i\)的区间和不包含\(a_i\)的区间。这两种区间的区间和中最小的差值即为答案。......