1 条题解

  • -1
    @ 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
上传者