题目链接:点击查看

题目大意:给出一个长度为n的只由数字组成的字符串,再给出m个询问,每次询问给出闭区间[l,r],求区间内想要包含“9102”,但不包含“8102”时需要删除字母的最小数目

题目分析:这个题和CF上的一个题目很像,只不过那个题是需要包含2018而不包含2017,乍一看只是年份不一样,其实还与他的顺序有关,先挂一个大牛的博客:点击查看

上面的博客中详细的解释了2018和2017那道题的做法,在这里我再简单总结一下,就是开一个线段树,每个节点保存的是一个矩阵,这个矩阵储存的是转移所需要付出的代价(即最小需要删除的字母数量),状态是若想要从上一个状态转移到当前状态所需要付出的代价,然后要对矩阵乘法进行重定义,定义为c[i][j]=min(a[i][k]+b[k][j]);说起来可能比较抽象,实际上可以将2018分为五个状态:∅,2,20,201,2018,分别编号为1,2,3,4,5,共五个状态,每一种状态都只能由前一种状态转移而来,转移也是需要付出相应的代价,而到了2017时,只能由201或2018这两个状态转移而来,但题目中不允许出现2017,所以我们需要将最后一位的7删除,整体就是这么一个转移的思路。

而在这个题目中,给出的字符串是第一个字母不同,我们就会类比到刚才的那个题目中去,我们可以先将字符串翻转一下,然后再将区间翻转,因为字符串长度为n,所以很容易找到对应的关系,反转前的区间若是[l,r],那么反转后的区间就变成了[n+1-r,n+1-l],这样就能对反转的数组进行上述动态转移了。

上代码了:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;string str;const int M=5;struct Ma
{int a[M][M];Ma(){memset(a,inf,sizeof(a));}Ma operator*(const Ma& b)const{Ma ans;for(int i=0;i<M;i++)for(int j=0;j<M;j++)for(int k=0;k<M;k++)ans.a[i][j]=min(ans.a[i][j],a[i][k]+b.a[k][j]);return ans;}
};struct Node
{int l,r;Ma a;
}tree[N<<2];void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(l==r){for(int i=0;i<M;i++)tree[k].a.a[i][i]=0;if(str[l]=='2'){tree[k].a.a[0][0]=1;tree[k].a.a[0][1]=0;}if(str[l]=='0'){tree[k].a.a[1][1]=1;tree[k].a.a[1][2]=0;}if(str[l]=='1'){tree[k].a.a[2][2]=1;tree[k].a.a[2][3]=0;}if(str[l]=='9'){tree[k].a.a[3][3]=1;tree[k].a.a[3][4]=0;}if(str[l]=='8'){tree[k].a.a[3][3]=1;tree[k].a.a[4][4]=1;}return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);tree[k].a=tree[k<<1].a*tree[k<<1|1].a;
}Ma query(int k,int l,int r)
{if(tree[k].l>=l&&tree[k].r<=r)return tree[k].a;int mid=tree[k].l+tree[k].r>>1;if(mid>=r)return query(k<<1,l,r);else if(mid<l)return query(k<<1|1,l,r);elsereturn query(k<<1,l,r)*query(k<<1|1,l,r);
}int main()
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){cin>>str;reverse(str.begin(),str.end());str=" "+str;build(1,1,n);while(m--){int x,y;scanf("%d%d",&x,&y);int l=n+1-y;int r=n+1-x;Ma temp=query(1,l,r);int ans;if(temp.a[0][4]>n)ans=-1;elseans=temp.a[0][4];printf("%d\n",ans);}}return 0;
}

2019ICPC(南昌) - Hello 2019(动态规划+线段树维护矩阵)相关推荐

  1. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  2. CodeForces - 1252K Addition Robot(线段树维护矩阵)

    题目链接:点击查看 题目大意:给出一个只由 A 和 B 组成的字符串 s ,需要完成 m 次操作,每次操作分为两种类型: 1 l r :将 [ l , r ] 内的字符串 A 变成 B,B 变成 A ...

  3. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  4. CF719E. Sasha and Array [线段树维护矩阵]

    CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...

  5. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  6. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  7. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  8. [SDOI2011]染色 (线段树维护子段问题+树剖)

    题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...

  9. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

最新文章

  1. mysql 5.7 收费_MySQL5.7 常用用户操作
  2. freopen - C/C++文件输入输出利器
  3. vs2005打开vs2008
  4. 人形AI捉迷藏惊煞网友:飞檐走壁纯靠自学,表情丰富还会合作,姚班学霸吴翼参与...
  5. memcpy,_tcscpy_s的使用
  6. 11-jQuery的事件绑定和解绑
  7. 绘画软件优动漫PAINT系统要求
  8. 批量选中删除(包含全选)---jsp,servlet
  9. P2280 [HNOI2003]激光炸弹
  10. 南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...
  11. 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
  12. SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
  13. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
  14. 告别IE给我们的web开发带来的困扰(使用chrome frame v8引擎)
  15. tp801单板微型计算机是什么,给TP801单板机配接RX—80打印机
  16. Luogu3825[NOI2017] 游戏
  17. web渗透测试----30、0day漏洞
  18. 帝国cms模板 php代码 效率,帝国cms模板开发常用技巧总结
  19. 教你一步一步用VPS
  20. java rar解压

热门文章

  1. SpringSecurity相关jar包的介绍
  2. 数据库事务原理详解-事务基本概念
  3. 通过一个图来简单描述一下 socket 链接建立以及通信的模型
  4. ActiveMQ入门-ActiveMQ跟SpringBoot整合发送接收Topic
  5. 项目中applicaiton.yml配置文件详细讲解
  6. GraphQL入门之Schema和类型规范
  7. 数据库-优化-MYSQL数据库设计规范
  8. Zookeeper_简介
  9. linux 搜索文件名中非,Linux服务器中非 root 用户安装(多版本) CUDA 和 cuDNN
  10. docker 搭建Tomcat web 简单示例过程