当前位置 : 主页 > 编程语言 > java >

CdoeForeces 1272D Remove One Element

来源:互联网 收集:自由互联 发布时间:2023-02-04
Description: You are given an array a consisting of You can remove at most one element from this array. Thus, the final length of the array is or . Your task is to calculate the maximum possible length of the strictly increasing contiguou

Description:

You are given an array a consisting of CdoeForeces 1272D Remove One Element_子序列

You can remove at most one element from this array. Thus, the final length of the array is CdoeForeces 1272D Remove One Element_#include_02 or CdoeForeces 1272D Remove One Element_子序列.

Your task is to calculate the maximum possible length of the strictly increasing contiguous subarray of the remaining array.

Recall that the contiguous subarray a with indices from CdoeForeces 1272D Remove One Element_#include_04 to CdoeForeces 1272D Remove One Element_#define_05 is CdoeForeces 1272D Remove One Element_#define_06. The subarray CdoeForeces 1272D Remove One Element_#include_07 is called strictly increasing if CdoeForeces 1272D Remove One Element_子序列_08

Input

The first line of the input contains one integer CdoeForeces 1272D Remove One Element_#include_09 — the number of elements in CdoeForeces 1272D Remove One Element_#define_10.

The second line of the input contains n integers CdoeForeces 1272D Remove One Element_子序列_11, where ai is the i-th element of CdoeForeces 1272D Remove One Element_#define_10.

Output

Print one integer — the maximum possible length of the strictly increasing contiguous subarray of the array a after removing at most one element.

Examples

input

5 1 2 5 3 4

output

4

input

2 1 2

output

2

input

7 6 5 4 3 2 4 3

output

2 Note In the first example, you can delete CdoeForeces 1272D Remove One Element_#include_13. Then the resulting array will be equal to CdoeForeces 1272D Remove One Element_子序列_14 and the length of its largest increasing subarray will be equal to CdoeForeces 1272D Remove One Element_#include_15.

题意: 给出一串序列,可以删除序列中的一个元素,也可以不删,求操作后的最大上升连续子序列的长度。 我们先找到每段上升连续子序列的长度是多少,既然可以删除一个数字,那么要使得最后得上升子序列的长度最大那就删除两段子序列的交界的那个数字,分为两种情况:

  • 前一个序列的右端点比后一个序列的左端点大比左端点下一个数字小,就把后一个序列的左端点删除。
  • 前一个序列的右端点的前一个数比后一个序列的左端点小,就把前一个序列的右端点删除。 然后扫一遍统计最大的长度。

AC代码:

#include <cstdio>#include <vector>#include <queue>#include <cstring>#include <cmath>#include <map>#include <set>#include <string>#include <iostream>#include <algorithm>#include <iomanip>#include <stack>#include <queue>using namespace std;#define sd(n) scanf("%d", &n)#define sdd(n, m) scanf("%d%d", &n, &m)#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)#define pd(n) printf("%d\n", n)#define pc(n) printf("%c", n)#define pdd(n, m) printf("%d %d", n, m)#define pld(n) printf("%lld\n", n)#define pldd(n, m) printf("%lld %lld\n", n, m)#define sld(n) scanf("%lld", &n)#define sldd(n, m) scanf("%lld%lld", &n, &m)#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)#define sf(n) scanf("%lf", &n)#define sc(n) scanf("%c", &n)#define sff(n, m) scanf("%lf%lf", &n, &m)#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)#define ss(str) scanf("%s", str)#define rep(i, a, n) for (int i = a; i <= n; i++)#define per(i, a, n) for (int i = n; i >= a; i--)#define mem(a, n) memset(a, n, sizeof(a))#define debug(x) cout << #x << ": " << x << endl#define pb push_back#define all(x) (x).begin(), (x).end()#define fi first#define se second#define mod(x) ((x) % MOD)#define gcd(a, b) __gcd(a, b)#define lowbit(x) (x & -x)typedef pair<int, int> PII;typedef long long ll;typedef unsigned long long ull;typedef long double ld;const int MOD = 1e9 + 7;const double eps = 1e-9;const ll INF = 0x3f3f3f3f3f3f3f3fll;const int inf = 0x3f3f3f3f;inline int read(){ int ret = 0, sgn = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') sgn = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { ret = ret * 10 + ch - '0'; ch = getchar(); } return ret * sgn;}inline void Out(int a){ if (a > 9) Out(a / 10); putchar(a % 10 + '0');}ll gcd(ll a, ll b){ return b == 0 ? a : gcd(b, a % b);}ll lcm(ll a, ll b){ return a * b / gcd(a, b);}///快速幂m^k%modll qpow(int m, int k, int mod){ ll res = 1, t = m; while (k) { if (k & 1) res = res * t % mod; t = t * t % mod; k >>= 1; } return res;}// 快速幂求逆元int Fermat(int a, int p) //费马求a关于b的逆元{ return qpow(a, p - 2, p);}///扩展欧几里得int exgcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1; y = 0; return a; } int g = exgcd(b, a % b, x, y); int t = x; x = y; y = t - a / b * y; return g;}///使用ecgcd求a的逆元xint mod_reverse(int a, int p){ int d, x, y; d = exgcd(a, p, x, y); if (d == 1) return (x % p + p) % p; else return -1;}///中国剩余定理模板ll china(int a[], int b[], int n) //a[]为除数,b[]为余数{ int M = 1, y, x = 0; for (int i = 0; i < n; ++i) //算出它们累乘的结果 M *= a[i]; for (int i = 0; i < n; ++i) { int w = M / a[i]; int tx = 0; int t = exgcd(w, a[i], tx, y); //计算逆元 x = (x + w * (b[i] / t) * x) % M; } return (x + M) % M;}const int N = 2e5 + 10;int a[N] , l[N] , r[N];int main(){ int n ; sd(n); rep(i,1,n) sd(a[i]); int now=1,cnt=0; int maxn=0 ; while(now<=n) { int i=now; now++; while(now<=n&&a[now]>a[now-1]) now++; l[cnt]=i; r[cnt]=now-1; cnt++; maxn=max(maxn,now-i); } rep(i,0,cnt-2) { int res=l[i+1]+1; if(a[r[i]]<a[res]) maxn=max(maxn,r[i]-l[i]+1+r[i+1]-l[i+1]); else if(a[r[i]-1]<a[l[i+1]]) maxn=max(maxn ,r[i]-l[i]+r[i+1]-l[i+1]+1); } pd(maxn); return 0;}

上一篇:合并果子(优先队列)
下一篇:没有了
网友评论