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. mongoDB group命令详解

    http://heipark.iteye.com/blog/1167948       http://rjhym.iteye.com/blog/1224200 http://blog.163.com/ ...

  2. nginx服务器的负载均衡和动静分离(未完)

    安装nginx,我的博客里面有介绍源码和yum安装. 实战:使用nginx实现动静分离的负载均衡集群 实战:使用haproxy实现负载均衡集群 LB负载均衡集群分为两类:LVS(四层)和Nginx或p ...

  3. Atitit.java jna 调用c++ dll 的总结

    Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2.  ...

  4. MySQL的索引(中)

    连着发了几天文章,从我收到的反映来说,大家觉着还不错,可以很清晰的看到知识的脉络,但是这个还不错是针对传统的文章的无聊.不明确.完全不考虑考虑用户体验的角度上对比出来的.掌握一门知识还是不容易的,有的 ...

  5. iOS: 与 insertRowsAtIndexPaths 在 UITableview 中插入多个行

    我有 10 行已经在连接中想做什么添加另一个 10 行,我使用的 insertRowsAtIndexPaths,但我要的错误. 以下是我使用的代码 -(void)insertDownloadedAct ...

  6. 在 Windows 上安装 TensorFlow(转载)

    在 Windows 上安装 TensorFlow windows下配置安装Anaconda+tensorflow Spyder——科学的Python开发环境 Windows7 安装TensorFlow ...

  7. PHP基础之Autoload

    PHP的自动加载autoload机制很重要,这里做2个小练习 原创文章,转载请注明:http://www.cnblogs.com/phpgcs 文件结构如下,2种方式实现自动加载 1,自定义函数 2, ...

  8. Linux虚拟机Centos 设置固定的静态IP

    经过两天的研究(研究到深夜1点),百度了很多文章与加了几个linux的群,终于得到一种方式是可以正常设置静态IP且正常的ssh连接的方式. 第一种方式:NAT模式 参考文章 -- 虚拟机中的CentO ...

  9. Chai.js断言库API中文文档【转载】

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  10. Error:“const char*”类型的实参与“wchar_t”类型的形参不兼容

    MainApp\RPolarView.cpp(1571): error C2664: “ATL::CStringT<BaseType,StringTraits>::ReverseFind” ...