标签:10 ch Lucky Queries 序列 getchar CF145E define
题目
给定一个序列,每一个数是 \(4\) 或者 \(7\) ,每次两种操作,翻转一个区间的 \(4,7\) 或者询问这个序列的最长不降子序列长度。
分析
经典的线段树维护的题目。
考虑维护区间内 \(4\) 的个数 ,\(7\) 的个数以及最长不下降子序列长度和最长不上升子序列长度。
于是区间翻转就很好处理了,直接把四个值两两交换即可。
代码
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void read(T &x){
x=0;bool f=false;char ch=getchar();
while(!isdigit(ch)){f|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=x*10+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template<typename T>
inline void write(T x){
if(x<0) x=-x,putchar('-');
if(x>9) write(x/10);
putchar(x%10^48);
return ;
}
const int N=1e6+5,N1=1e4+5,M=1e7+5;
#define PII pair<int,int>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define ll long long
int n,m,a[N],tag[N<<2];
int valx[N<<2],valy[N<<2],num4[N<<2],num7[N<<2];//valx:最长不下降,valy:最长不上升
inline void Pushup(int x){
num4[x]=num4[x<<1]+num4[x<<1|1];
num7[x]=num7[x<<1]+num7[x<<1|1];
valx[x]=max(valx[x<<1]+num7[x<<1|1],num4[x<<1]+valx[x<<1|1]);
valy[x]=max(valy[x<<1]+num4[x<<1|1],num7[x<<1]+valy[x<<1|1]);
return ;
}
void Build(int x,int l,int r){
if(l==r) return num4[x]=(a[l]==4),num7[x]=!num4[x],valx[x]=valy[x]=1,void();
int mid=l+r>>1;
Build(x<<1,l,mid),Build(x<<1|1,mid+1,r);
Pushup(x);return ;
}
inline void Pushtag(int x){
swap(num4[x],num7[x]),swap(valx[x],valy[x]),tag[x]^=1;
return ;
}
void PushDown(int x){
if(tag[x]) Pushtag(x<<1),Pushtag(x<<1|1);
tag[x]=0;
return ;
}
void Modify(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return Pushtag(x),void();
PushDown(x);int mid=l+r>>1;
if(ql<=mid) Modify(x<<1,l,mid,ql,qr);
if(qr>mid) Modify(x<<1|1,mid+1,r,ql,qr);
Pushup(x);
return ;
}
signed main(){
read(n),read(m);
for(register int i=1;i<=n;i++) scanf("%1d",&a[i]);
Build(1,1,n);
while(m--){
int l,r;char op[5];
scanf("%s",op);
if(op[0]=='c'){
write(valx[1]);putchar('\n');
continue;
}
read(l),read(r);
Modify(1,1,n,l,r);
}
return 0;
}
标签:10,ch,Lucky,Queries,序列,getchar,CF145E,define 来源: https://www.cnblogs.com/Akmaey/p/15266207.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。