c++刷题 超能力编程
标准ST表格式:
#include<bits/stdc++.h>
#define DEBUG cerr << "Call out at function: " << __func__ << ", In line: " << __LINE__ << " : "
#define repeat(a,b,c,g) for (int a=b,abck=(g>=0?1:-1);abck*(a)<=abck*(c);a+=g)
using namespace std;
int Maxq[20][60000];
int Minq[20][60000];
int a[60000];
int n;
int base[20];
inline int lg(int x)
{
int ret = 0;
while (x > 1) x >>= 1, ret ++;
return ret;
}
int main()
{
base[0] = 1;
for (int i=1;i<=18;i++)
base[i] = 2 * base[i-1];
cin >> n;
int m;
cin >> m;
for (int i=1;i<=n;i++)
scanf("%d",a+i),Maxq[0][i] = Minq[0][i] = a[i];
for (int _=1;_<=18;_++)
{
for (int i=1;i<=n;i++)
if (i+base[_-1]<=n)
Maxq[_][i] = max(Maxq[_-1][i],Maxq[_-1][i+base[_-1]]),
Minq[_][i] = min(Minq[_-1][i],Minq[_-1][i+base[_-1]]);
else
Maxq[_][i] = Maxq[_-1][i],
Minq[_][i] = Minq[_-1][i];
}
for (int i=1;i<=m;i++)
{
int tp1,tp2;
scanf("%d%d",&tp1,&tp2);
int len = lg(tp2 - tp1 + 1);
printf("%d\n",max(Maxq[len][tp1],Maxq[len][tp2-base[len]+1]) - min(Minq[len][tp1],Minq[len][tp2-base[len]+1]));
}
}
或者:
#include <bits/stdc++.h>
using namespace std;
int n,q;
int a[50005];
int f[50005][21]={-0x3f3f3f3f},g[50005][21]={0x3f3f3f3f};//f存最大值 g存最小值
void ST_prework()
{
int i;
for(i=1;i<=n;i++)f[i][0]=a[i],g[i][0]=a[i];
int t=log(n)/log(2)+1;
int j;
for(j=1;j<t;j++)
{
for(i=1;i<=n-(1<<j)+1;i++)
{
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
g[i][j]=min(g[i][j-1],g[i+(1<<(j-1))][j-1]);
}
}
}
int ST_query(int l,int r)
{
int k=log(r-l+1)/log(2);
return max(f[l][k],f[r-(1<<k)+1][k])-min(g[l][k],g[r-(1<<k)+1][k]);
}
int main()
{
cin>>n>>q;
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
ST_prework();
for(i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",ST_query(a,b));
}
return 0;
}
再或者:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int f1[100100][50];
int f2[100100][50];
int l,r;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&f1[i][0]);
f2[i][0]=f1[i][0];
}
for (int j=1;(1<<j)<=n;j++)
for (int i=1;i+(1<<j)-1<=n;i++)
{
f1[i][j]=min(f1[i][j-1],f1[i+(1<<(j-1))][j-1]);
f2[i][j]=max(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
}
while (m--)
{
scanf("%d%d",&l,&r);
int k=log2(r-l+1);
int sum1,sum2,sum;
sum1=min(f1[l][k],f1[r-(1<<k)+1][k]);
sum2=max(f2[l][k],f2[r-(1<<k)+1][k]);
sum=abs(sum1-sum2);
printf("%d\n",sum);
}
return 0;
}