1 条题解

  • 1
    @ 2023-9-12 15:16:27
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2e5+10;
    
    int n,m,t;
    int f[N][21],g[N][21];
    int a[N];
    
    inline void read(int &x)
    {
    	x = 0;int f = 1;char c = getchar();
    	while(!isdigit(c)) {if(c == '-')f = -1;c = getchar();}
    	while(isdigit(c)) {x = (x<<1)+(x<<3)+(c^48);c = getchar();}
    }
    
    void ST_init_f()
    {
    	for(int i=1;i<=n;i++) f[i][0] = a[i];
    	int t = log(n)/log(2)+1;
    	for(int j=1;j<t;j++)
    		for(int i=1;i<=n-(1<<j)+1;i++)
    			f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
    }
    
    void ST_init_g()
    {
    	for(int i=1;i<=n;i++) g[i][0] = a[i];
    	int t = log(n)/log(2)+1;
    	for(int j=1;j<t;j++)
    		for(int i=1;i<=n-(1<<j)+1;i++)
    			g[i][j] = min(g[i][j-1],g[i+(1<<(j-1))][j-1]);
    }
    
    int query_f(int l,int r)
    {
    	int k = log(r-l+1)/log(2);
    	return max(f[l][k],f[r-(1<<k)+1][k]);
    }
    
    int query_g(int l,int r)
    {
    	int k = log(r-l+1)/log(2);
    	return min(g[l][k],g[r-(1<<k)+1][k]);
    }
    
    int main()
    {
    	read(n);read(m);
    	for(int i=1;i<=n;i++) cin >> a[i];
    	ST_init_f();
        ST_init_g();
    	for(int i=1;i<=m;i++)
        {
            int x,y;
            cin >> x >> y;
            cout << query_f(x,y) - query_g(x,y) << endl;
        }
    	return 0;
    }
    
    • 1

    「一本通 4.2 练习 2」Balanced Lineup

    信息

    ID
    602
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    4
    上传者