vj网址点击打开链接
这道题其实 当时打比赛的时候想到了 dp 但是但是看了数据范围是 O^2 看了一下数据范围 直接就 暴力交了一发 然后就t了 后来看了别人的代码 就是 二分 加上dp 然后dp 数组更新 这个思想 很简单 我记得以前 在刷 我们学校的oj的时候我还刷过 类似的题 但是当时 就是没有想起来 哎 想想自己就是菜鸡 然后 有个函数可以了解一下upper_bound 这个函数跟二分差不多 就是查找数组里面的数字 用着挺好 下面是ac代码
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<string> #include<math.h> using namespace std; const int kk=1e5+100; int p[kk]; int dp[kk]; int dpp[kk]; int main() { int t,nn,mm,len1,len2,x; scanf("%d",&t); while(t--) { len1=len2=0; memset(dp,0,sizeof(dp)); memset(dpp,0,sizeof(dpp)); scanf("%d%d",&nn,&mm); for(int i=0; i<nn; i++) scanf("%d",&p[i]); //dp[len1]=-1000000,dpp[len2]=0x7f7f7f; for(int i=0; i<nn; i++) { if(dp[len1]<=p[i]) dp[++len1]=p[i]; else { x=upper_bound(dp+0,dp+len1,p[i])-dp; // printf("%d\n",x); dp[x]=p[i]; } } for(int i=nn-1;i>=0;i--) { if(dpp[len2]<=p[i]) dpp[++len2]=p[i]; else { x=upper_bound(dpp+0,dpp+len2,p[i])-dpp; // printf("%d\n",x); dpp[x]=p[i]; } } //printf("%d %d\n",len1,len2); if(nn-len1<=mm||nn-len2<=mm) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } return 0; }