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段,每段的权值是该段中不同数的个数,输出最大 ...
随机推荐
- Jetbrains系列产品重置试用方法
0x0. 项目背景 Jetbrains家的产品有一个很良心的地方,他会允许你试用30天(这个数字写死在代码里了)以评估是否你真的需要为它而付费.但很多时候会出现一种情况:IDE并不能按照我们实际的试用 ...
- 获取微信Token值
/** * 获取Token值 * @param $corpid * @param $corpsecret * @return mixed * @author 宁佳兵 <meilijing.nin ...
- 切换用户后whoami打印用户的问题
问题: 为何第二个whoami打印的还是root? root@localhost /]# [root@localhost /]# [root@localhost /]# more test.sh #! ...
- 【原创】X86_64汇编、寄存器、内嵌汇编
整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...
- 【Java】Java注释 - 单行、块、文档注释
简单记录,Java 核心技术卷I 基础知识(原书第10 版) 注释 我们在编写程序时,经常需要添加一些注释,用来描述某段代码的作用,提高Java源程序代码的可读性,使得Java程序条理清晰. 写代码的 ...
- 同一个网段内所有服务器virtual_router_id设置相同的后果
/var/log/messages中一直报的错 one or more VIP associated with VRID mismatch actual MASTER advert bogus VRR ...
- Nacos使用和注册部分源码介绍
Nacos简单介绍 Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos帮助您更敏捷和容易地构建. ...
- CSAPP:Lab1 -DataLab 超详解
写在前面 之前考研的时候csapp的书有刷过5,6遍,所以对书本知识还算比较了解.恰逢最近在学c++的时候,顺带刷一下大名鼎鼎的csapp实验. 0. 环境准备 最好准备一个纯净的Linux系统这里建 ...
- 入门OJ:郭嘉的消息传递
题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...
- ES6在工作中会用到的核心知识点讲解
一.var, let, const 谈到ES6,估计大家首先肯定会想到var,let,const 咱就先谈谈这三者的区别 var a = 3; { var a = 4; } console.log(a ...