zoukankan      html  css  js  c++  java
  • ZROI2018普转提day6t1

    传送门

    分析

    记录区间最大值,线段树上二分找比这个点大的最靠前位置即可

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int Ans,d[4004000];
    long long tot;
    inline void update(int le,int ri,int wh,int pl,int k){
        if(le==ri){
          d[wh]=k;
          return;
        }
        int mid=(le+ri)>>1;
        if(mid>=pl)update(le,mid,wh<<1,pl,k);
          else update(mid+1,ri,wh<<1|1,pl,k);
        d[wh]=max(d[wh<<1],d[wh<<1|1]);
    }
    inline void q(int le,int ri,int wh,int x,int y,int k){
        if(x>y)return;
        if(le==ri){
          Ans=le;
          return;
        }
        int mid=(le+ri)>>1;
        if(mid>=x&&d[wh<<1]>k)q(le,mid,wh<<1,x,y,k);
        if(Ans>mid&&mid<y&&d[wh<<1|1]>k)q(mid+1,ri,wh<<1|1,x,y,k);
    }
    int main(){
        int n,m,i,j,k;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
          int x;
          scanf("%d",&x);
          Ans=i;
          q(1,n,1,1,i-1,x);
          tot+=(i-Ans);
          update(1,n,1,i,x);
        }
        printf("%lld
    ",tot);
        return 0;
    }
  • 相关阅读:
    「搬运」影魔
    「不会」斯特林数
    「不会」二项式反演
    「不会」插头dp
    「不会」主定理
    「不会」网络流
    接口和抽象类的区别
    TestNG常用注解
    九九乘法表-Java
    冒泡排序和选择排序--Java
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9889699.html
Copyright © 2011-2022 走看看