好颓啊,我竟然来写了一道恶心的板子

旁边的魏佬嘲讽我,还用欺负我

嘤嘤嘤

那就不膜魏佬了

嘤嘤嘤

这是一道无聊的板子

看到这些操作,我们看到这些操作就知道我们需要维护的东西了

首先那个最长的连续的\(1\),显然要维护一下左最长,右最长,还是区间最长

由于有非常恶心的取反操作,所以最长的连续\(0\)也需要顺带维护一下

之后就是推一下标记了

显然非常强制性的覆盖标记比取反标记的优先级要更高

没什么了

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100005
#define max(a,b) ((a)>(b)?(a):(b))
struct node
{int t,ll,rr,dd;
};
int l[maxn<<2],r[maxn<<2],tag[2][maxn<<2],d[maxn<<2],ans[2][maxn<<2],lc[2][maxn<<2],rc[2][maxn<<2];
int n,m;
int a[maxn];
inline void pushup(int i)
{d[i]=d[i<<1]+d[i<<1|1];if(d[i<<1|1]==r[i<<1|1]-l[i<<1|1]+1) rc[1][i]=rc[1][i<<1|1]+rc[1][i<<1];else rc[1][i]=rc[1][i<<1|1];if(d[i<<1]==r[i<<1]-l[i<<1]+1) lc[1][i]=lc[1][i<<1]+lc[1][i<<1|1];else lc[1][i]=lc[1][i<<1];if(!d[i<<1|1]) rc[0][i]=rc[0][i<<1|1]+rc[0][i<<1];else rc[0][i]=rc[0][i<<1|1];if(!d[i<<1]) lc[0][i]=lc[0][i<<1]+lc[0][i<<1|1];else lc[0][i]=lc[0][i<<1];ans[0][i]=max(max(ans[0][i<<1],ans[0][i<<1|1]),rc[0][i<<1]+lc[0][i<<1|1]);ans[1][i]=max(max(ans[1][i<<1],ans[1][i<<1|1]),rc[1][i<<1]+lc[1][i<<1|1]);
}
inline void pushdown(int i)
{if(tag[0][i]!=-1){tag[0][i<<1]=tag[0][i],tag[0][i<<1|1]=tag[0][i];tag[1][i<<1]=tag[1][i<<1|1]=0;d[i<<1]=(r[i<<1]-l[i<<1]+1)*tag[0][i],d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1)*tag[0][i];ans[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,ans[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;lc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,lc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;rc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,rc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;ans[tag[0][i]^1][i<<1]=0,ans[tag[0][i]^1][i<<1|1]=0;lc[tag[0][i]^1][i<<1]=0,lc[tag[0][i]^1][i<<1|1]=0;rc[tag[0][i]^1][i<<1]=0,rc[tag[0][i]^1][i<<1|1]=0;tag[0][i]=-1;}if(tag[1][i]){if(tag[0][i<<1]==-1) tag[1][i<<1]^=1;else tag[0][i<<1]^=1;if(tag[0][i<<1|1]==-1) tag[1][i<<1|1]^=1;else tag[0][i<<1|1]^=1;d[i<<1]=(r[i<<1]-l[i<<1]+1-d[i<<1]),d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1-d[i<<1|1]);std::swap(ans[0][i<<1],ans[1][i<<1]),std::swap(ans[0][i<<1|1],ans[1][i<<1|1]);std::swap(lc[0][i<<1],lc[1][i<<1]),std::swap(lc[0][i<<1|1],lc[1][i<<1|1]);std::swap(rc[0][i<<1],rc[1][i<<1]),std::swap(rc[0][i<<1|1],rc[1][i<<1|1]);tag[1][i]=0;}
}
inline int read()
{char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
void build(int x,int y,int i)
{l[i]=x,r[i]=y,tag[0][i]=-1;if(x==y){d[i]=a[x];lc[a[x]][i]=rc[a[x]][i]=1;ans[a[x]][i]=1;return;}int mid=x+y>>1;build(x,mid,i<<1),build(mid+1,y,i<<1|1);pushup(i);
}
void change_1(int x,int y,int i,int val)
{if(x<=l[i]&&y>=r[i]){d[i]=val*(r[i]-l[i]+1);tag[1][i]=0;tag[0][i]=val;rc[val][i]=lc[val][i]=(r[i]-l[i]+1);ans[val][i]=(r[i]-l[i]+1);rc[val^1][i]=lc[val^1][i]=ans[val^1][i]=0;return;}pushdown(i);int mid=l[i]+r[i]>>1;if(y<=mid) change_1(x,y,i<<1,val);else if(x>mid) change_1(x,y,i<<1|1,val);else change_1(x,y,i<<1|1,val),change_1(x,y,i<<1,val);pushup(i);
}
void change_2(int x,int y,int i)
{if(x<=l[i]&&y>=r[i]){d[i]=(r[i]-l[i]+1-d[i]);if(tag[0][i]!=-1) tag[0][i]^=1;else tag[1][i]^=1;std::swap(rc[0][i],rc[1][i]),std::swap(lc[0][i],lc[1][i]),std::swap(ans[0][i],ans[1][i]);return;}pushdown(i);int mid=l[i]+r[i]>>1;if(y<=mid) change_2(x,y,i<<1);else if(x>mid) change_2(x,y,i<<1|1);else change_2(x,y,i<<1|1),change_2(x,y,i<<1);pushup(i);
}
int query(int x,int y,int i)
{if(x<=l[i]&&y>=r[i]) return d[i];pushdown(i);int mid=l[i]+r[i]>>1;if(y<=mid) return query(x,y,i<<1);if(x>mid) return query(x,y,i<<1|1);return query(x,y,i<<1)+query(x,y,i<<1|1);
}
node ask(int x,int y,int i)
{if(x<=l[i]&&y>=r[i]) return (node){ans[1][i],lc[1][i],rc[1][i],r[i]-l[i]+1};pushdown(i);int mid=l[i]+r[i]>>1;if(y<=mid) return ask(x,y,i<<1);if(x>mid) return ask(x,y,i<<1|1);node L=ask(x,y,i<<1),R=ask(x,y,i<<1|1);node now;if(R.dd==R.rr) now.rr=R.rr+L.rr;else now.rr=R.rr;if(L.dd==L.ll) now.ll=L.ll+R.ll;else now.ll=L.ll;now.dd=L.dd+R.dd;now.t=max(L.t,max(R.t,R.ll+L.rr));return now;
}
int main()
{n=read(),m=read();for(re int i=1;i<=n;i++)    a[i]=read();build(1,n,1);int opt,x,y;while(m--){opt=read(),x=read()+1,y=read()+1;if(opt==0) change_1(x,y,1,0);if(opt==1) change_1(x,y,1,1);if(opt==2) change_2(x,y,1);if(opt==3) printf("%d\n",query(x,y,1));if(opt==4) printf("%d\n",ask(x,y,1).t);}return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10206153.html

【[SCOI2010]序列操作】相关推荐

  1. P2572 [SCOI2010]序列操作

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

  2. BZOJ1858 [Scoi2010]序列操作 线段树

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1858 题意概括 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1 ...

  3. luogu P2572 [SCOI2010]序列操作

    传送门 这个题我写了差不多一周吧-- 终于改成了一个能在考试的时候写完的版本 大量的区间操作 1e5 显然线段树解决 确实是板子题 但是极其难调-- 最后听rabbithu学姐讲了一下才用" ...

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

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

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

    2016-06-21 一看就是线段树,就是标记相互冲突,处理好,其余都是平常的. 1 #include<iostream> 2 #include<cstring> 3 #inc ...

  6. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1961  Solved: 991 [Submit][Stat ...

  7. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB [Submit][Status][Discuss] Description 有一个长度为n的序列 ...

  8. 问题 F: 序列操作Ⅱ(前缀最大公约数,后缀最大公约数)

    问题 F: 序列操作Ⅱ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选择一个数 ...

  9. 问题 E: 序列操作Ⅰ(01背包)

    问题 E: 序列操作Ⅰ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选出若干个 ...

最新文章

  1. 计算机意外地重新启动或遇到错误。windows安装无法继续。若要安装windows 请单击 确定 重新启动计算机...
  2. 运算方法和运算部件三
  3. 802.11 参考手册
  4. 微软宣布新命令行工具 Windows Terminal 和 WSL2
  5. leetcode436. 寻找右区间(二分法)
  6. Linux0.11 kernel/exit.c中的free_page_tables()
  7. Swagger2 生成API文档时泛型总是显示不出来的问题
  8. sql语句ding_SQL语句映射文件增删改查、参数、缓存
  9. SQL Agent服务无法启动如何破
  10. Color RGB颜色深浅的排序
  11. ios 旋转加载gif_在iOS中加载GIF(Loading GIFs in iOS)
  12. SAN 光纤交换机配置远距离级联(EF)操作
  13. 时间序列:Shapelets
  14. 数部视频学习资源,一定有你想要的
  15. 达梦数据库——模式及状态转换
  16. 服务器上训练深度学习模型anaconda+cuda+cudnn+pycharm
  17. 博客文章内容导航(实时更新)
  18. 湖泊遥感研究进展(概述)
  19. 安卓培训机构排名!这篇文章可以满足你80%日常工作!跳槽薪资翻倍
  20. Python虚拟环境(二):Linux基于Anaconda创建虚拟环境并打包

热门文章

  1. 2021-2027年中国手机壳行业现状研究及发展趋势分析报告
  2. js数组的排序 sort详解
  3. LeetCode中等题之两两交换链表中的节点
  4. LeetCode简单题之作为子字符串出现在单词中的字符串数目
  5. 你想了解的Cookie和Session就在这~
  6. JIT Code Generation代码生成
  7. Rust和C / C ++的跨语言链接时间优化LTO
  8. CUDA 7 流并发性优化
  9. Nucleus-SE迁移:未实现的设施和兼容性
  10. 寻找汽车连接的解决方案