赞
踩
题目来源:https://codeforces.com/problemset/problem/145/E
★这题把题目意思看错了。。。难度不是特别大~
给你一个长度为n的 只包含字符4和7 的字符串,有两种操作
要注意的是,这里 不是连续的子序列,我就被这里坑了
分别用 l4 记录 翻转前4的个数 ,l7 记录翻转前7的个数 ,l47 记录翻转前最长不递减序列的长度
至于 r4 r7 r47 记录的都是翻转后的(很明显 l4=r7 ,r4=l7,这题确实不需要这么多数组,但是我懒 )
再维护一个 lazy 标记是否翻转就ok了
#include<iostream> #include<algorithm> #include<string> #include<vector> #include<set> #include<map> #include<queue> #include<stack> #include<deque> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn=1e6+5; const int sz=1<<6; const int inf=2e9; const int mod=1e9+7; typedef long long LL; int n,m; char s[maxn]; int l4[maxn<<2],r4[maxn<<2]; int l7[maxn<<2],r7[maxn<<2]; int l47[maxn<<2],r47[maxn<<2]; int lazy[maxn<<2]; template<class T> inline void read(T &x) { char c;x=1; while((c=getchar())<'0'||c>'9') if(c=='-') x=-1; T res=c-'0'; while((c=getchar())>='0'&&c<='9') res=res*10+c-'0'; x*=res; } void pushup(int k) { l4[k]=l4[k<<1]+l4[k<<1|1]; l7[k]=l7[k<<1]+l7[k<<1|1]; r4[k]=r4[k<<1]+r4[k<<1|1]; r7[k]=r7[k<<1]+r7[k<<1|1]; int tmp1=l4[k<<1]+max(l7[k<<1|1],l47[k<<1|1]); l47[k]=max(tmp1,l47[k<<1]+l7[k<<1|1]); int tmp2=l4[k<<1|1]+max(l7[k<<1],r47[k<<1]); r47[k]=max(tmp2,r47[k<<1|1]+l7[k<<1]); } void pushdown(int k) { if(lazy[k]){ lazy[k<<1]^=1; swap(l4[k<<1],r4[k<<1]); swap(l7[k<<1],r7[k<<1]); swap(l47[k<<1],r47[k<<1]); lazy[k<<1|1]^=1; swap(l4[k<<1|1],r4[k<<1|1]); swap(l7[k<<1|1],r7[k<<1|1]); swap(l47[k<<1|1],r47[k<<1|1]); lazy[k]=0; } } void build(int k,int l,int r) { lazy[k]=0; if(l==r){ if(s[l]-'0'==4){ l4[k]=r7[k]=1; r4[k]=l7[k]=0; } else{ l4[k]=r7[k]=0; r4[k]=l7[k]=1; } l47[k]=r47[k]=0; return ; } int mid=l+r>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); pushup(k); } void update(int k,int l,int r,int x,int y) { if(x<=l&&r<=y){ lazy[k]^=1; swap(l4[k],r4[k]); swap(l7[k],r7[k]); swap(l47[k],r47[k]); return ; } pushdown(k); int mid=l+r>>1; if(mid>=x) update(k<<1,l,mid,x,y); if(mid<y) update(k<<1|1,mid+1,r,x,y); pushup(k); } int main() { read(n);read(m); scanf("%s",(s+1)); build(1,1,n); char op[10]; int l,r; while(m--){ scanf("%s",op); if(op[0]=='c'){ cout<<(max(l4[1],max(l7[1],l47[1])))<<endl; } else{ read(l); read(r); update(1,1,n,l,r); } // for(int j=1;j<=15;j++) cout<<(max(l4[j],max(l7[j],l47[j])))<<' '; // cout<<endl; } return 0; } // 1 3 // 1 2 3 3 //1 1 2 2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。