2019ICPC(南昌) - Hello 2019(动态规划+线段树维护矩阵)
题目链接:点击查看
题目大意:给出一个长度为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(动态规划+线段树维护矩阵)相关推荐
- 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)
题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...
- CodeForces - 1252K Addition Robot(线段树维护矩阵)
题目链接:点击查看 题目大意:给出一个只由 A 和 B 组成的字符串 s ,需要完成 m 次操作,每次操作分为两种类型: 1 l r :将 [ l , r ] 内的字符串 A 变成 B,B 变成 A ...
- HDU - 6967 G I love data structure 线段树维护矩阵 + 细节
传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...
- [SDOI2011]染色 (线段树维护子段问题+树剖)
题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...
- Can you answer these queries III (线段树维护最大子段和)
题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...
最新文章
- mysql 5.7 收费_MySQL5.7 常用用户操作
- freopen - C/C++文件输入输出利器
- vs2005打开vs2008
- 人形AI捉迷藏惊煞网友:飞檐走壁纯靠自学,表情丰富还会合作,姚班学霸吴翼参与...
- memcpy,_tcscpy_s的使用
- 11-jQuery的事件绑定和解绑
- 绘画软件优动漫PAINT系统要求
- 批量选中删除(包含全选)---jsp,servlet
- P2280 [HNOI2003]激光炸弹
- 南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...
- 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
- SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
- listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
- 告别IE给我们的web开发带来的困扰(使用chrome frame v8引擎)
- tp801单板微型计算机是什么,给TP801单板机配接RX—80打印机
- Luogu3825[NOI2017] 游戏
- web渗透测试----30、0day漏洞
- 帝国cms模板 php代码 效率,帝国cms模板开发常用技巧总结
- 教你一步一步用VPS
- java rar解压