线段树

pushdown写的很浪~

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100000+10
using namespace std;
struct Node{
int L,R;
int tag;
int num[];
int lcon[],rcon[],mcon[];
Node(){
L=R=tag=;
num[]=num[]=;
lcon[]=rcon[]=mcon[]=;
lcon[]=rcon[]=mcon[]=;
}
}dat[MAXN<<];
int n,m;
int a[MAXN];
Node Merge(Node A,Node B){
if(A.L<)return B;
if(B.L<)return A;
Node ret;
ret.L=A.L,ret.R=B.R;
int ls=A.R-A.L,rs=B.R-B.L;
for(int i=;i<=;i++){
ret.num[i]=A.num[i]+B.num[i];
if(A.num[i]==ls)ret.lcon[i]=ls+B.lcon[i];
else ret.lcon[i]=A.lcon[i];
if(B.num[i]==rs)ret.rcon[i]=rs+A.rcon[i];
else ret.rcon[i]=B.rcon[i];
ret.mcon[i]=max(A.mcon[i],B.mcon[i]);
ret.mcon[i]=max(ret.mcon[i],A.rcon[i]+B.lcon[i]);
}
return ret;
}
void c(Node &A,int x){
x--;
int size=A.R-A.L;
A.num[x]=size,A.num[x^]=;
A.lcon[x]=A.rcon[x]=A.mcon[x]=size;
A.lcon[x^]=A.rcon[x^]=A.mcon[x^]=;
A.tag=x+;
}
void r(Node &A){
swap(A.num[],A.num[]);
swap(A.lcon[],A.lcon[]);
swap(A.rcon[],A.rcon[]);
swap(A.mcon[],A.mcon[]);
A.tag=;
}
void update(Node &A,int x){
if(x<=){c(A,x);return;}
if(!A.tag){
r(A);
}
else if(A.tag<=){
c(A,((A.tag-)^)+);
}
else{
r(A);
A.tag=;
}
}
void pushdown(int k){
if(!dat[k].tag)return;
update(dat[k<<],dat[k].tag);
update(dat[k<<|],dat[k].tag);
dat[k].tag=;
}
void build(int k,int L,int R){
if(L+==R){
dat[k].L=L,dat[k].R=R;
if(a[L]){dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
else {dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
return;
}
build(k<<,L,(L+R)>>);
build(k<<|,(L+R)>>,R);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
void rev(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],);
}
else{
pushdown(k);
rev(a,b,k<<);
rev(a,b,k<<|);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
void cha(int a,int b,int k,int x){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],x);
}
else{
pushdown(k);
cha(a,b,k<<,x);
cha(a,b,k<<|,x);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
Node query(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
Node ret;ret.L=-;
return ret;
}
else if(a<=L&&R<=b){
return dat[k];
}
else{
pushdown(k);
Node lc=query(a,b,k<<);
Node rc=query(a,b,k<<|);
return Merge(lc,rc);
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n+);
int opt,x,y;
while(m--){
scanf("%d%d%d",&opt,&x,&y);x++,y++;
if(==opt||opt==){
cha(x,y+,,opt+);
}
else if(==opt){
rev(x,y+,);
}
else{
Node ans=query(x,y+,);
printf("%d\n",(==opt?ans.num[]:ans.mcon[]));
}
}
return ;
}

洛谷P2572 [SCOI2010]序列操作的更多相关文章

  1. 洛谷 P2572 [SCOI2010]序列操作

    题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 ...

  2. 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树

    正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...

  3. 洛谷P2572 [SCOI2010]序列操作(ODT)

    题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...

  4. 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)

    传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...

  5. 【题解】Luogu P2572 [SCOI2010]序列操作

    原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...

  6. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

  7. Luogu P2572 [SCOI2010]序列操作 线段树。。

    咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...

  8. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  9. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

随机推荐

  1. ajax 返回Json方法

    public static void sendJsonData(String data) { ActionContext ac = ActionContext.getContext(); HttpSe ...

  2. django搭建web (二) urls.py

    URL模式: 在app下的urls.py中 urlpatterns=[ url(正则表达式,view函数,参数,别名,前缀)] urlpatterns=[ url(r'^hello/$',hello. ...

  3. DML数据操作语言之查询(一)

    1.select语句基础 基本语句格式:  select <列名>,.... from <表名>; select子句中列举出希望从表中查询出的列的名称,from子句则指定了选取 ...

  4. Apache的配置httpd.conf文件配置

    (1) 基本配置: ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置.其它指定的目录如果没有指定绝对路径,则目录是相对于该目录 ...

  5. 【bug清除】Surface Pro系列使用Drawboard PDF出现手写偏移、卡顿、延迟现象的解决方式

    最近自己新买的New Surface Pro在使用Drawboard PDF时,出现了性能问题,即笔迹延迟偏移,卡顿的问题. 排查驱动问题之后,确认解决方案如下: 将Surface的电池调到性能模式, ...

  6. Mysql-5.7.21安装配置

    搞开发多年,其实MySql前前后后安装配置了无数次,但是每次都需要到网上搜教程,折腾半天才搞定,这次索性把整个过程全部记录下来,以便以后查阅. 下载 到MySql官网,导航找到DOWNLOADS> ...

  7. apacheds的客户端

    Apache DS管理的JAVA实现 LdapConnection connection = new LdapNetworkConnection("localhost", 1038 ...

  8. [洛谷P2234][HNOI2002] 营业额统计 - Treap

    Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...

  9. JavaScript 评论添加练习

    JavaScript 评论添加练习 本次所学内容: //var str = '<li>'+value+'</li>'; 支付串和变量的拼接 //ul.innerHTML += ...

  10. Java 局部变量、实例变量、类变量(静态变量)区别

    1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外 ...