Codeforces Good Bye 2016 E. New Year and Old Subsequence
题意:
给出一个长度为\(n\)的串,现在有\(q\)个询问,每个询问是一个区间\([l,r]\),要回答在区间\([l,r]\)中,最少需要删多少个数,满足区间中包含\(2017\)的子序列而不包含\(2016\)的子序列。
思路:
- 先不考虑多个询问,那么这个问题区间\(dp\)可以解决,状态定义中要附加状态转移的代价。
- 比如当前数字为\(7\),那么显然从状态\(201\)转移过来需要\(0\)的花费;但如果不要\(7\),那么从状态\(201\)到状态\(201\)则需要\(1\)的花费。
- 同理,若数字为\(6\)时,若前面处于状态\(201\)或者\(2017\),显然此时的状态只能保持不能发生其它转移,但是保持也需要\(1\)的代价才行。
- 以上我们定义的是将\(0,1,2,3,4\)分别表示状态\(\empty,2,20,201,2017\),对于每个数的状态转移都有确定的代价,这好像叫有限状态自动机?
- 考虑多个询问,因为每个询问是多个区间的问题,所以我们可以想到用线段树来保存区间信息,也就是说直接把\(dp\)挂树上去就行了。(区间\(dp\)支持区间合并)
妙啊。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 200005;
int n, q;
char s[N];
struct node{
int a[5][5];
node() { memset(a, INF, sizeof(a)); }
node operator + (const node &other) const {
node res;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
for(int k = 0; k < 5; k++) {
res.a[i][j] = min(res.a[i][j], a[i][k] + other.a[k][j]);
}
}
}
return res;
}
}tr[N << 2];
void build(int o, int l, int r) {
if(l == r) {
tr[o] = node();
for(int i = 0; i < 5; i++) tr[o].a[i][i] = 0;
if(s[l] == '2') tr[o].a[0][1] = 0, tr[o].a[0][0] = 1;
if(s[l] == '0') tr[o].a[1][2] = 0, tr[o].a[1][1] = 1;
if(s[l] == '1') tr[o].a[2][3] = 0, tr[o].a[2][2] = 1;
if(s[l] == '7') tr[o].a[3][4] = 0, tr[o].a[3][3] = 1;
if(s[l] == '6') tr[o].a[3][3] = tr[o].a[4][4] = 1;
return;
}
int mid = (l + r) >> 1;
build(o << 1, l, mid); build(o << 1|1, mid + 1, r);
tr[o] = tr[o << 1] + tr[o << 1|1];
}
node query(int o, int l, int r, int L, int R) {
if(L <= l && r <= R) return tr[o];
int mid = (l + r) >> 1;
if(R <= mid) return query(o << 1, l, mid, L, R);
if(L > mid) return query(o << 1|1, mid + 1, r, L, R);
return query(o << 1, l, mid, L, R) + query(o << 1|1, mid + 1, r, L, R);
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> q;
cin >> s + 1;
build(1, 1, n);
while(q--) {
int l, r; cin >> l >> r;
node ans = query(1, 1, n, l, r);
cout << (ans.a[0][4] > n ? -1 : ans.a[0][4]) << '\n';
}
return 0;
}
Codeforces Good Bye 2016 E. New Year and Old Subsequence的更多相关文章
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- Codeforces Good Bye 2016 题解
好久没有fst题了...比赛先A了前4题然后发现room里有人已经X完题了没办法只能去打E题,结果差一点点打完...然后C题fst掉了结果就掉rating 了...下面放题解 ### [A. New ...
- Codeforces Good Bye 2016 D 模拟搜索?
给出烟花的爆炸方式和爆炸次数 问最后有多少个格子会被炸到 如果dfs的话会超时... 利用模拟每一层来搜索..? 思想就是一开始有一个爆炸点向上 然后模拟完第一段 会产生一个爆炸点 朝两个方向 就用v ...
- CodeForces Good Bye 2016
A题,水题略过. B题,也水,但是想复杂了.只要运动超出[0,20000]的范围就算不可能了. C题,我自己的方法是解不等式,然后取最大的答案即可.代码如下: #include <stdio.h ...
- Codeforces Good Bye 2015 A. New Year and Days 水题
A. New Year and Days 题目连接: http://www.codeforces.com/contest/611/problem/A Description Today is Wedn ...
- Codeforces:Good Bye 2018(题解)
Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...
- Good Bye 2016 - D
题目链接:http://codeforces.com/contest/750/problem/D 题意:新年烟花爆炸后会往两端45°差分裂.分裂完后变成2部分,之后这2部分继续按这种规则分裂.现在给你 ...
- Good Bye 2016 - C
题目链接:http://codeforces.com/contest/750/problem/C 题意:在CF中,每个人都有个Rank值. 当Rank>=1900时,为DIV1.Rank< ...
- Good Bye 2016 - B
题目链接:http://codeforces.com/contest/750/problem/B 题意:地球的子午线长度为40000,两极点的距离为20000.现在你从北极出发,按照题目输入方式来走. ...
随机推荐
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- Linux性能优化实战学习笔记:第五十八讲
一.上节回顾 专栏更新至今,咱们专栏最后一部分——综合案例模块也要告一段落了.很高兴看到你没有掉队,仍然在积极学习思考.实践操作,并热情地分享你在实际环境中,遇到过的各种性能问题的分析思路以及优化方法 ...
- [LeetCode] 913. Cat and Mouse 猫和老鼠
A game on an undirected graph is played by two players, Mouse and Cat, who alternate turns. The grap ...
- MySQL学习记录(导入Excel表到数据库,并筛选条件输出)
附上:重置mysql账号密码方法 ubuntu系统下mysql重置密码和修改密码操作 - skh2015java的博客 - CSDN博客(改完重启,登录mysql要root/sudo权限) Cento ...
- luogu P5606 小 K 与毕业旅行 - 构造 - 多项式
题目传送门 传送门 先考虑 $a_i > 0$ 的情况.考虑构造这样一个顺序:$a_i$ 要么和后面的数的乘积都大于 $w$ 要么都小于等于 $w$. 这个构造可以这样做: vector< ...
- Oracle--RMAN Recover 缺失的归档操作
一,环境简介 Oracle RMAN 备份的恢复分2个步骤:RESTRE 和 RECOVER.在这里回复的时候是依赖者归档文件的,当周一完成数据全备,保留归档的情况下,后期数据有问题,恢复的时候发现少 ...
- Intellij IDEA使用一 创建javaweb项目并配置tomcat
一.新建Java web项目 参考:https://blog.csdn.net/chengtengfei352/article/details/79211619 1.点击创建新项目 2. 3.crea ...
- PHP获取cookie、Token、模拟登录、抓取数据、解析生成json
本文介绍使用PHP获取cookie,获取Token.以及模拟登录.然后抓取数据.最后解析生成json的的过程. 0. 设置Cookie路径 set_time_limit(0); //使用的cookie ...
- mgcp的alg功能实现
刚吃了一碗还算正宗的潮汕牛筋丸粿条和一颗卤蛋,算是给自己的生日礼物. 这一周工作只围绕了一个主题“mgcp的alg功能实现”. 1. 应用场景: 一台运行mgcp语音协议的终端设备,经过一台路由器到达 ...
- The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector.
springboot 表单体积过大时报错: The multi-part request contained parameter data (excluding uploaded files) tha ...