首页 > 其他分享 >题解

题解

时间:2023-06-04 22:13:36浏览次数:54  
标签:前缀 题解 flag maxn ans 我们

原题请见题目链接

1. 暴力求解

这是我们线下水题赛的T1 这里为初学者提供一个思路,假设我们现在刚入OI,在考场上如何怎么优雅的避免保灵

显然 我们只要用一个 \(O(n)\) 的暴力去扫描就行了,但是直接向后扫 \(i+1,i+2\) 这样走很容易寄。因为你在\(i+1\) 跳的时候很容易把后面跳过了 ,导致你的最长序列会至少-2(我看别的题解都没有说明 应该是太简单了吧 )

那这样我们就可以初步得出这个暴力来对拍了。

我们只需定义一个 \(flag\) 来暂时保存你现在的长度 只要你扫描到 \(i-1,i-2\) 都比这个 \(i\) 大 ,即为不合法。我们在清零之前我们和 \(ans\) 取一个 \(max\) 即可

#define _for(i,a,b) for(int (i) = (a); i <= (b); i++) 
using namespace std; 
int a[200006]; 
int n, q; 
int main( ) { 

scanf("%d%d",&n,&q);
_for(i,1,n) scanf("%d",&a[i]); 
while(q--) 
{ 
	int l,r; 
	int maxn = 0,flag = 0; 
	scanf("%d%d",&l,&r); 
	_for(i,l,r) 
		{ flag ++; 
			if(a[i] <= a[i - 1] && a[i - 1 ] <= a[i - 2] && i >= 3)
			{ flag--; } 
			maxn = max(maxn,flag); 
		} 
			printf("%d\n",maxn); 
	} 
//fclose(stdin);fclose(stdout); 
}

之后你就会看到如下的情况

好消息! 没有爆零!
这时候我们就要考虑正解怎么做了

2. 前缀数组的做法

Q:为什么我们这道题可以用前缀数组去做呢 为什么想到这里呢?

ans:因为这个玩意是可以共享给后面的。假设你 \(l\) 与 \(l + r\) 中间没有任何一个违反规则的三元组,那么你可以很快的求出 \([l,l+2]\) 的长度就为 \([l,l+r] - [l+3,l+r]\) 所以我们可以用前缀的思想求解。

这里我们求出里面违反规则的 \(length\) 用 \(R-l+1-ans\) 即可

这里附上ac代码

#define _for(i,a,b) for(int (i) = (a); i <= (b); i++)
using namespace std;

int a[200006],c[2000006],b,cnt;
int n, q;

int main( )
{
//	freopen("a.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	scanf("%d%d",&n,&q);
	bool flag  = 1;
	int b;
	_for(i,1,n) {
		
		scanf("%d",&c[i]);
		if(i >= 3)
		{
			b = 0;
			if(c[i] <= c[i - 1] && c[i - 1] <= c[i - 2]) 
			b = 1;
			a[i] += a[i -1] + b;
		}
	}
	
	while(q--)
	{
		int l,r;
		int maxn;
		scanf("%d%d",&l,&r);
		maxn = a[r] - a[l+1];
		if(r-l+1 <= 2)  maxn = r-l+1;
		else maxn = r-l+1-maxn;
		printf("%d\n",maxn);
	}
	fclose(stdin);fclose(stdout);

c[i] 为原始序列 ,a[i] 保存的是违反规则的数的个数

标签:前缀,题解,flag,maxn,ans,我们
From: https://www.cnblogs.com/mhunice/p/17456473.html

相关文章

  • 【题解】[ABC304F] Shift Table(容斥)
    【题解】[ABC304F]ShiftTable题目链接ABC304F题意概述Takahashi和Aoki将在接下来的\(N\)天里兼职工作。Takahashi这\(n\)天的出勤情况由字符串\(S\)表示,其中\(S\)的第\(i\)个字符是#则表示他在第\(i\)天工作,第\(i\)个字符是.表示他在第\(i\)天休息......
  • 题解:【AGC054D】 (ox)
    题目链接Larry76牛牛首先考虑没有ox怎么做,就是将括号序列调成合法。\(|S|\)不大直接模拟一遍,记录\(now\)表示一个前缀权值,当遇到一个(时\(+1\),遇到一个)时\(-1\),当\(now<0\)的时候说明序列不合法即)多了,暴力向后找到第一个(交换到当前的)前面。这样我们......
  • Codeforces Round 876 (Div. 2)题解
    CodeforcesRound876(Div.2)A.TheGoodArray标签greedymath题意对于任意\(i\in\{1,2,\dots,n\}\),要求数列\(a\)满足前\(i\)个元素中至少有\(\lceil\frac{i}{k}\rceil\)个元素为\(1\),后\(i\)个元素中至少有\(\lceil\frac{i}{k}\rceil\)个元素为\(1\)。思......
  • “AIR SDK 0.0: AIR SDK location “...\devsdks\AIRSDK\Win” does not exist.”
    导入AS3项目时提示“AIRSDK0.0:AIRSDKlocation“D:\ProgramFiles\Adob5eFlashBuilder4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win”doesnotexist.”是AS3项目找不见AIRSDK.打开项目配置ActionScriptBuildPath,路径出错......
  • CF1329E Dreamoon Loves AA 题解
    令\(p_0=0,m\leftarrowm+1,p_{m}=n,a_i=p_i-p_{i-1}\),设在\((p_{i-1},p_i)\)中有\(d_i-1\)个B变成了A,满足\(\sum_{i=1}^m(d_i-1)=k\),让\(k\leftarrowk+m\),这样\(d\)需要满足的限制就变成了\(\sum_{i=1}^md_i=k\)。这也可以看作把\(a_i\)分成\(d_i\)个正整数之......
  • ABC302Ex Ball Collector 题解
    注意到当有那些\((a_i,b_i)\)是确定的时,答案就是将\((a_i,b_i)\)连边后每个连通块的\(\min(|V|,|E|)\)之和。那么这个东西用可撤销并查集维护即可。#include<algorithm>#include<cstdio>usingnamespacestd;constintN=2e5;structEdge{intto,nxt;}e[......
  • 2023青岛市程序设计竞赛小学组题解
    1.付钱题目链接:https://www.luogu.com.cn/problem/U303904代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){ lln;cin>>n; cout<<n/100<<''<<(n%100)/50<<''<<(n%50)/20......
  • 第十届蓝桥杯c++b组国赛题解(还在持续更新中...)
    试题A:平方序列解题思路:直接枚举一遍x的取值,然后按照题目给定的式子算出y,每次取x+y的最小值即可答案为7020代码实现:#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;#defineintlonglongconstintN=1e4+5;signedmain(){ //记录答案......
  • ABC215E 题解
    前言题目传送门!更好的阅读体验?萌萌DP题。思路题目就是在说从\(a\)里面按顺序掏出来一些字母,使得相同的字母都是相邻的(比如AABBBBCD可行,AAABBCAA不行)。看起来很不可做,突破口在于\(\text{A}\sim\text{J}\)一共只有\(10\)个字母,考虑状压。设\(dp_{i,s}\)表示......
  • 道路翻修题解
    \(\mathcal{Description}\)给定一张无向图,为每条边定向,定义每个点的价值为出度与入度之差的绝对值,求最大价值和。对于\(40\%\)的数据,\(1\leqn,m\leq20\)。对于\(70\%\)的数据,\(1\leqn\leq17\)。对于\(90\%\)的数据,\(1\leqn\leq22\)。对于所有数据,\(1\leqn\leq25\)......