南昌网络赛,是cf的原题

第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数

首先如果我们之询问一小段区间[L,R]那么显然有一个简单的三维dp可以做,状态0|1|2|3|4表示关键字一个也没有,有2,有21,有201,有2017的情况,dp[i][j]表示从状态i转移到状态j最小需要删除的字符

那么显然当s[i]=6时,有dp[3][3]=1,dp[4][4]=1

可以发现,这种状态是很好合并的,对于区间[l,mid]和区间[mid+1,r],设前一半的状态是dp1,后一半的状态是dp2,,两个区间合起来的状态是dp[l][r],那么就有dp1[l][k]+dp2[k][r]=dp[l][r]

所以我们可以直接用分治来求任意一个区间的所有状态复杂度是O(125/6nlogn)因为时间给的多,所以足够快

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f
char s[N];
int n,q; void reserve(int l,int r){
int i=l,j=r;
while(i<j){
swap(s[i],s[j]);
++i,--j;
}
} //状态0表示什么都没有,状态1表示2,状态2表示20,状态3表示201,状态4表示2019,dp[i][j]表示从i->j的代价
//因为每段相邻的段状态具有可合并性,想到用线段树分治来维护合并信息,线段树[l,r]维护[l,r]所有状态的代价,合并时类似n^3的区间dp转移
struct Node{
int dp[][];
Node(){
memset(dp,0x3f,sizeof dp);
}
}seg[N<<];
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
Node merge(Node a,Node b){
Node res;
for(int l=;l<;l++)
for(int r=;r<;r++)
for(int k=;k<;k++)
res.dp[l][r]=min(res.dp[l][r],a.dp[l][k]+b.dp[k][r]);
return res;
}
void build(int l,int r,int rt){
if(l==r){
for(int i=;i<;i++)
seg[rt].dp[i][i]=;
if(s[l]==''){
seg[rt].dp[][]=;seg[rt].dp[][]=;
}else if(s[l]==''){
seg[rt].dp[][]=;seg[rt].dp[][]=;
}else if(s[l]==''){
seg[rt].dp[][]=;seg[rt].dp[][]=;
}else if(s[l]==''){
seg[rt].dp[][]=;seg[rt].dp[][]=;
}else if(s[l]==''){
seg[rt].dp[][]=;seg[rt].dp[][]=;
}
return;
}
int m=l+r>>;
build(lson),build(rson);
seg[rt]=merge(seg[rt<<],seg[rt<<|]);
}
Node query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return seg[rt];
int m=l+r>>;
Node res;
for(int i=;i<;i++)res.dp[i][i]=;
if(L<=m)res=merge(res,query(L,R,lson));
if(R>m)res=merge(res,query(L,R,rson));
return res;
} int main(){
cin>>n>>q;
scanf("%s",s+);
reserve(,n);
build(,n,);
while(q--){
int L,R;
scanf("%d%d",&L,&R);
L=n-L+;R=n-R+;
Node res=query(R,L,,n,);
if(res.dp[][]==INF)
puts("-1");
else cout<<res.dp[][]<<endl;
}
}

分治维护dp——19南昌网络赛C/cf750E的更多相关文章

  1. 19南昌网络赛L

    校赛打杂没施展开. 题意:一开始给你一颗 (0,0)到(0,l)的树. 这棵树每一年会长出来三个幼芽(雾),长度均为l/4,方向分别是左转60,右转60,和不变. 年份<=14 考虑3^14直接 ...

  2. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  3. dp--2019南昌网络赛B-Match Stick Game

    dp--2019南昌网络赛B-Match Stick Game Xiao Ming recently indulges in match stick game and he thinks he is ...

  4. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  5. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  6. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  7. 南昌网络赛C.Angry FFF Party

    南昌网络赛C.Angry FFF Party Describe In ACM labs, there are only few members who have girlfriends. And th ...

  8. 南昌网络赛 H The Nth Item

    南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化 注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费 #include<bits/stdc++ ...

  9. 2019 ICPC 南昌网络赛

    2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...

随机推荐

  1. POJ 2240 Arbitrage (spfa判环)

    Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of ...

  2. 测试过程中bug分类

    测试的核心任务是发现bug.在这之前是分析需求,之后是跟踪bug.跳出具体的项目来看,所有的bug无非是以下五大类. 软件没有实现应该实现的功能:如指定的登录功能. 软件出现了本应该避免的错误:如用户 ...

  3. layui.form小例子

    layui.form小例子 需要引入layui的包 <!doctype html> <html> <head> <meta charset="utf ...

  4. Android 发布自动版本号方案

    以前看到一些自动化版本号打包的文章.如果您的项目是用 Git 管理的,并且恰巧又是使用 Gradle 编译(应该绝大部分都是这样的了吧?),本文试图找到一种更加优雅的自动版本管理方法. 背景 我们都知 ...

  5. python学习笔记:数据类型——列表/数组(list)

    Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.通过下标访问列表中的元素(又称索引.角标),下标从0开始计数.list定义,使用中括号[]. l ...

  6. 点读系列《流畅的python》

    第1章 python数据模型 python的写法是由背后的魔法方法实现的,比如obj[key],解释器实际调用的是obj.__getitem__(key) 作者把魔法方法叫做双下方法,因为有两个下划线 ...

  7. 从输入url到显示网页,发生了那些事情?

    作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址 ...

  8. Centos7.6安装教程 && history设置显示执行命令的时间

    一.规划磁盘使用空间(磁盘总大小200GB) /dev/sda1 mount /boot 1G mount point /dev/sda2 mount / 100G /dev/sda3 mount / ...

  9. IDEA中将工程打包成war包及部署到Tomcat流程

    工程打包成war包及部署到Tomcat流程 再IDEA开发工具中,将工程打包成war包流程: 父pom里需要移除内置的tomcat <dependency> <groupId> ...

  10. 在idea 上springboot 1.5.6集成jsp页面

    第一步:新建一个项目 推荐使用这个,默认下一步就好, 填写自己的信息,next, , 选择使用的功能,也可以新建好之后再pom.xml里手动添加, 选择项目存放地址,一个springboot的项目就建 ...