P1198 [JSOI2008] 最大数
》》》 RMQ -》 dp
》》》dp 泛着定义 f[i][j] -> i-1<<j+1 -> 每一部分 1<<j
/*5 100 A 96 Q 1 A 97 Q 1 Q 2 96 93 96 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; ll a[200001],f[200001][22],lg[200001]={-1}; ll m,d,n=0; //ll a[200001],f[200001][22],d,lg[200001]={-1}; //ll n,m; void add(int u) { f[u][0]=a[u]; for(int i=1;u-(1<<i)+1>=1;i++) f[u][i]=max( f[u][i-1], f[ u-(1<<(i-1)) ][i-1] ); } ll get(int x,int y) { int t=lg[y-x+1]; return max(f[y][t],f[x+(1<<t)-1][t]); } int main() { memset(f,0,sizeof(f)); //ios::sync_with_stdio(false); cin.tie(0); cin>>m>>d; for(int i=1;i<=2*m;i++) lg[i]=lg[i>>1]+1; ll t=0; for(int i=1;i<=m;i++) { char ch; cin>>ch; if(ch=='A') { ll tmp; cin>>tmp; a[++n]=(tmp+t)%d; add(n); } else { ll l; cin>>l; //can ignore if(l==1){ cout<<a[n]<<'\n'; t=a[n]; continue; } // t=get(n-l+1,n); cout<<t<<'\n'; } } return 0; }

浙公网安备 33010602011771号