目录
显示
题目链接
https://www.luogu.org/problem/P1198
题解
用 ST 表可以高效地解决本题。
因为修改操作只涉及在尾部添加元素,我们只需要在每次添加后,用 O(\log n) 的时间更新 ST 表即可。
查询操作不用多说。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int a[200005],cnt,f[200005][25];
void update(int x)
{
f[x][0]=a[x];
for(int i=1;(1<<i)<=x;i++)
f[x][i]=max(f[x][i-1],f[x-(1<<(i-1))][i-1]);
}
long long query(int l,int r)
{
int k=log2(r-l+1);
return max(f[r][k],f[l+(1<<k)-1][k]);
}
int main()
{
long long m,d,lastans=0;
cin>>m>>d;
for(int i=1;i<=m;i++)
{
char c;
cin>>c;
if(c=='A')
{
long long x;
cin>>x;
a[++cnt]=(x+lastans)%d;
update(cnt);
}
else
{
long long x;
cin>>x;
cout<<(lastans=query(cnt-x+1,cnt))<<endl;
}
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int a[200005],cnt,f[200005][25];
void update(int x)
{
f[x][0]=a[x];
for(int i=1;(1<<i)<=x;i++)
f[x][i]=max(f[x][i-1],f[x-(1<<(i-1))][i-1]);
}
long long query(int l,int r)
{
int k=log2(r-l+1);
return max(f[r][k],f[l+(1<<k)-1][k]);
}
int main()
{
long long m,d,lastans=0;
cin>>m>>d;
for(int i=1;i<=m;i++)
{
char c;
cin>>c;
if(c=='A')
{
long long x;
cin>>x;
a[++cnt]=(x+lastans)%d;
update(cnt);
}
else
{
long long x;
cin>>x;
cout<<(lastans=query(cnt-x+1,cnt))<<endl;
}
}
return 0;
}
#include <iostream> #include <algorithm> #include <cmath> using namespace std; int a[200005],cnt,f[200005][25]; void update(int x) { f[x][0]=a[x]; for(int i=1;(1<<i)<=x;i++) f[x][i]=max(f[x][i-1],f[x-(1<<(i-1))][i-1]); } long long query(int l,int r) { int k=log2(r-l+1); return max(f[r][k],f[l+(1<<k)-1][k]); } int main() { long long m,d,lastans=0; cin>>m>>d; for(int i=1;i<=m;i++) { char c; cin>>c; if(c=='A') { long long x; cin>>x; a[++cnt]=(x+lastans)%d; update(cnt); } else { long long x; cin>>x; cout<<(lastans=query(cnt-x+1,cnt))<<endl; } } return 0; }