一个很显然的DP方程式:f[i]=Σf[j],其中j<i且在[j+1,i]中出现1次的数不超过k个

乍一看挺神仙的,只会O(n^2),就是对于每个位置从后向前扫一遍,边扫边统计出现1次的数的个数。不难发现,同一个数第一次出现时cnt++,第二次出现时cnt--,后面没有变化这不是废话吗?!

于是可以考虑记录一个后缀和,s[i]表示cnt的大小,然后从当前位置开始从右向左第一次出现的值为1,第二次出现的值为-1,之后为0。修改记录lst数组表示该数上次的位置即可。然后每次走一步只对一个数产生影响,就是只对两段的s值产生影响,线段树显然不能够维护一段某个值出现的次数(实际可能能够用高级数据结构但我不会),于是可以采用暴力美学:分块!

对每一块打个标记delta[i]表示块i的变化量(整体增减才计入),cnt[i]表示位置i进行单独修改后的值,sum[i][j]表示第i个块为值为j的f值之和。暴力修改,复杂度O(n^1.5),可以通过。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7,mod=998244353;
int n,m,B,a[N],pos[N],bel[N],lst[N],f[N],cnt[N],delta[440],ans[440],sum[440][N];
void update(int u,int v)
{
int t=bel[u];
sum[t][cnt[u]]=(sum[t][cnt[u]]-f[u]+mod)%mod;
if(cnt[u]+delta[t]<=m)ans[t]=(ans[t]-f[u]+mod)%mod;
cnt[u]+=v;
sum[t][cnt[u]]=(sum[t][cnt[u]]+f[u])%mod;
if(cnt[u]+delta[t]<=m)ans[t]=(ans[t]+f[u])%mod;
}
void add(int u,int v,int w)
{
if(u>v)return;
int p=bel[u],q=bel[v];
if(p+1>=q)
{
for(int i=u;i<=v;i++)update(i,w);
return;
}
for(int i=u;bel[i]==p;i++)update(i,w);
for(int i=v;bel[i]==q;i--)update(i,w);
for(int i=p+1;i<q;i++)
{
if(w>0)if(m-delta[i]>=0)ans[i]=(ans[i]-sum[i][m-delta[i]]+mod)%mod;
delta[i]+=w;
if(w<0)if(m-delta[i]>=0)ans[i]=(ans[i]+sum[i][m-delta[i]])%mod;
}
} int main()
{
scanf("%d%d",&n,&m);
B=sqrt(n);
bel[0]=1;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),bel[i]=i/B+1;
f[0]=sum[1][0]=ans[1]=1;
for(int i=1;i<=n;i++)
{
lst[i]=pos[a[i]];
add(lst[lst[i]],lst[i]-1,-1);
add(lst[i],i-1,1);
int j=i-1;
for(int j=i-1;j>=0&&bel[i]==bel[j];j--)
if(cnt[j]+delta[bel[i]]<=m)f[i]=(f[i]+f[j])%mod;
for(int j=bel[i]-1;j;j--)f[i]=(f[i]+ans[j])%mod;
sum[bel[i]][0]=(sum[bel[i]][0]+f[i])%mod;
if(delta[bel[i]]<=m)ans[bel[i]]=(ans[bel[i]]+f[i])%mod;
pos[a[i]]=i;
}
printf("%d",f[n]);
}

  

CF1129D Isolation(分块+DP)的更多相关文章

  1. Codeforces Round #278 (Div. 1) D - Conveyor Belts 分块+dp

    D - Conveyor Belts 思路:分块dp, 对于修改将对应的块再dp一次. #include<bits/stdc++.h> #define LL long long #defi ...

  2. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  3. [CSP-S模拟测试]:旅行计划(分块+DP)

    题目传送门(内部题83) 输入格式 第一行两个整数$n,m$ 接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边 接下来一行有一个整数$q$,表示$q$天 接下来 ...

  4. CodeForces 103D Time to Raid Cowavans 分块+dp

    先对b从小到大sort,判断b是不是比sqrt(n)大,是的话就直接暴力,不是的话就用dp维护一下 dp[i]表示以nb为等差,i为起点的答案,可以节省nb相同的情况 #include<bits ...

  5. hdu6331 /// Floyd+分块DP

    题目大意: 给定单向图的n m 为点数和单向边数 接下来m行给定 u v w 为边的起点终点和长度 给定q 为询问个数 接下来q行给定 x y k 求从x到y至少经过k条边的最短路长度 https:/ ...

  6. P5343 【XR-1】分块(dp矩阵加速)

    \(大意是用数组a里的数字,组成一个序列,使得序列和为n的方案种数\)传送门 \(先考虑dp.\) \(但是不能直接用背包转移,因为是序列,要考虑顺序.\) \(所以,为了去重,我们令dp[i][j] ...

  7. 多校联训 DS 专题

    CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ...

  8. 51Nod1957 有限背包计数问题

    传送门 另一个传送门 这题还挺有意思…… 先贴一波出题人的题解…… (啥你说你看不见?看来你还没过啊,等着A了再看或者乖乖花点头盾好了……) 然后是我的做法……思想都是一样的,只是细节不一样而已…… ...

  9. 51Nod-1259-整数划分 V2

    51Nod-1259-整数划分 V2 将N分为若干个整数的和,有多少种不同的划分方式,例如:n = 4,{4} {1,3} {2,2} {1,1,2} {1,1,1,1},共5种.由于数据较大,输出M ...

随机推荐

  1. tomcat 与 nginx,apache的区别

    tomcat 与 nginx,apache的有什么区别 回答一: 题主说的Apache,指的应该是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx ...

  2. python numpy笔记(重要)

    1.np.array 的shape (2,)与(2,1)含义 ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中,表示数组的“行数”和“列数”. ndar ...

  3. web.xml中三种通配符及匹配规则

    一.url-pattern的三种写法 1.精确匹配.以”/”开头,加上servlet名称:    /ad  ; 2.路径匹配.以”/”开头,加上通配符”*” :    /*  ; 3.扩展名匹配.以通 ...

  4. 后台web端的react

    在api.js里,存放着各种功能引用的方法,比如这个fakeRegister,里面传参数params,返回要要调回的地址,${HOST1}/user/register requset会返回codeme ...

  5. Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  6. 基准对象object中的基础类型----元组 (五)

    object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...

  7. Android环境搭建(大学授课课件)

    前面一直没有提过如何搭建Android开发环境,其实这些网上一大堆,随便一搜就是很多大神的详细介绍.本人过于懒惰,拿出大学授课课件供大家参考.非原创 位)   下载地址: sdk:http://pan ...

  8. 【BZOJ2127】happiness 网络流

    题目描述 有\(n\times m\)个人,排成一个\(n\times m\)的矩阵.每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一 ...

  9. npm 淘宝源

    --------- npm: 淘宝源设置:npm config set registry https://registry.npm.taobao.org

  10. eclipse 保存html 提示 save could not be completed

    重启ecplise 即可