CF145E Lucky Queries

英文题面不放了,直接上翻译:

题目描述

给你n个数,每个数是4或者7,给你m个任务完成

switch l r 把[l,r]位置的4换成7,7换成4

count 计算n个数的最长不下降子序列的长度

N个数的不下降子序列是这n个数移除掉0个或者若干个位置的数,并且满足从第2个数开始每一个数不小于前一个数的大小。

输入格式

第一行n,m

第二行n个数字

接下来m行每行一个命令

输出格式

对于每一个count的命令,输出n个数的最长不下降子序的长度

输入输出样例

输入样例#1:

2 3
47
count
switch 1 2
count
输出样例#1:

2
1
输入样例#2:

3 5
747
count
switch 1 1
count
switch 1 3
count
输出样例#2:

2
3
2

题解Here!

看到区间问题,线段树之类的肯定没得跑。
当然将$4,7$转成$0,1$应该都能想到。
不过怎样区间翻转是一个问题。
我们记录最长不上升子序列的长度和最长不下降子序列的长度,然后分别维护即可。
区间翻转的时候翻转一下就好。
那,维护怎么办?
其实最长不下降子序列只有一种情况:前面若干个$4$,后面若干个$7$。
那我们只要搞出分界点就好。
这里的分界点指的是最后一个$4$的位置。
而分界点只会在三个地方:左儿子区间$[l,mid-1]$中,$mid$,右儿子区间$[mid+1,r]$中。
于是分别计算长度,取最大值就好。
最长不上升子序列同理。
复杂度$O(m\log_2n)$。
代码还是挺好码的。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define LSON rt<<1
#define RSON rt<<1|1
#define FOUR(x) a[x].four
#define SEVEN(x) a[x].seven
#define SIGN(x) a[x].c
#define UPON(x) a[x].upon
#define DOWN(x) a[x].down
#define LSIDE(x) a[x].l
#define RSIDE(x) a[x].r
#define WIDTH(x) (RSIDE(x)-LSIDE(x)+1)
#define MAXN 1000010
using namespace std;
int n,m;
char ch[MAXN];
struct Segment_Tree{
int seven,four,c,upon,down;
int l,r;
}a[MAXN<<2];
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
inline void pushup(int rt){
FOUR(rt)=FOUR(LSON)+FOUR(RSON);
SEVEN(rt)=SEVEN(LSON)+SEVEN(RSON);
UPON(rt)=max(FOUR(LSON)+SEVEN(RSON),max(FOUR(LSON)+UPON(RSON),UPON(LSON)+SEVEN(RSON)));
DOWN(rt)=max(SEVEN(LSON)+FOUR(RSON),max(SEVEN(LSON)+DOWN(RSON),DOWN(LSON)+FOUR(RSON)));
}
inline void pushdown(int rt){
if(!SIGN(rt)||LSIDE(rt)==RSIDE(rt))return;
SIGN(LSON)^=1;
swap(FOUR(LSON),SEVEN(LSON));
swap(UPON(LSON),DOWN(LSON));
SIGN(RSON)^=1;
swap(FOUR(RSON),SEVEN(RSON));
swap(UPON(RSON),DOWN(RSON));
SIGN(rt)=0;
}
void buildtree(int l,int r,int rt){
LSIDE(rt)=l;RSIDE(rt)=r;SIGN(rt)=0;
if(l==r){
FOUR(rt)=(ch[l]=='4');
SEVEN(rt)=(FOUR(rt)^1);
UPON(rt)=DOWN(rt)=1;
return;
}
int mid=l+r>>1;
buildtree(l,mid,LSON);
buildtree(mid+1,r,RSON);
pushup(rt);
}
void update(int l,int r,int rt){
if(l<=LSIDE(rt)&&RSIDE(rt)<=r){
SIGN(rt)^=1;
swap(FOUR(rt),SEVEN(rt));
swap(UPON(rt),DOWN(rt));
return;
}
pushdown(rt);
int mid=LSIDE(rt)+RSIDE(rt)>>1;
if(l<=mid)update(l,r,LSON);
if(mid<r)update(l,r,RSON);
pushup(rt);
}
void work(){
int l,r;
while(m--){
scanf("%s",ch);
if(ch[0]=='s'){
l=read();r=read();
update(l,r,1);
}
else printf("%d\n",UPON(1));
}
}
void init(){
n=read();m=read();scanf("%s",ch+1);
buildtree(1,n,1);
}
int main(){
init();
work();
return 0;
}

