题意:要找到一个字符串里面存在子序列9102 而不存在8102 输出最小修改次数

思路:对于单次询问 我们可以直接区间dpOn求出最小修改次数 但是对于多次询问 我在大部分题解看到的解释一般是用线段树维护每一个区间段 每一个区间上挂一个dp[5][5]的矩阵 表示从i状态转移到j状态索要的最小修改次数 转移的时候就可以像区间dp一样 通过两个子区间合并 跟新答案。

#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int N = 2e5+7;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
typedef long long ll;
const ll mod = 10007;
char s[N];
struct tree{
int dp[5][5];
}t[N<<2];
int L[N<<2],R[N<<2];
tree mul(tree a,tree b){
tree tmp;
memset(tmp.dp,inf,sizeof(tmp.dp));
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
tmp.dp[i][j]=min(tmp.dp[i][j],a.dp[i][k]+b.dp[k][j]);
return tmp;
}
void build(int p,int l,int r){
L[p]=l; R[p]=r;
// memset(t[p].dp,inf,sizeof(t[p].dp));
if(l==r){
memset(t[p].dp,inf,sizeof(t[p].dp));
for(int i=0;i<5;i++) t[p].dp[i][i]=0;
if(s[l]=='2'){
t[p].dp[0][0]=1; t[p].dp[0][1]=0;
}else if(s[l]=='0'){
t[p].dp[1][1]=1; t[p].dp[1][2]=0;
}else if(s[l]=='1'){
t[p].dp[2][2]=1; t[p].dp[2][3]=0;
}else if(s[l]=='9'){
t[p].dp[3][3]=1; t[p].dp[3][4]=0;
}else if(s[l]=='8'){
t[p].dp[3][3]=1; t[p].dp[4][4]=1;
}
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p]=mul(t[p<<1],t[p<<1|1]);
}
tree query(int p,int l,int r){
if(l<=L[p]&&R[p]<=r){
return t[p];
}
int mid=(L[p]+R[p])>>1;
tree ans1,ans2;
memset(ans1.dp,inf,sizeof(ans1.dp));
memset(ans2.dp,inf,sizeof(ans2.dp));
if(r<=mid) return query(p<<1,l,r);
if(l>mid) return query(p<<1|1,l,r);
return mul(query(p<<1,l,r),query(p<<1|1,l,r));
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
int n,Q; scanf("%d%d",&n,&Q);
scanf("%s",s+1);
reverse(s+1,s+1+n);
// printf("%s\n",s+1);
build(1,1,n);
// cout<<t[1].dp[0][4]<<endl;
for(int i=1;i<=Q;i++){
int l,r; scanf("%d%d",&l,&r);
// cout<<n-r+1<<" "<<n-l+1<<endl;
tree ans=query(1,n-r+1,n-l+1);
printf("%d\n",ans.dp[0][4]==inf?-1:ans.dp[0][4]);
}
}

The 2019 Asia Nanchang First Round Online Programming Contest C. Hello 2019(动态dp)的更多相关文章

  1. The 2019 Asia Nanchang First Round Online Programming Contest

    传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...

  2. The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)

    题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...

  3. The 2019 Asia Nanchang First Round Online Programming Contest E. Magic Master

    题目链接:https://nanti.jisuanke.com/t/41352 题目意思还是好理解的,看过的人不多,感觉是被通过量吓到了.其实就是个水题,反向模拟就好了, 用队列模拟,反向模拟,它要放 ...

  4. The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero

    题目链接:https://nanti.jisuanke.com/t/41349 题意:有一个灭火英雄,和一个灭火团队,一个人与一个团队比较. 灭火英雄到其他灭火点的最短路最大值,与一个团队到其他灭火点 ...

  5. The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item

    The Nth Item 思路: 先用特征根法求出通向公式,然后通向公式中出现了\(\sqrt{17}\),这个可以用二次剩余求出来,然后可以O(\(log(n)\))求出. 但是还不够,我们先对\( ...

  6. H. The Nth Item(The 2019 Asia Nanchang First Round Online Programming Contest)

    题意:https://nanti.jisuanke.com/t/41355 给出N1,计算公式:A=F(N)Ni=Ni-1 ^ (A*A),F为类斐波那契需要矩阵快速幂的递推式. 求第k个N. 思路: ...

  7. E.Magic Master(The 2019 Asia Nanchang First Round Online Programming Contest)

    直接模拟orhttps://blog.csdn.net/liufengwei1/article/details/100643831

  8. The 2019 Asia Nanchang First Round Online Programming Contest(B,E)

    B. Fire-Fighting Hero 题意:一个消防员和多个队伍比赛,比较所有地方的最短路的最大值,消防员最后的值要乘1/C,求胜利的一方的最短路的最大值是多少.一直没读懂正确题意(内疚). 思 ...

  9. The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)

    This is an era of team success, but also an era of heroes. Throughout the ages, there have been nume ...

随机推荐

  1. Command2

    Ctrl^c 强制终止当前命令执行 chmod {ugoa(user/group/other/all)}{+-=(wrx权限增删改)} 文件或目录 权限 对文件 对目录 r 可查看文件内容 可以列出目 ...

  2. 通过DNSLOG回显验证漏洞

    通过DNSLOG回显验证漏洞 前言 实际渗透测试中,有些漏洞因为没有回显导致无法准确判断漏洞是否存在,可能导致渗透测试人员浪费大量精力在一个并不存在的漏洞上,因此为了验证一些无回显漏洞,可结合DNSl ...

  3. 了解一下ajax

    AJAX:是一种无需重新加载页面的情况下能够更新部分(局部更新)网页的技术. 1. 概念:ASychronous JavaScript And XML 异步的JavaScript和XML 首先了解一下 ...

  4. LeetCode 371两数之和

    题目描述: 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 思路: 既然不能使用运算符操作就要考虑到,位运算的加法. 加法有进位的时候和不进位的时候 ...

  5. Head First 设计模式 —— 12. 状态 (State) 模式

    思考题 public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; fi ...

  6. 数据库MySQL(带你零基础入门MySQL)

    (一)认识数据库 redis默认端口:6379 mysql默认端口:3306 什么是数据库? 数据库的英文单词:data base,简称DB. 数据库实际上就是一个文件集合,是一个存储数据的仓库,本质 ...

  7. CTFHub - Web(二)

    目录遍历: 法一: 依次查看目录即可: 法二: 利用脚本:  #!/usr/bin/python3  # -*- coding: utf-8 -*-  # --author:valecalida-- ...

  8. iptables原理及防火墙规则语法基础

     Iptables 防火墙 学习总结: 三张表介绍: filter负责过滤数据包,包括的规则链有,input(进),output(出)和forward(转发); nat则涉及到网络地址转换,包括的规则 ...

  9. 解决JS获取中文参数出现的乱码问题

    在代码中增加如下js函数: function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + " ...

  10. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...