AC日记——[Scoi2010]序列操作 bzoj 1858
思路:
恶心;
代码:
- #include <bits/stdc++.h>
- using namespace std;
- #define maxn 100005
- struct TreeNodeType {
- int l,r,l1,r1,m1,l0,r0,m0,mid,size,cnt1,cnt0;
- bool f1,f0,ff;
- inline void turn(){swap(l1,l0),swap(r1,r0),swap(m1,m0),swap(cnt1,cnt0);}
- inline void turn1(){l0=,r0=,m0=,cnt0=,l1=size,r1=size,m1=size,cnt1=size;}
- inline void turn0(){l1=,r1=,m1=,cnt1=,l0=size,r0=size,m0=size,cnt0=size;}
- inline void F1(){f1=true,f0=false,ff=false;}
- inline void F0(){f0=true,f1=false,ff=false;}
- inline void FF(){
- if(f1) f0=true,f1=false;
- else if(f0) f1=true,f0=false;
- else ff^=;
- }
- inline void turnzero(){f1=false,f0=false,ff=false;}
- };
- struct TreeNodeType tree[maxn<<];
- struct AnsType {
- int l,r,m,s;
- };
- int n,m,Count;
- inline void in(int &now)
- {
- char Cget=getchar();now=;
- while(Cget>''||Cget<'') Cget=getchar();
- while(Cget>=''&&Cget<='') now=now*+Cget-'',Cget=getchar();
- }
- inline void updata(int now)
- {
- tree[now].cnt1=tree[now<<].cnt1+tree[now<<|].cnt1;
- tree[now].cnt0=tree[now<<].cnt0+tree[now<<|].cnt0;
- tree[now].l1=tree[now<<].size==tree[now<<].l1?tree[now<<].l1+tree[now<<|].l1:tree[now<<].l1;
- tree[now].l0=tree[now<<].size==tree[now<<].l0?tree[now<<].l0+tree[now<<|].l0:tree[now<<].l0;
- tree[now].r1=tree[now<<|].size==tree[now<<|].r1?tree[now<<|].r1+tree[now<<].r1:tree[now<<|].r1;
- tree[now].r0=tree[now<<|].size==tree[now<<|].r0?tree[now<<|].r0+tree[now<<].r0:tree[now<<|].r0;
- tree[now].m1=max(tree[now<<].r1+tree[now<<|].l1,max(tree[now<<].m1,tree[now<<|].m1));
- tree[now].m0=max(tree[now<<].r0+tree[now<<|].l0,max(tree[now<<].m0,tree[now<<|].m0));
- }
- inline void downdata(int now)
- {
- if(tree[now].f1) tree[now<<].turn1(),tree[now<<|].turn1(),tree[now<<].F1(),tree[now<<|].F1();
- if(tree[now].f0) tree[now<<].turn0(),tree[now<<|].turn0(),tree[now<<].F0(),tree[now<<|].F0();
- if(tree[now].ff) tree[now<<].turn(),tree[now<<|].turn(),tree[now<<].FF(),tree[now<<|].FF();
- tree[now].turnzero();
- }
- inline void build(int now,int l,int r)
- {
- tree[now].l=l,tree[now].r=r,tree[now].size=r-l+;
- if(l==r)
- {
- int pos;
- in(pos);
- if(pos) tree[now].l1=,tree[now].r1=,tree[now].m1=,tree[now].cnt1=;
- else tree[now].l0=,tree[now].r0=,tree[now].m0=,tree[now].cnt0=;
- return;
- }
- tree[now].mid=l+r>>;
- build(now<<,l,tree[now].mid);
- build(now<<|,tree[now].mid+,r);
- updata(now);
- }
- inline void operation0(int now,int l,int r)
- {
- if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn0(),tree[now].F0();return;}
- if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
- if(l<=tree[now].mid) operation0(now<<,l,min(r,tree[now].mid));
- if(r>tree[now].mid) operation0(now<<|,max(tree[now].mid+,l),r);
- updata(now);
- }
- inline void operation1(int now,int l,int r)
- {
- if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn1(),tree[now].F1();return;}
- if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
- if(l<=tree[now].mid) operation1(now<<,l,min(r,tree[now].mid));
- if(r>tree[now].mid) operation1(now<<|,max(tree[now].mid+,l),r);
- updata(now);
- }
- inline void operation2(int now,int l,int r)
- {
- if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn(),tree[now].FF();return;}
- if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
- if(l<=tree[now].mid) operation2(now<<,l,min(r,tree[now].mid));
- if(r>tree[now].mid) operation2(now<<|,max(tree[now].mid+,l),r);
- updata(now);
- }
- inline void operation3(int now,int l,int r)
- {
- if(tree[now].l>=l&&tree[now].r<=r){Count+=tree[now].cnt1;return;}
- if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
- if(l<=tree[now].mid) operation3(now<<,l,min(r,tree[now].mid));
- if(r>tree[now].mid) operation3(now<<|,max(l,tree[now].mid+),r);
- updata(now);
- }
- inline AnsType operation4(int now,int l,int r)
- {
- if(tree[now].l>=l&&tree[now].r<=r) return (AnsType){tree[now].l1,tree[now].r1,tree[now].m1,tree[now].size};
- if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
- bool al=false,ar=false;AnsType Al,Ar,res;
- if(l<=tree[now].mid) al=true,Al=operation4(now<<,l,min(r,tree[now].mid));
- if(r>tree[now].mid) ar=true,Ar=operation4(now<<|,max(l,tree[now].mid+),r);
- if(al&&ar)
- {
- res.s=Al.s+Ar.s;
- res.l=Al.s==Al.l?Al.l+Ar.l:Al.l;
- res.r=Ar.s==Ar.r?Ar.r+Al.r:Ar.r;
- res.m=max(Al.r+Ar.l,max(Al.m,Ar.m));
- return res;
- }
- return al?Al:Ar;
- }
- int main()
- {
- in(n),in(m),build(,,n-);
- int op,l,r;AnsType pos;
- while(m--)
- {
- in(op),in(l),in(r);
- if(op==) operation0(,l,r);
- if(op==) operation1(,l,r);
- if(op==) operation2(,l,r);
- if(op==) Count=,operation3(,l,r),printf("%d\n",Count);
- if(op==) pos=operation4(,l,r),printf("%d\n",max(max(pos.l,pos.r),pos.m));
- }
- return ;
- }
AC日记——[Scoi2010]序列操作 bzoj 1858的更多相关文章
- AC日记——[SCOI2010]幸运数字 bzoj 1853
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2405 Solved: 887[Submit][Status] ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- BZOJ_1858_[Scoi2010]序列操作_线段树
BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
随机推荐
- Java编程MapReduce实现WordCount
Java编程MapReduce实现WordCount 1.编写Mapper package net.toocruel.yarn.mapreduce.wordcount; import org.apac ...
- 【题解】最大公约数之和 V3 51nod 1237 杜教筛
题目传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 数学题真是做的又爽又痛苦,爽在于只要推出来公式基本上就 ...
- HDU1814 2-sat 模板
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- UVA 11040 Add bricks in the wall
https://vjudge.net/problem/UVA-11040 找规律 #include<cstdio> using namespace std; ][]; int main() ...
- UVA 10214 Trees in a Wood
https://vjudge.net/problem/UVA-10214 题意:你站在原点,每个坐标位置有一棵高度相同的树,问能看到多少棵树 ans=Σ gcd(x,y)=1 欧拉函数搞搞 #incl ...
- 修改Maven仓库地址
在%USERPROFILE%\.m2\settings.xml例如:C:\Users\LongShu\.m2\settings.xml 可以自定义Maven的一些参数, 复制%M2_HOME%\con ...
- 【Codeforces370E】Summer Reading [构造]
Summer Reading Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input 7 0 1 ...
- 【HDU】3068 最长回文
[算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...
- 基本控件文档-UIButton属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- 超详细的Java面试题总结(三)之Java集合篇常见问题
List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...