• codeforce 6D-6E(dp,线段树)


    两题都没做出来,6D的dp到现在我还是有点没理解,先留着吧。

    6E看到最后才弄懂题意,就是找出最长连续子串长度和数量。

    网上看到说用线段树(segment-tree),从来没见过的数据结构,表示查了好久

    http://dongxicheng.org/structure/segment-tree/可以参看这篇文章看看,虽说看了好像对线段树有点认识了,但是放在这题我还是没什么思路。

    后来去cf上看了看前几名提交的代码,不禁佩服实在是太精炼了。贴个吧。

    #include<cstdio>
    #include<set>
    int a[100100],c[100100],n,k,b,m,p;
    std::multiset<int> s;
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
        {
            scanf("%d",a+i);
            s.insert(a[i]);
            while(*s.rbegin()-*s.begin()>k)s.erase(s.find(a[b++]));
            if(i-b+1==m)
                c[p++]=b;
            else if(i-b+1>m)
                m=i-b+1,c[0]=b,p=1;
        }
    
        printf("%d %d
    ",m,p);
        for(int i=0;i<p;i++)
        {
            printf("%d %d
    ",c[i]+1,c[i]+m);
        }
    }
  • 相关阅读:
    12.1
    11.26
    12.5Java日报
    11.25
    11.27
    12.03
    11.28
    12.04
    如何在TortoiseGit中使用sshkeygen生成的key
    leetcode 39 组合总和
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3463245.html
Copyright © 2020-2023  润新知