讲道理好久没有做过题了..


题目大意

给出长度为$n$的只含数字的串,有$q$个询问,每次询问一段区间,问最少删去多少个数才能变成只含2017子序列而不含2016子序列


吉爸爸好强啊..

定义$a_{i,j}$表示该区间从第$i$位匹配不了第$j$位最少要删去的数字数

这个东西用一个线段树或者st表来维护,合并是类似于矩阵乘法的..

根据吉爸爸的优化,对于一个询问区间$[l,r]$

因为一定需要一个7,所以把它分成两段,就像这样

l...最后一个7...r

那么前面一段只需要求出从第一位但是匹配不了最后一位的方案数,再加上后面那一段6的个数就是答案了..


code

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int Maxn = 200010;
const int lg = 20;
const int inf = 0x7fffffff;
struct node {
int a[4][4];
void clear (){ memset ( a, 63, sizeof (a) ); }
}f[Maxn][lg], p;
int n, m;
char s[Maxn];
int bit[Maxn], pre[Maxn], sum[Maxn];
int _min ( int x, int y ){ return x < y ? x : y; }
void merge ( node &ret, node x, node y ){
ret.clear ();
int i, j, k;
for ( i = 0; i < 4; i ++ ) for ( j = 0; j < 4; j ++ ) for ( k = 0; k < 4; k ++ ) ret.a[i][j] = _min ( x.a[i][k]+y.a[k][j], ret.a[i][j] );
}
int getans ( int l, int r ){
int len = r-l+1;
p.clear ();
p.a[0][0] = p.a[1][1] = p.a[2][2] = p.a[3][3] = 0;
while ( len > 0 ){
merge ( p, p, f[l][bit[len]] );
l += (1<<bit[len]);
len -= (1<<bit[len]);
}
return p.a[0][3];
}
int main (){
int i, j, k;
scanf ( "%d%d", &n, &m );
scanf ( "%s", s+1 );
bit[1] = 0;
for ( i = 2; i <= n; i ++ ) bit[i] = bit[i>>1]+1;
for ( i = 1; i <= n; i ++ ){
if ( s[i] == '6' ) sum[i] = sum[i-1]+1; else sum[i] = sum[i-1];
if ( s[i] == '7' ) pre[i] = i; else pre[i] = pre[i-1];
}
for ( i = 1; i <= n; i ++ ){
f[i][0].clear ();
f[i][0].a[0][0] = f[i][0].a[1][1] = f[i][0].a[2][2] = f[i][0].a[3][3] = 0;
if ( s[i] == '2' ) f[i][0].a[0][1] = 0, f[i][0].a[0][0] = 1;
if ( s[i] == '0' ) f[i][0].a[1][2] = 0, f[i][0].a[1][1] = 1;
if ( s[i] == '1' ) f[i][0].a[2][3] = 0, f[i][0].a[2][2] = 1;
if ( s[i] == '6' ) f[i][0].a[3][3] = 1;
}
for ( i = n; i >= 1; i -- ){
for ( j = 1; j <= 18 && i+(1<<(j-1)) <= n; j ++ ){
merge ( f[i][j], f[i][j-1], f[i+(1<<(j-1))][j-1] );
}
}
for ( i = 1; i <= m; i ++ ){
int l, r;
scanf ( "%d%d", &l, &r );
k = pre[r];
int ans = getans ( l, k-1 );
if ( ans > n ) printf ( "-1\n" );
else printf ( "%d\n", ans+sum[r]-sum[k] );
}
return 0;
}

哎好久没打都有点生疏了.. 加油吧..

CF750E New Year and Old Subsequence的更多相关文章

  1. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  2. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  3. 【CF750E】New Year and Old Subsequence

    题目大意:给定一个长度为 N 的字符串,定义一个字串是"好的",当且仅当字串中含有一个 "2017" 的子序列,且不含有 "2016" 的子 ...

  4. [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...

  5. [LeetCode] Is Subsequence 是子序列

    Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...

  6. [LeetCode] Wiggle Subsequence 摆动子序列

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...

  7. [LeetCode] Increasing Triplet Subsequence 递增的三元子序列

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

  8. [LeetCode] Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

随机推荐

  1. phpcms调取数据库的两种机制

    在phpcms中,模板调取后台的数据有两种机制: 1.在控制器中定义数据,在模板中直接调用. 2.标签机制.即在模块的classes/tag.class中定义标签类,然后在模板中用标签调用 两种调用机 ...

  2. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  3. 2016 Google code jam 答案

    二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...

  4. 解决JSP页面获取的数据库数据乱码问题

    将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...

  5. HTML5 绘制简单圆形 loading. . . .

    现在有很多的 loading 组件 什么js 等等 闲来没事就写一个 H5的 loading  有很多的Loading 是一张张图片 js 控制的  有了 canvas的 出现 你就可以体验不同之处了 ...

  6. webServer-----Spring 集成cxf笔录

    目前webserver主要有俩中方式:1,传统的webserver标准集成方式-生成WSDL的xml文档.       2, 基于restful风格的webserver java RESTful We ...

  7. 从源代码剖析Mahout推荐引擎

    转载自:http://blog.fens.me/mahout-recommend-engine/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pi ...

  8. kettle系列-6.kettle实现多字段字典快速翻译

    在数据清洗转换中,常见的字典翻译,如性别在原表中是1(男).2(女)等,类似还有很多较大的字典需要翻译,若同一个表中有很多个字典需要翻译,采用[数据库查询]方式翻译的话效率就会相当低下. 这里采用ja ...

  9. 第一次使用UML的感觉

    刚开始接触的时候,其实我内心是拒绝的,因为感觉这种软件之前接触过,觉得就是相当于思维导图那种的. 可当自己使用的时候,觉得大纲总体上是类似是规划方向的,可是细节却让人深思,用什么图标,特别是用什么线, ...

  10. 如何获取苹果手机的UDID

    获取苹果手机的UDID有很多种,比如Xcode,iTunes等等吧,个人比较推荐使用iTunes,因为比较官方,而且苹果电脑自带的有,而且Windows也可以下载安装. 1.下载安装itunes(点击 ...