CF145E Lucky Queries的更多相关文章

  1. 数据结构(线段树):CodeForces 145E Lucky Queries

    E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  2. Codeforces 145E Lucky Queries 线段树

    Lucky Queries 感觉是很简单的区间合并, 但是好像我写的比较麻烦. #include<bits/stdc++.h> #define LL long long #define f ...

  3. Codeforces Round #104 (Div. 1)

    A.Lucky Conversion 题意 给定两个长度为 \(N(N \le 10^5)\) 且由4和7构成的 \(a, b\)串 对 \(a\) 可以有两种操作: 交换两个位置的字符; 改变一个位 ...

  4. SPOJ 1557. Can you answer these queries II 线段树

    Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...

  5. spoj gss2 : Can you answer these queries II 离线&&线段树

    1557. Can you answer these queries II Problem code: GSS2 Being a completist and a simplist, kid Yang ...

  6. SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

    GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...

  7. 实践 HTML5 的 CSS3 Media Queries

    先来介绍下 media,确切的说应该是 CSS media queries(CSS 媒体查询),媒体查询包含了一个媒体类型和至少一个使用如宽度.高度和颜色等媒体属性来限制样式表范围的表达式.CSS3 ...

  8. lucky 的 时光助理(2)

    lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...

  9. lucky 的 时光助理

    2017年的lucky小姐,厌倦了现在的工作,她觉得这些的工作对于她而言不具备挑战性,她在迷茫春节过后该如何选择, 这里是距她走出校门整整一年的时光. lucky小姐从开发走向了实施,目的是想周游这个 ...

随机推荐

  1. iDempiere的用户密码加密处理(AD_User.Password)(Postgresql 9.1)

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ 首先对Postgresql数据库进行加密处理. 参考网页:francs写的:Postgr ...

  2. Office-Excel取消掉每次打开弹出的自定义项安装程序弹窗

    电脑重装了系统之后,重新安装了office2013,发现每次打开Excel都会弹出一个如下图所示的弹窗,比较烦人. 要取消掉这个弹窗也是比较简单的. 打开“文件”--“选项”--“加载项” 在下面的管 ...

  3. Linux 脚本点滴知识积累

    1.以openwrt中的/etc/hotplug.d/button/00-button为例 . /lib/functions.sh do_button () { local button   ---- ...

  4. windows 下node版管理

    linux 下的node 多版本管理有nvm,windows 下同样有这样的工具gnvm 安装步骤(无node环境): 1.下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 ...

  5. CentOS上使用Squid+Stunnel搭建代理服务器教程

    这篇文章主要介绍了CentOS上使用Squid+Stunnel搭建代理服务器教程,同时文中也介绍了用户认证的方法,适合于多用户共同使用代理,这种功能在国内用还是比较exciting的~需要的朋友可以参 ...

  6. html表格上下居中

    在表格外面嵌套另一个高度为 100% 的表格,外层的表格设置 td 的 valign 属性 为 middle <table width="100%" height=" ...

  7. Eclipse 悬浮提示

    Eclipse 悬浮提示 使用悬浮提示 java 编辑器中包含了不同类型的悬浮提示,悬浮提示提供了鼠标指针指向元素的额外信息.所有java编辑器中相关的悬浮提示可以通过 preference(首选项) ...

  8. 转载:DenseNet算法详解

    原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/a ...

  9. ios 关于collectionView.performBatchUpdates()方法 --时时更新

    今天想实现一个简单的collectionView动画效果,查阅相关资料发现,实现 collectionView.performBatchUpdates()方法即可,于是掉坑里了. 文档: public ...

  10. java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation 解决办法

    MyEclipse 启动tomcat 报错: java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation' parameter: ...