zoukankan      html  css  js  c++  java
  • 51Nod1349 最大值

    题目看这里 

    各种离线套路题。。。

    我们考虑对每个元素都先预处理答案让后就可以O(lg n)回答了

    将元素排序后,对于两个询问i,j∈(s[k],s[k+1]]的答案是一样的,我们考虑计算当i=s[k]时的答案

    显然,当i=s[1]的时候,答案就是总区间数

    这时考虑当i->s[2]的时候有哪些区间被从答案中去掉了

    对于一个点i,令l[i]表示当前询问q下,满足区间[l[i],i]最大值大于等于当前询问q的最小的l[i](没有就为0)

    那么,当当前询问从q->q‘时,显然那些s[l[i]]=q的区间要被影响

    所以我们需要预处理出f[i]表示满足f[i]<i,s[f[i]]>s[i]且最小的f[i],当当前询问影响到i这个节点时,我们将其移动至f[i]

    那么减少的区间个数就是(i-f[i])*count[i] (count[i]表示当前询问下满足l[j]=i的j的个数)

    求出f可以用单调栈

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<queue> 
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 100010
    #define LL long long
    using namespace std;
    int n,m,s[N],v[N],c[N],f[N],w[N],t=0; LL A[N];
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
    int main(){ 
        scanf("%d",&n);
        for(int i=1;i<=n;++i){
            scanf("%d",s+i); c[i]=1; 
            q.push(make_pair(s[i],i));
        }
        memcpy(v,s,sizeof s); sort(v+1,v+1+n);
        m=unique(v+1,v+1+n)-v-1;
        for(int i=n;i;--i){
            while(t&&s[w[t]]<s[i]) f[w[t--]]=i;
            w[++t]=i;
        }
        LL S=n*(n-1ll)/2+n;
        for(int x,y,i=1;i<=m;++i){
            while(q.top().first<v[i]){
                x=q.top().second; q.pop();
                S-=(x-f[x])*(LL)c[x]; c[f[x]]+=c[x];
            }
            A[i]=S;
        }
        int q; scanf("%d",&q);
        for(int x,y;q--;){
            scanf("%d",&x);
            y=lower_bound(v+1,v+1+m,x)-v;
            printf("%lld
    ",A[y]);
        }
    }


  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477131.html
Copyright © 2011-2022 走看看