ST表 9pts

P1816 忠诚

《j<=21》
by CEFqwq @ 2023-12-06 20:27:48


`log` 求的有问题。 `i<<1=i*2,i>>1=i/2` 求`log`的时候,`log(i)=log(i/2)+1=log(i>>1)+1`,所以改一下。 于是乎 AC 代码: ```cpp #include<bits/stdc++.h> using namespace std; int f[111111][21]; //f[i][j]=max(a[i-->(1<<j)]) int lg[111111],n,m,l,r; void LOG(){ lg[1]=0,lg[2]=1; for(register int i=3;i<=n;++i){ lg[i]=lg[i>>1]+1;//这里 } } int main(){ cin>>n>>m; LOG(); for(int i=1;i<=n;i++)cin>>f[i][0]; for(int j=1;j<=21;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); } } for(int i=1;i<=m;i++){ cin>>l>>r; int LG=lg[r-l+1]; int ans=min(f[l][LG],f[r-(1<<LG)+1][LG]); cout<<ans<<' '; } return 0; } ```
by wanglexi @ 2023-12-06 20:28:15


|