关闭

口胡【NOIP2011DAY1】选择客栈

标签: noip
105人阅读 评论(0) 收藏 举报

题意

一个长度为 n 的区间,每个位置上有颜色 ci 以及代价 vi,现在问有多少个区间 [l,r] 满足 cl = cr 且lir使vip

题解

我们只考虑每一个点作为左端点时对答案的贡献,我们令nexti表示在i左边,离i最近,且vnextip的那个端点,(可以为i本身)那么i这个端点对答案的贡献就是区间[1,nexti]颜色为c[i]的个数,用前缀和搞一下就行。

代码

const
    maxn=200000;
var
    sum:array[0..maxn,0..55] of longint;
    a,next,c:array[0..maxn] of longint;
    bz:array[0..maxn] of boolean;
    i,j,k,n,m,p:longint;
        ans:int64;
begin
        {assign(input,'jzoj3025.in');
    reset(input);
    assign(output,'jzoj3025.out');
    rewrite(output);}
    readln(n,k,p);
    readln(c[1],a[1]);
    sum[1,c[1]]:=1;
        if a[1]<=p then
                bz[1]:=true;
    for i:=2 to n do
    begin
        readln(c[i],a[i]);
        for j:=0 to k-1 do
            sum[i,j]:=sum[i-1,j];
        inc(sum[i,c[i]]);
        if a[i]<=p then
            bz[i]:=true;
    end;
    for i:=1 to n do
        if bz[i] then
            break;
    k:=i;
    next[i]:=i;
    for j:=k to n do
    begin
        if bz[j] then
        begin
            next[j]:=j;
            i:=j;
        end
        else
            next[j]:=i;
    end;
    for i:=k to n do
    begin
        if next[i]=i then
            dec(ans);
        ans:=ans+sum[next[i],c[i]]
    end;
    writeln(ans);
    {close(input);
    close(output);}
end.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1162次
    • 积分:248
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论