Codeforces750E. New Year and Old Subsequence (线段树维护DP)
题意:长为2e5的数字串 每次询问一个区间 求删掉最少几个字符使得区间有2017子序列 没有2016子序列
不合法输出-1
题解:dp i,p(0-4)表示第i个数匹配到2017的p位置删掉的最少数
每次转移的状态可以用一个5X5的矩阵维护 所以用线段树维护一段连续的状态
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5; int n, m;
char s[MAXN];
struct node {
int c[5][5];
}; node add(node x, node y) {
node res;
for(int i = 0; i < 5; i++)
for(int j = 0; j < 5; j++) {
res.c[i][j] = MAXN;
for(int k = 0; k < 5; k++)
res.c[i][j] = min(res.c[i][j], x.c[i][k] + y.c[k][j]);
}
return res;
} node sum[MAXN << 2];
void build(int l, int r, int rt) {
if(l == r) {
for(int i = 0; i < 5; i++)
for(int j = 0; j < 5; j++) sum[rt].c[i][j] = (i == j) ? 0 : MAXN; if(s[l] == '2') sum[rt].c[0][1] = 0, sum[rt].c[0][0] = 1;
if(s[l] == '0') sum[rt].c[1][2] = 0, sum[rt].c[1][1] = 1;
if(s[l] == '1') sum[rt].c[2][3] = 0, sum[rt].c[2][2] = 1;
if(s[l] == '7') sum[rt].c[3][4] = 0, sum[rt].c[3][3] = 1;
if(s[l] == '6') sum[rt].c[3][3] = 1, sum[rt].c[4][4] = 1;
return;
} int mid = l + r >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
sum[rt] = add(sum[rt << 1], sum[rt << 1 | 1]);
} node query(int ql, int qr, int l, int r, int rt) {
if(ql <= l && qr >= r) return sum[rt]; int mid = l + r >> 1;
if(qr <= mid) return query(ql, qr, l, mid, rt << 1);
if(ql > mid) return query(ql, qr, mid + 1, r, rt << 1 | 1);
return add(query(ql, qr, l, mid, rt << 1), query(ql, qr, mid + 1, r, rt << 1 | 1));
} int main() {
scanf("%d%d", &n, &m);
scanf("%s", s + 1);
build(1, n, 1); for(int i = 1; i <= m; i++) {
int l, r; scanf("%d%d", &l, &r);
node res = query(l, r, 1, n, 1);
if(res.c[0][4] >= MAXN) puts("-1");
else printf("%d\n", res.c[0][4]);
}
return 0;
}
Codeforces750E. New Year and Old Subsequence (线段树维护DP)的更多相关文章
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...
- ZOJ-3349 Special Subsequence 线段树优化DP
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3349 题意:给定一个数列,序列A是一个满足|Ai-Ai-1| & ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- 【BZOJ2164】采矿 树链剖分+线段树维护DP
[BZOJ2164]采矿 Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n ...
- 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】
题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...
- 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵
题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...
- CodeForces833 B. The Bakery 线段树维护dp
题目链接:https://vjudge.net/problem/CodeForces-833B 题意:给长度为n的数组a,和一个整数k要求把数组分成连续的k段,每段的权值是该段中不同数的个数,输出最大 ...
随机推荐
- oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。
来做个实验说明该问题:1.创建个分区表SQL> create table p_range_test 2 (id number,name varchar2(100)) 3 partition by ...
- go判断字符串是否是IP地址
前言 现在有这样的需求 正文 使用net包 net包的方法可以判断是否是 ip,需要注意的是 ip 分为 ipv4 和 ipv6 此方法将 v4 和 v6 一起判断出来 address := net. ...
- uber_go_guide解析(二)
前言 接上回 正文 错误消息 Go中声明错误有几种方式 errors.New() 简单的声明静态字符串信息的错误 fmt.Errorf 可以格式化插入信息的错误 自己实现 Error() 方法 使用e ...
- Windows同一软件不同窗口如何快速切换
windows快速切换应用的快捷键是Alt + Tab 这个快捷键可以在多个应用之间快速切换,但是软件多开时,而此时我只想在同一软件内的多个窗口切换,一切换好多个窗口扑面而来,我还要去用找并用鼠标点击 ...
- [CPP] 智能指针
介绍 C++ 的智能指针 (Smart Pointers) 相关 API. C++ 中的智能指针是为了解决内存泄漏.重复释放等问题而提出的,它基于 RAII (Resource Acquisition ...
- kubernets之服务发现
一 服务与pod的发现 1.1 服务发现pod是很显而易见的事情,通过简称pod的标签是否和服务的标签一致即可,但是pod是如何发现服务的呢?这个问题其实感觉比较多余,但是接下来你就可能不这么想了 ...
- VKM5对应的BAPI或者函数
在业务上,当一个交货单创建后,可能需要使用事物VKM5进行批准(解冻)才能做后续的捡配,发货过账等操作,通过搜索引擎发现,很多人也都会问是否有对应的bapi或者函数,替代VKM5,能够自开发程序进行批 ...
- 写给 Linux 初学者的一封信
大家好,我是肖邦. 这篇文章是写给 Linux 初学者的,我会分享一些作为初学者应该知道的一些东西,这些内容都是本人从事 Linux 开发工作多年的心得体会,相信会对初学者有所帮助.如果你是 Linu ...
- ES入门及安装软件
es介绍 Elasticsearch,简称es,是一款高扩展的分布式全文检索引擎.它可以近乎实时的存储,检索数据.es是面向文档型的数据库,一条数据就是一个文档,用json做为文档序列化的格式.es是 ...
- CentOS 镜像下载地址
CentOS镜像地址:http://isoredirect.centos.org/altarch/7/isos/i386/