程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CF 27C

CF 27C

編輯:C++入門知識

  這題 很多人直接用的一個for循環。。解決的。我不怎麼理解。這題我是用的樹狀數組。 統計兩個東西。  1 統計a[i]左邊,比a[i]小的和比a[i]大的個數。  2統計a[i]右邊,比a[i]小 和比a[i]大的個數。 然後根據題意。任意選擇一組合適得到解即可。 [cpp]   #include <cmath>   #include <ctime>   #include <iostream>   #include <string>   #include <vector>   #include <cstdio>   #include <cstdlib>   #include <cstring>   #include <queue>   #include <map>   #include <set>   #include <algorithm>   #include <cctype>   #include <stack>   #include <deque>   using namespace std;   typedef long long LL;   #define eps 10e-9   #define inf 0x3f3f3f3f   const int maxn = 100000+100;   int a[maxn],c1[2001000],c2[2001000];   int lowbit(int x) {  return x&-x;}   void add(int x,int add,int c[]){       while(x<2000000){            c[x]+=add;  x+=lowbit(x);       }   }   int sum(int x,int c[]){       int ret=0;       while(x>0){          ret+=c[x]; x-=lowbit(x);       }       return ret;   }   int main(){       int n;       scanf("%d",&n);       for(int i=0;i<n;i++) scanf("%d",&a[i]),a[i]+=1000000;       for(int i=0;i<n;i++){          add(a[i],1,c2);       }       int flag1=0,flag2=0;       int a1,a2,a3;       for(int i=0;i<n;i++){           int s1=sum(a[i]-1,c1);           int s2=sum(a[i]-1,c2);        //   printf("%d %d\n",s1,s2);           if(s1>0&&s2>0){               flag1=1;a2=i; break;           }           s1=sum(a[i],c1); s2=sum(a[i],c2);           s1=i-s1;       s2=n-i-s2;           add(a[i],-1,c2);           add(a[i],1,c1);         //  printf("%d %d\n",s1,s2);           if(s1>0&&s2>0){               flag2=1;a2=i; break;            }       }       if(flag1){           for(int i=0;i<a2;i++){              if(a[i]<a[a2]){                a1=i; break;              }           }           for(int i=a2+1;i<n;i++){               if(a[i]<a[a2]){                 a3=i; break;               }           }           printf("3\n");           printf("%d %d %d\n",a1+1,a2+1,a3+1);          }       else if(flag2){           for(int i=0;i<a2;i++){              if(a[i]>a[a2]){                a1=i; break;              }           }           for(int i=a2+1;i<n;i++){               if(a[i]>a[a2]){                 a3=i; break;               }           }           printf("3\n");           printf("%d %d %d\n",a1+1,a2+1,a3+1);          }       else printf("0\n");             return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved