Usaco 2019 Jan Platinum

  要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级。

  插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动性顺序表)

  Usaco真是慢的不行,所以就贴洛谷链接啦。

  

  Redistricting: https://www.luogu.org/problemnew/show/P5202

  题意概述:给出一个长度为N的序列,由'H'和'G'组成,将它分为任意段,每段的长度不超过 $K$ ,要求最小化(H比较少的段)的数量。$k<=n<=3 \times 10^5$

  首先可以将原序列中的G视为一,做一遍前缀和,那么就有了一个 $O(NK)$ 的朴素dp:

  $dp_i=min \{dp_j+[(s_i-s_j) \times 2 <=(i-j)]\space |\space i-j<=k \}$

  还需要一些优化,首先发现里面那个式子可以拆开,定义一个新的数组 $g_i=i-2 \times s_i$,这样只要满足 $g_i>g_j$ 就可以无代价转移,否则代价为一。所以一开始想到的是用权值线段树维护,但这样删除的时候可能会有一点麻烦,所以在线段树的叶子节点还得用单调队列维护,感觉写不动就弃了。后来又想到可以用平衡树来做,但是好像删除也有点问题,所以也弃了。这时我突然发现这道题很特殊,代价最多为1,所以可以用一个简单的单调队列来做。

  要用单调队列首先得明确一点,就是按照哪一维来弹出点。如果按照 $g$ 数组来做...很显然是不可以的。但是按照 $dp$ 数组来做,相同时再按照 $g$ 就是正确的了。解释一下原因吧:假设有两个决策点 $a$ $b$,如果 $dp[a]<dp[b]$,那么无论如何都可以从 $a$ 转移,因为 $dp$ 值都是整数,那么两个不相等的数之间至少差一,所以从 $a$ 转移不会比从 $b$ 转移更差;如果两个决策点的 $dp$ 值相等,则优先选择那个比较难产生代价的决策,正确性显然。复杂度 $O(N)$ 官方题解给的是 $O(NlogN)$ 的做法,在我的电脑上不开 $O_2$ 会 $T$,所以就不搬过来了。

  
# include <cstdio>
# include <iostream>
# include <cstring>
# define nl (n<<1)
# define nr (n<<1|1)
# define R register int

using namespace std;

const int maxn=300005;
const int inf=100000000;
int n,k,a[maxn],f[maxn],g[maxn],q[maxn],H=1,T;
char s[maxn];

void add (int x)
{
    while(H<=T&&((f[x]<f[ q[T] ])||(f[x]==f[ q[T] ]&&g[x]<=g[ q[T] ]))) T--;
    q[++T]=x;
}

void del (int x) { while (H<=T&&q[H]<=x) H++; }

int ask (int x)
{
    if(g[ q[H] ]<g[x]) return f[ q[H] ];
    return f[ q[H] ]+1;
}

int main()
{
    scanf("%d%d",&n,&k);
    scanf("%s",s+1);
    for (R i=1;i<=n;++i)
    {
        if(s[i]=='G') a[i]=a[i-1]+1;
        else a[i]=a[i-1];
        g[i]=i-2*a[i];
    }
    f[0]=0;
    for (R i=1;i<=n;++i)
    {
        add(i-1);
        if(i-k-1>=0)
            del(i-k-1);
        f[i]=ask(i);
    }
    printf("%d",f[n]);
    return 0;
}
My Code

相关文章:

  • 2022-12-23
  • 2021-08-09
  • 2021-12-01
  • 2021-09-06
  • 2021-10-30
  • 2021-05-17
  • 2021-10-06
  • 2022-12-23
猜你喜欢
  • 2021-11-09
  • 2021-11-19
  • 2022-12-23
  • 2022-12-23
  • 2021-10-24
  • 2022-12-23
相关资源
相似解决方案