一个很显然的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]);
}

  

转载于:https://www.cnblogs.com/hfctf0210/p/10475116.html

CF1129D Isolation(分块+DP)相关推荐

  1. B-Donut Drone(循环/分块/DP)

    B - Donut Drone 这是一道神题,其中蕴含的思维很巧妙. 在一个循环的二维矩阵中,每个点有一个权值,然后每次一个点只能向右上.正右和右下三个地方中权值最大的地方移动,要求支持两类操作,一种 ...

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

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

  3. 【51Nod1386】双马尾机器人(分块+dp)

    对于这种找互质的数的集合的题,一般是讨论每个数的质因子会不会有重复. 听说这种互质的题把质因子分为小于 n\sqrt{n}n​ 和大于 n\sqrt{n}n​ 是经典套路? 因为当 nnn 很小的时候 ...

  4. CF1603C-Extreme Extension【整除分块,dp】

    正题 题目链接:http://codeforces.com/contest/1603/problem/C 题目大意 定义一个序列aaa的f(a)f(a)f(a)为你每次可以将序列中的一个数zzz分裂成 ...

  5. Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块

    题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...

  6. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  7. 2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))

    A-XOR SUM 通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位 0^1^2^3==0   4^5^6^7=0 #include<bits/std ...

  8. [CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

    problem codeforces 对于给定的正整数 l≤l\leql≤,定义 c(l,r)c(l,r)c(l,r) 为满足下列条件的正整数对 (i,j)(i,j)(i,j) 的数量: l≤i≤j≤ ...

  9. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)

    problem CodeForces solution observation1:\text{observation1}:observation1: 对于一个非空子段 [l,r][l,r][l,r], ...

最新文章

  1. Mysql高级调优篇——第五章:Sql调优在面试中深度剖析
  2. 一个后台开发工程师的“窦娥冤”!
  3. makefile文件编写_九图记住Makefile
  4. cross-entropy函数
  5. 踏上Silverlight的征程 体验Silverlight之美
  6. THREEJS - 点击/拾取
  7. java短信_java发送短信的实现步骤
  8. 微信机器人 DIY 从 0 到 1
  9. 佳能打印机扫描文件到电脑显示设置计算机,电脑教程:佳能打印机怎么扫描文件到电脑...
  10. 专访「算法之父」Michael Saunders:人工智能未来的突破点可能在自动驾驶
  11. 安卓接入讯飞语音识别
  12. 二维码制作方法有哪些?教你简单的二维码制作方法
  13. 借鉴-牛人开发的网络搜索工具
  14. 基于ROS2开发的点云体素化
  15. Windows7下网上银行U盾无法使用的解决办法
  16. wix图片导入设置_奇葩史的奇葩事 | [译]:WiX Toolset入门——内置的WixUI界面使用配置...
  17. 扒一扒Xcode中的编译标识: -Werror= -Wunused-variable
  18. Cornerstone的分支问题Merge dry run failed: working copy is too old
  19. Param ‘serviceName‘ is illegal, serviceName is blank
  20. 2022最新SpringCloud Alibaba入门到精通超详细版文档,教你从0到1搭建一个微服务项目

热门文章

  1. bootstrap switch只出现一个对号_python:34.第一个只出现一次的字符位置
  2. vba 判断文本框内容是否为空_【VBA】 数据输入 Inputbox 基本语法
  3. Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL
  4. 二、Web服务器——ServletHTTPRequest笔记
  5. LeetCode 1153. 字符串转化(哈希)
  6. LeetCode 755. 倒水(模拟)
  7. LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)
  8. LeetCode 第 24 场双周赛(326/1898,前17.2%)
  9. tensor转换为图片_为大家介绍图片转换pdf的经验总结!你找对方法了吗?
  10. ggplot2中显示坐标轴_qplot()——ggplot2的快速绘图