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\n",m,p);
    for(int i=0;i<p;i++)
    {
        printf("%d %d\n",c[i]+1,c[i]+m);
    }
}

 

posted @ 2013-12-07 21:15  cavehubiao  阅读(205)  评论(0编辑  收藏  举报