题目描述

A string tt is called nice if a string "2017" occurs in tt as a subsequence but a string "2016" doesn't occur in tt as a subsequence. For example, strings "203434107" and "9220617" are nice, while strings "20016", "1234" and "20167" aren't nice.

The ugliness of a string is the minimum possible number of characters to remove, in order to obtain a nice string. If it's impossible to make a string nice by removing characters, its ugliness is -1−1 .

Limak has a string ss of length nn , with characters indexed 11 through nn . He asks you qq queries. In the ii-th query you should compute and print the ugliness of a substring (continuous subsequence) of ssstarting at the index a_{i}ai​ and ending at the index b_{i}bi​ (inclusive).

输入输出格式

输入格式:

The first line of the input contains two integers nn and qq ( 4<=n<=2000004<=n<=200000 , 1<=q<=2000001<=q<=200000 ) — the length of the string ss and the number of queries respectively.

The second line contains a string ss of length nn . Every character is one of digits '0'–'9'.

The ii -th of next qq lines contains two integers a_{i}ai​ and b_{i}bi​ ( 1<=a_{i}<=b_{i}<=n1<=ai​<=bi​<=n ), describing a substring in the ii -th query.

输出格式:

For each query print the ugliness of the given substring.

输入输出样例

输入样例#1:

8 3
20166766
1 8
1 7
2 8
输出样例#1:

4
3
-1
输入样例#2:

15 5
012016662091670
3 4
1 14
4 15
1 13
10 15
输出样例#2:

-1
2
1
-1
-1
输入样例#3:

4 2
1234
2 4
1 2
输出样例#3:

-1
-1

说明

In the first sample:

  • In the first query, ugliness(ugliness( "20166766" )=4)=4 because all four sixes must be removed.
  • In the second query, ugliness(ugliness( "2016676" )=3)=3 because all three sixes must be removed.
  • In the third query, ugliness(ugliness( "0166766" )=-1)=−1 because it's impossible to remove some digits to get a nice string.

In the second sample:

  • In the second query, ugliness(ugliness( "01201666209167" )=2)=2 . It's optimal to remove the first digit '2' and the last digit '6', what gives a string "010166620917", which is nice.
  • In the third query, ugliness(ugliness( "016662091670" )=1)=1 . It's optimal to remove the last digit '6', what gives a nice string "01666209170".

-------------------------------------------------------------------

这是一个大坑

先把代码丢在这里,改天详细写个题解 233333

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 200100
#define INF 1e9
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
int n,m;
char s[N];
struct node
{
int a[][];
node(){
for(int i=;i<;i++)
for(int j=;j<;j++)
a[i][j]=INF;
}
}T[N<<];
char ch[]={'','','','',''};
int find (char x)//返回数字本身的愚蠢办法
{
for(int i=;i<;i++)
if(x==ch[i]) return i;
return -;
}
node pushup(node &a,node &b){
node res;
for(int i=;i<;i++)
for(int j=i;j<;j++)
for(int k=i;k<=j;k++)
res.a[i][j]=min(res.a[i][j],a.a[i][k]+b.a[k][j]);
return res;
}
void build(int p,int l,int r)
{
if(l==r)
{
int f=find(s[l]);
for(int i=;i<;i++)
T[p].a[i][i]=;//初始化——隔壁有更好的方法 //以下为转移方程初始化
if(f!=-&&f<)//l的值为2 0 1 7
{
T[p].a[f][f+]=;
T[p].a[f][f]=;
}
else if(f==)//l为6
T[p].a[][]=T[p].a[][]=;
return;
}
int mid=(l+r)>>;
build(lc,l,mid);
build(rc,mid+,r);
T[p]=pushup(T[lc],T[rc]);
}
node query(int p,int l,int r,int ql,int qr)
{
if(ql==l&&qr==r)
return T[p];
int mid=(l+r)>>;
if(qr<=mid) return query(lc,l,mid,ql,qr);
if(ql>mid) return query(rc,mid+,r,ql,qr);
else
{
node tmpl=query(lc,l,mid,ql,mid);
node tmpr=query(rc,mid+,r,mid+,qr);
return pushup(tmpl,tmpr);
}
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
build(,,n);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
int ans=query(,,n,l,r).a[][];
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}

CF750E 线段树+矩阵乘矩阵加的更多相关文章

  1. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  2. UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...

  3. ZOJ - 2671 Cryptography(线段树+求区间矩阵乘积)

    题意:已知n个矩阵(下标从1开始),求下标x~y区间矩阵的乘积.最多m次询问,n ( 1 <= n <= 30,000) and m ( 1 <= m <= 30,000). ...

  4. poj 3468 A Simple Problem with Integers (线段树 成段更新 加值 求和)

    题目链接 题意: 只有这两种操作 C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.&quo ...

  5. POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)

    题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  6. hdu 5068 线段树维护矩阵乘积

    http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...

  7. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并

    D. Vika and Segments     Vika has an infinite sheet of squared paper. Initially all squares are whit ...

  8. BZOJ 4085 丧心病狂的毒瘤题目 线段树+矩乘

    思路: 一眼矩阵快速幂 再用线段树维护一下矩阵就完了... 我hhhhh    哎我还是too young,too simple 入了这个大坑 线段树维护9个值 以上 如果A+1   转移矩阵是这个样 ...

  9. bzoj1018[SHOI2008]堵塞的交通traffic——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...

随机推荐

  1. 【简抄】h5 新增的几个背景属性和文本属性

    一.背景图像显示: ①background-size:规定背景图像的大小: 值:像素值.百分比.auto.cover.contain ②background-origin :规定背景图像的起始位置: ...

  2. 对Yii 2.0模型rules的理解(load()无法正确装载数据)

    在实际开发中,遇到数据表新增字段而忘记了在对应模型中rules规则中添加新增的字段,而导致load()方法装载不到新增字段,导致新增字段无法写入数据库中.   解决办法:在新增字段后及时在对应模型ru ...

  3. 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."

    开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...

  4. docker-java的使用

    1. docker java 的api需要证书的认证 在/home/hett文件下创建certs证书 生成服务器私钥,命令如下: $openssl genrsa -out server-key.pem ...

  5. poj 3159 Candies (差分约束)

    一个叫差分约束系统的东西.如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径. 比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c. ...

  6. Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

  7. [torch] torch.contiguous

    torch.contiguous 作用 连续存储,因为view的操作要求的是连续的内容. 详细 考虑下面的操作,transpose操作只是改变了stride,而实际数组存储的内容并没有得到任何改变,即 ...

  8. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

  9. Spring学习笔记之Spring概述

    概述   Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

  10. odoo前端

    bootstrap: http://www.runoob.com/bootstrap/bootstrap-tutorial.html javascript: http://www.runoob.com ...