南昌网络赛,是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. Java排序算法 [选择、冒泡、快排]

    选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...

  2. 【持久层】Druid简介

    Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSou ...

  3. OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一 ...

  4. AcWing 243. 一个简单的整数问题2 (树状数组)打卡

    题目:https://www.acwing.com/problem/content/244/ 题意:区间加,区间查询 思路:我们把原先那个差分数组分解一下 ∑i=1x∑j=1ib[j]=∑i=1x(x ...

  5. PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO(PDO一是PHP数据对象(PHP Data Object)的缩写),可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_ ...

  6. LR快捷键

    record optioning:录制选项——ctrl+f7 runtime setting  : 运行时设置——F4 运行脚本——F5 参数列表:ctrl+L 注释:ctrl+shift+c 选中后 ...

  7. springboot-redis相关配置整理

    1.pom.xml引入对应数据文件 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  8. selenium2-java环境搭建 示例为chrome浏览器

    首先,安装并配置JDK,安装eclipse,安装firefox和chrome.下载selenium语言的JAVA库文件,下载地址为,如果打不开,则需要翻墙:http://www.seleniumhq. ...

  9. layui弹出层回调的使用

    <%@page language="java" contentType="text/html; charset=UTF-8"%> <%@ in ...

  10. Java核心基础知识(一):概念、语法、使用、源码

    1. Java中OOP的特点? OOP(Object Oriented Programming):面向对象编程.具有封装.继承.多态三大特征. 封装:解决数据安全性问题: 继承:解决代码的重用性问题: ...