洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
2024-08-26 09:48:46
珂朵莉树是个吼东西啊
这题线段树代码4k起步……珂朵莉树只要2k……
虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的……
然而能过就行对不对……
(不过要是到时候noip我还真不敢打……毕竟CCF那机子……)
//minamoto
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#define IT set<node>::iterator
using std::set;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+;
struct node{
int l,r;mutable bool v;
node(int L,int R=-,int V=):l(L),r(R),v(V){}
inline bool operator <(const node &b)const
{return l<b.l;}
};
set<node> s;
IT split(int pos){
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos) return it;
--it;
int l=it->l,r=it->r;bool v=it->v;
s.erase(it),s.insert(node(l,pos-,v));
return s.insert(node(pos,r,v)).first;
}
void assign(int l,int r,int v){
IT itr=split(r+),itl=split(l);
s.erase(itl,itr),s.insert(node(l,r,v));
}
void rev(int l,int r){
IT itr=split(r+),itl=split(l);
for(;itl!=itr;++itl) itl->v^=;
}
int sum(int l,int r){
IT itr=split(r+),itl=split(l);
int res=;
for(;itl!=itr;++itl) res+=itl->v?itl->r-itl->l+:;
return res;
}
int count(int l,int r){
int res=,tmp=;IT itr=split(r+),itl=split(l);
for(;itl!=itr;++itl)
itl->v?(tmp+=itl->r-itl->l+):(cmax(res,tmp),tmp=);
return std::max(res,tmp);
}
int main(){
// freopen("testdata.in","r",stdin);
int n=read(),m=read();
for(int i=;i<n;++i) s.insert(node(i,i,read()));
s.insert(node(n,n,));
while(m--){
int op=read(),l=read(),r=read();
switch(op){
case :assign(l,r,);break;
case :assign(l,r,);break;
case :rev(l,r);break;
case :print(sum(l,r));break;
case :print(count(l,r));break;
}
}
return Ot(),;
}
最新文章
- Exchange 基本命令累计
- C语言中main函数的参数
- 15条变量&;方法命名的最佳实践【转】
- Ubuntu下的svn的安装
- Event-based Asynchronous Pattern Overview基于事件的异步模式概览
- 在 Eclipse 中使用 JSHint 检查 JavaScript 代码
- SQL查询数据库表字段值不为空或Null的所有列
- git撤销提交到remote的commit
- mybatis审查要点
- 在android源码环境下写上层应用的一个初步解决方法
- SSH框架-Caused by: org.hibernate.MappingException: column attribute may not be used together with <;column>; subelement
- c++ 积累
- Protege4.3 添加Rules 栏
- PHP基本随笔
- VUE2 第五天学习--过渡效果
- js判断一个值是空的最快方法是不是if(!value){alert(";这个变量的值是null";);}
- Javaweb学习(二):Http通信协议
- mvn编译
- 关于学习JAVA程序设计语言的回顾与展望
- Vue-Router路由Vue-CLI脚手架和模块化开发 之 使用props替代路由对象的方式获取参数
热门文章
- Linux中的进程与线程
- 免费SSL申请
- 最少拦截系统-----hdu1257(dp+最长上升子序列)
- Spring的JDBC框架概述
- Java的条件判断
- [PythonCode]扫描局域网的alive ip地址
- spring mvc 整理
- [Node.js] Read a File in Node.js with fs.readFile and fs.readFileSync
- 关于rman duplicate 一些比較重要的知识点--系列三
- centos编辑界面和图形界面登陆切换设置