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; }