1 条题解
-
-1Takagi-san (njnu19200437) LV 10 MOD @ 2021-04-14 16:36:27
本题改编自cf上一题
这题思路很巧妙,因为X的变化在自然数上是连续的,所以只要记录区间最大值和区间最小值即可。总共取值的个数等于(最大值-最小值+1)
而区间最值的查询可以使用ST表实现。
Code:#include<bits/stdc++.h> typedef long long int ll; using namespace std; //Header int a[1000005],n,m,power[20],MAX[1000005][20],MIN[1000005][20]; int query_max(int l,int r) { int m=log2(r-l+1); return(max(MAX[l][m],MAX[r-power[m]+1][m])); } int query_min(int l,int r) { int m=log2(r-l+1); return(min(MIN[l][m],MIN[r-power[m]+1][m])); } int main() { cin>>n>>m; power[0]=1;for(int i=1;i<=19;i++) power[i]=power[i-1]*2; for(int i=1;i<=n;i++) { char c;cin>>c; if(c=='+')a[i]=a[i-1]+1;else a[i]=a[i-1]-1; MAX[i][0]=a[i],MIN[i][0]=a[i]; } for(int i=1;i<=19;i++)for(int j=1;j<=n;j++) if(j+power[i]-1<=n)MAX[j][i]=max(MAX[j][i-1],MAX[j+power[i-1]][i-1]); for(int i=1;i<=19;i++)for(int j=1;j<=n;j++) if(j+power[i]-1<=n)MIN[j][i]=min(MIN[j][i-1],MIN[j+power[i-1]][i-1]); while(m--) { int l,r;cin>>l>>r; cout<<query_max(l,r)-query_min(l,r)+1<<'\n'; } return 0; }
- 1
信息
- ID
- 1235
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 37
- 已通过
- 2
- 通过率
- 5%
- 被复制
- 4
- 上传者