社区讨论

其中,自己写的二分查找,查找不上升子串的长度总是比答案少

P1020[NOIP 1999 提高组] 导弹拦截参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lodcw3nk
此快照首次捕获于
2023/10/31 04:32
2 年前
此快照最后确认于
2023/11/06 19:53
2 年前
查看原帖
代码:
C
while(redn(highs[++n])); n--;
int len1=1,len2=1;
array1[1] = highs[1];array2[1] = highs[1]
for(int i=2;i<=n;i++){
    if(array1[len1]>=highs[i]) array1[++len1] = highs[i];
    else{
        int l = 1, r= len1;
        while(l<r){
            int mid = l+(r-l)/2;
            if(array1[mid]>highs[i]) l = mid+1;
            else r = mid;
        }
        array1[l] = highs[i];
    }
 }
完整代码:
C
int solve4(){
   while(redn(highs[++n])); n--;
   int len1=1,len2=1;
   array1[1] = highs[1];array2[1] = highs[1];
   for(int i=2;i<=n;i++){
       if(array1[len1]>=highs[i]) array1[++len1] = highs[i];
       else{
           int l = 1, r= len1;
           while(l<r){
               int mid = l+(r-l)/2;
               if(array1[mid]>highs[i]) l = mid+1;
               else r = mid;
           }
           array1[l] = highs[i];
       }
       if(array2[len2]<highs[i]) array2[++len2] = highs[i];
       else{
           int l=1,r=len2;
           while(l<r){
               int mid = l+(r-l)/2;
               if(array2[mid]<highs[i]) l = mid+1;
               else r = mid;
           }
           array2[l] = highs[i];
       }
   }
   cout<<len1<<endl<<len2;
   return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...