Luogu_CF750E New Year and Old Subsequence

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200010;
const int INF=1e9;
char s[N];
struct Node{
	int m[5][5];
	Node operator + (Node x){
		Node ans;
		for(int i=0;i<5;i++)
			for(int j=i;j<5;j++){
				ans.m[i][j]=INF;
				for(int k=i;k<=j;k++)ans.m[i][j]=min(ans.m[i][j],m[i][k]+x.m[k][j]);
			}
		return ans;
	}
}a[N<<2];

void build(int l,int r,int o){
	if(l==r){
		for(int i=0;i<5;i++)
			for(int j=0;j<5;j++)
				if(i==j)a[o].m[i][j]=0;
				else a[o].m[i][j]=INF;
		if(s[l]=='2')a[o].m[0][0]=1,a[o].m[0][1]=0;
		if(s[l]=='0')a[o].m[1][1]=1,a[o].m[1][2]=0;
		if(s[l]=='1')a[o].m[2][2]=1,a[o].m[2][3]=0;
		if(s[l]=='7')a[o].m[3][3]=1,a[o].m[3][4]=0;
		if(s[l]=='6')a[o].m[4][4]=1,a[o].m[3][3]=1;
		return;
	}
	int mid=l+r>>1;
	build(l,mid,o*2); build(mid+1,r,o*2+1);
	a[o]=a[o*2]+a[o*2+1];
}

Node quire(int o,int L,int R,int l,int r){
	if(l<=L&&R<=r)return a[o];
	int mid=L+R>>1;
	if(mid<l)return quire(o*2+1,mid+1,R,l,r);
	if(mid>=r)return quire(o*2,L,mid,l,r);
	return quire(o*2,L,mid,l,r)+quire(o*2+1,mid+1,R,l,r);
}

int main(){
	int n,q;
	while(scanf("%d%d\n%s",&n,&q,s+1)!=EOF){
		build(1,n,1);
		while(q--){
			int l,r;
			scanf("%d%d",&l,&r);
			int ans=quire(1,1,n,l,r).m[0][4];
			if(ans==INF)puts("-1");
			else printf("%d\n",quire(1,1,n,l,r).m[0][4]);
		}
	}
	return 0;
}

  

posted @ 2020-08-07 16:23  wqtnb_tql_qwq_%%%  阅读(93)  评论(0编辑  收藏  举报