2018.07.22 codeforces750E(线段树维护状态转移)
传送门
给出一个数字字串,给出若干个询问,询问在字串的一段区间保证出现2017" role="presentation" style="position: relative;">20172017而不出现2016" role="presentation" style="position: relative;">20162016需要删去的最少字符。
下面定义5个状态。
状态0:连2都没有
状态1:只有2,没有0连在后面
状态2:出现20,没有1连在后面
状态3:出现201,没有7连在后面
状态4:出现2017
这样每次询问时,用f[i][j]" role="presentation" style="position: relative;">f[i][j]f[i][j]表示从状态i" role="presentation" style="position: relative;">ii转移到状态j" role="presentation" style="position: relative;">jj所需的最小费用,不难发现这个东西是可以进行合并的,因此可以使用线段树来维护。
但要注意6的处理情况,显然6的出现只会影响到状态3和状态4,所以简单更新一下就可以了。
代码如下:
#include<bits/stdc++.h>
#define N 200005
#define inf 0x3f3f3f3f
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
struct Node{
int l,r,f[5][5];
inline void create(int x){
for(int i=0;i<=4;++i)
for(int j=0;j<=4;++j)
f[i][j]=(i==j?0:inf);
switch(x){
case -1:{for(int i=0;i<=4;++i)f[i][i]=inf;break;}
case 2:{f[0][0]=1,f[0][1]=0;break;}
case 0:{f[1][1]=1,f[1][2]=0;break;}
case 1:{f[2][2]=1,f[2][3]=0;break;}
case 7:{f[3][3]=1,f[3][4]=0;break;}
case 6:{f[3][3]=1,f[4][4]=1;break;}
}
}
}T[N<<2];
int n,m,num[N];
char s[N];
inline Node merge(Node a,Node b){
Node ret;
ret.create(-1);
ret.l=a.l,ret.r=b.r;
for(int i=0;i<=4;++i)
for(int j=0;j<=4;++j)
for(int k=0;k<=4;++k)
ret.f[i][j]=min(ret.f[i][j],a.f[i][k]+b.f[k][j]);
return ret;
}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r){T[p].create(num[l]);return;}
build(lc,l,mid),build(rc,mid+1,r);
T[p]=merge(T[lc],T[rc]);
}
inline Node query(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr)return T[p];
if(qr<=mid)return query(lc,ql,qr);
if(ql>mid)return query(rc,ql,qr);
return merge(query(lc,ql,mid),query(rc,mid+1,qr));
}
int main(){
scanf("%d%d%s",&n,&m,s+1);
for(int i=1;i<=n;++i)num[i]=s[i]-'0';
build(1,1,n);
while(m--){
int l,r;
scanf("%d%d",&l,&r);
Node ans=query(1,l,r);
printf("%d\n",ans.f[0][4]==inf?-1:ans.f[0][4]);
}
return 0;
}
2018.07.22 codeforces750E(线段树维护状态转移)的更多相关文章
- Codeforces750E. New Year and Old Subsequence (线段树维护DP)
题意:长为2e5的数字串 每次询问一个区间 求删掉最少几个字符使得区间有2017子序列 没有2016子序列 不合法输出-1 题解:dp i,p(0-4)表示第i个数匹配到2017的p位置删掉的最少数 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
- 洛谷P4243/bzoj1558 [JSOI2009]等差数列(线段树维护差分+爆炸恶心的合并)
题面 首先感谢这篇题解,是思路来源 看到等差数列,就会想到差分,又有区间加,很容易想到线段树维护差分.再注意点细节,\(A\)操作完美解决 然后就是爆炸恶心的\(B\)操作,之前看一堆题解的解释都不怎 ...
- hdu 5068 线段树维护矩阵乘积
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
随机推荐
- 微信公众平台开发者认证,node
纯属分享 app.js var express = require('express'); var path = require('path'); var app = express(); ; var ...
- Simple2D-14(音乐播放器)简介
接下来文章中,会介绍一个简单的程序——音乐播放器.通过编写一个音乐播放器在 Simple2D 中加入两个库:音频库 bass 和界面库 ImGui. 下面是音乐播放器的预览图: 播放器的功能比较简单, ...
- 在eclipse中创建maven项目,亲测有效,详细步骤
一.想要使用maven,首先要配置本地maven的环境 1.在http://maven.apache.org/download.cgi中去下载maven 2. 3.下载完毕后将压缩包解压到自己记住的位 ...
- 通过python构建集中式的病毒扫描机制
Clam AntiVirus(Clam AV)是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux.Uinux系统提供病毒扫描查杀pyClamad ...
- Haskell语言学习笔记(28)Data.Map
Map Prelude> import Data.Map as Map Prelude Map> :set -XOverloadedLists Prelude Map> Overlo ...
- 吴裕雄 实战PYTHON编程(4)
import hashlib md5 = hashlib.md5()md5.update(b'Test String')print(md5.hexdigest()) import hashlib md ...
- python处理分隔大文件
4个.sql格式的文件,2G大小,直接插入mysql数据中,文件太大了,导入不进去. 太大的文件用python处理也很麻烦,处理不了,只能先分隔成小文件处理. 文件中数据格式:其中values里面的数 ...
- html资源 链接
http://m.aicai.com/index.do?agentId=1&vt=5
- Concurrency and Race Conditions
1.当多个线程访问共享硬件或软件资源的任何时候,由于线程之间可能产生对资源的不一致观察,所以必须显式管理对资源的访问. 2.内核中的并发管理设施: (1). 信号量: P操作将信号量的值减 1 ,判断 ...
- Containerpilot 配置文件 之 Watches
watch是在consul进行监视的服务配置. watch轮询服务的状态,并在服务变得健康,变得不健康或者实例数量发生变化时发出事件. 请注意,watch不包括行为; watch只发出事件,以便job ...