E. New Year and Old Subsequence

思路:线段树维护矩阵乘法。

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
struct Matrix {
int a[5][5];
inline void init() {
memset(a, INF, sizeof a);
}
inline Matrix operator * (const Matrix & rhs) const {
Matrix res;
res.init();
for (int k = 0; k < 5; ++k) {
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
res.a[i][j] = min(res.a[i][j], a[i][k]+rhs.a[k][j]);
}
}
}
return res;
}
}tree[N<<2]; char s[N];
int n, q, l, r;
inline int push_up(int rt) {
tree[rt] = tree[rt<<1]*tree[rt<<1|1];
}
/* |2|0|1|7| */
void build(int rt, int l, int r) {
if(l == r) {
tree[rt].init();
for (int i = 0; i < 5; ++i) tree[rt].a[i][i] = 0;
if(s[l] == '2') tree[rt].a[0][1] = 0, tree[rt].a[0][0] = 1;
else if(s[l] == '0') tree[rt].a[1][2] = 0, tree[rt].a[1][1] = 1;
else if(s[l] == '1') tree[rt].a[2][3] = 0, tree[rt].a[2][2] = 1;
else if(s[l] == '7') tree[rt].a[3][4] = 0, tree[rt].a[3][3] = 1;
else if(s[l] == '6') tree[rt].a[3][3] = 1, tree[rt].a[4][4] = 1; return ;
}
int m = l+r >> 1;
build(ls);
build(rs);
push_up(rt);
}
Matrix query(int L, int R, int rt, int l, int r) {
if(L <= l && r <= R) return tree[rt];
int m = l+r >> 1;
Matrix res;
res.init();
for (int i = 0; i < 5; ++i) res.a[i][i] = 0;
if(L <= m) res = res * query(L, R, ls);
if(R > m) res = res* query(L, R, rs);
return res;
}
int main() {
scanf("%d %d", &n, &q);
scanf("%s", s+1);
build(1, 1, n);
while(q--) {
scanf("%d %d", &l, &r);
Matrix res = query(l, r, 1, 1, n);
if(res.a[0][4] == INF) printf("-1\n");
else printf("%d\n", res.a[0][4]);
}
return 0;
}

最新文章

  1. Play Framework 完整实现一个APP(七)
  2. hihoCoder#1000
  3. Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、
  4. UVA 11732 strcmp() Anyone? (压缩版字典树)
  5. 【kAri OJ 616】Asce的树
  6. OpenCV学习笔记——视频的边缘检测
  7. HTML: margin重疊現象的說明
  8. CF 500D New Year Santa Network tree 期望 好题
  9. 慕课网-安卓工程师初养成-4-4 Java条件语句之嵌套 if
  10. silverlight嵌套html不能输入中文问题
  11. 在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误Size mismatch: 4294967295;126976 70202;126976
  12. Codevs 1231 最优布线问题
  13. 一个UITableViewCell的简单动画效果
  14. ip完整验证详情
  15. 重写Fields 控制models 数据输出字段
  16. AnsibleAPI源码剖析(1)-Runner类的 初始化
  17. Linux内核线程的思考与总结
  18. 使用WebBrowser控件播放Flash网页相关问题解决方法(转)
  19. Series.str——字符串批量处理方法
  20. Python 回调函数

热门文章

  1. Word中如何加载EndNote
  2. EM算法概念
  3. addEventListener兼容性问题
  4. 判断List集合为空还是null的正确打开方式
  5. 018 Android Activity界面移入与移出的动画效果
  6. hugepage设置
  7. PAT甲级题分类汇编——计算
  8. PB笔记之数据窗口添加虚拟列的方法
  9. Dockerfile编写,以及设置一个自启动脚本
  10. Spring Bean的作用域以及lookup-method标签的使用