题意:删除一个数字之后,剩下的数列是非递增或非递减。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=1e5+10; int a[maxm]; int n; int ok; void judge1() { int num=0; int k; for(int i=1;i<n;i++) { if(a[i]<a[i-1]) { num++; k=i; } } if(num==0) ok=1; else if(num==1) { //这些情况的例子 3 1 1 2 3 /*******/ 1 2 4 3 4 /*********/ 1 1 2 1 1 4 /*****/ 1 2 3 4 3 if(k==1||k==n-1||a[k-1]<=a[k+1]||a[k-2]<=a[k]) { ok=1; } } } void judge2() { int num=0; int k; for(int i=1;i<n;i++) { if(a[i]>a[i-1]) { num++; k=i; } } if(num==0) ok=1; else if(num==1) { if(k==1||k==n-1||a[k-1]>=a[k+1]||a[k-2]>=a[k]) { ok=1; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } ok=0; judge1(); if(ok) { printf("YES\n"); continue; } judge2(); if(ok) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }
//正着找一个最长不下降L1,反正找一个最长不下降(正着就是最长不递减)L2,如L1==N||L1==N-1||L2==N||L2==N-1的话,证明可以YES,不然NO #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=1e5+10; int a[maxm]; int b[maxm]; int dp1[maxm]; int dp2[maxm]; int n; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int i; int temp1,temp2; for(i=1; i<=n; i++) { scanf("%d",&a[i]); b[n-i+1]=a[i]; } dp1[1]=a[1]; dp2[1]=b[1]; int len1=1; int len2=1; for(i=2; i<=n; i++) { if(dp1[len1]<=a[i])//最长不下降 { dp1[++len1]=a[i]; } else { temp1=upper_bound(dp1+1,dp1+len1+1,a[i])-dp1; dp1[temp1]=a[i]; } } for(i=2; i<=n; i++) { if(dp2[len2]<=b[i])//反找最长不下降 { dp2[++len2]=b[i]; } else { temp2=upper_bound(dp2+1,dp2+len2+1,b[i])-dp2; dp2[temp2]=b[i]; } } if(len1==n-1||len2==n-1||len1==n||len2==n) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }