zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    p1373
    考试总结 2018-5-6
    p1044与p1898
    p1905
    p1904 p1903
    p1177
    p1273  日常打表
    p1142
    并查集与并查集模板
    p1265
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3463245.html
Copyright © 2011-2022 走看看