【算法总结】基本算法

【堆排序】

〖模板代码

 1 #include<cstdio>
 2 #include<algorithm> 
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6 const int N=1e5+10;
 7 int n,len,a[N];
 8 int read()
 9 {
10     int x=0,f=1;char c=getchar();
11     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
12     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
13     return x*f;
14 }
15 int main()
16 {
17     n=read();
18     for(int i=1;i<=n;i++)
19     {
20         a[i]=read();len=i;
21         while(len!=1)
22         {
23             if(a[len]<a[len/2])swap(a[len],a[len/2]);
24             else break;len>>=1;
25         }
26     }
27     for(int i=1;i<=n;i++)
28     {
29         printf("%d ",a[1]);
30         a[1]=a[n-i+1];len=1;
31         while(len*2<=n-i)
32         {
33             int next=len*2;
34             if(a[next]>a[next+1]&&next<n-i)next++;
35             if(a[len]<=a[next])break;
36             swap(a[len],a[next]);len=next;
37         }
38     }
39     return 0;
40 }
View Code

【三分法】

〖模板代码 

1 int main()
2 {
3     while(r-l>1e-6)
4     {
5         mid1=l+(r-l)/3;mid2=r-(r-l)/3;
6         if(calc(mid1)<calc(mid2))l=mid1;
7         else r=mid2;
8     }
9 }
View Code

【ST表】

〖模板代码〗 

 1 #include<cstdio>
 2 #include<algorithm> 
 3 #include<cstring>
 4 #include<cmath>
 5 #define LL long long
 6 using namespace std;
 7 const int N=1e5+5;
 8 int n,m,L,R,mx[N][20]; 
 9 int read()
10 {
11     int x=0,f=1;char c=getchar();
12     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
13     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
14     return x*f;
15 }
16 int query(int L,int R)
17 {
18     int k=log(R-L+1)/log(2);
19     return max(mx[L][k],mx[R-(1<<k)+1][k]);
20 }
21 int main()
22 {
23     n=read();m=read();
24     for(int i=1;i<=n;i++)mx[i][0]=read();
25     int k=log(n)/log(2);
26     for(int i=1;i<=k;i++)
27         for(int j=1;j<=n-(1<<(i-1));j++)
28         {
29             mx[j][i]=mx[j][i-1];
30             mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
31         }
32     while(m--)
33     {
34         L=read();R=read();
35         printf("%d\n",query(L,R));
36     }
37     return 0;
38 }
View Code

                                                                                                                                                                                                                              

posted @ 2018-04-19 21:30  Zsnuo  阅读(242)  评论(0编辑  收藏  举报