zoukankan      html  css  js  c++  java
  • Nowcoder9983I.序列的美观度(线段树+DP)

    链接:https://ac.nowcoder.com/acm/contest/9983/I
    来源:牛客网

    设一个长度为mmathit mm的序列Smathit SS的美观度等于有多少个整数imathit ii满足1≤i≤m−11leq i leq m-11im1且Si=Si+1S_{i}=S_{i+1}Si=Si+1,其中SiS_{i}Si代表序列Smathit SS的第imathit ii个元素。
    给出一个长度为nmathit nn的序列amathit aa,问在他的所有子序列美观度最大是多少。
    某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+100;
    const int M=1e6;
    int n,a[maxn],f[maxn],vis[maxn];
    struct node {
        int l,r,sum;
    }segTree[maxn<<2];
    void build (int i,int l,int r) {
        segTree[i].l=l;
        segTree[i].r=r;
        if (l==r) {
            segTree[i].sum=0;
            return;
        }
        int mid=(l+r)>>1;
        build(i<<1,l,mid);
        build(i<<1|1,mid+1,r);
        segTree[i].sum=max(segTree[i<<1].sum,segTree[i<<1|1].sum);
    }
    void up (int i,int p,int v) {
        if (segTree[i].l==p&&segTree[i].r==p) {
            segTree[i].sum=v;
            return;
        }
        int mid=(segTree[i].l+segTree[i].r)>>1;
        if (p<=mid) up(i<<1,p,v);
        if (p>mid) up(i<<1|1,p,v);
        segTree[i].sum=max(segTree[i<<1].sum,segTree[i<<1|1].sum);
    }
    int query (int i,int l,int r) {
        if (l>r) return 0;
        if (segTree[i].l>=l&&segTree[i].r<=r) return segTree[i].sum;
        int mid=(segTree[i].l+segTree[i].r)>>1;
        int ans=0;
        if (l<=mid) ans=max(ans,query(i<<1,l,r));
        if (r>mid) ans=max(ans,query(i<<1|1,l,r));
        return ans;
    }
    int main () {
        scanf("%d",&n);
        build(1,1,M);
        for (int i=1;i<=n;i++) scanf("%d",a+i);
        //f(a(i))表示以a(i)结尾的子序列的最大美观度
        for (int i=1;i<=n;i++) {
            f[a[i]]=max(query(1,1,a[i]-1),query(1,a[i]+1,M));
            if (vis[a[i]]) 
                f[a[i]]=max(query(1,a[i],a[i])+1,f[a[i]]);
            else
                vis[a[i]]=1;
            up(1,a[i],f[a[i]]);
        } 
        printf("%d
    ",query(1,1,M));
    }
  • 相关阅读:
    【NLP-09】textCNN
    【NLP-08】textRNN
    【NLP-07】GloVe(Global Vectors for Word Representation)
    【NLP-06】fastText文本分类算法
    【NLP-05】Doc2vec
    mongo用户认证
    find直接copy大于某一个时间小于某一个时间的文件
    es的settings设置详解
    py笔记第一篇
    Linux inode节点使用率过大处理办法
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14381196.html
Copyright © 2011-2022 走看看