2016-06-21

一看就是线段树,就是标记相互冲突,处理好,其余都是平常的。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstdlib>
  7 #include<map>
  8 #define ll long long
  9 #define M 500009
 10 using namespace std;
 11 ll read()
 12 {
 13     char ch=getchar();
 14     ll x=0,f=1;
 15     for(;ch<'0'||ch>'9';ch=getchar())
 16       if(ch=='-')
 17         f=-1;
 18     for(;ch>='0'&&ch<='9';ch=getchar())
 19       x=x*10+ch-'0';
 20     return x*f;
 21 }
 22 struct data
 23 {
 24     int l[2],r[2],le[2],su,yi,laz;
 25 }shu[M];
 26 int n,m,a[M];
 27 void geng(int x,int l1,int l2)
 28 {
 29     int l=x*2,r=x*2+1;
 30     shu[x].su=shu[l].su+shu[r].su;
 31     for(int i=0;i<2;i++)
 32       {
 33           shu[x].le[i]=max(max(shu[l].le[i],shu[r].le[i]),shu[l].r[i]+shu[r].l[i]);
 34           shu[x].l[i]=shu[l].l[i];
 35           if(shu[x].l[i]==l1)
 36             shu[x].l[i]+=shu[r].l[i];
 37           shu[x].r[i]=shu[r].r[i];
 38           if(shu[x].r[i]==l2)
 39             shu[x].r[i]+=shu[l].r[i];
 40       }
 41 }
 42 void build(int x,int l,int r)
 43 {
 44     if(l==r)
 45       {
 46           shu[x].l[a[l]]=shu[x].le[a[l]]=shu[x].r[a[l]]=1;
 47         shu[x].su=a[l];
 48           return;
 49       }
 50     int mid=(l+r)>>1;
 51     build(x*2,l,mid);
 52     build(x*2+1,mid+1,r);
 53     geng(x,mid-l+1,r-mid);
 54 }
 55 void gg(int x,int k,int len)
 56 {
 57     shu[x].su=len*k;
 58     shu[x].l[k]=shu[x].r[k]=shu[x].le[k]=len;
 59     shu[x].l[k^1]=shu[x].r[k^1]=shu[x].le[k^1]=shu[x].yi=0;
 60     shu[x].laz=k+1;
 61 }
 62 void ggg(int x,int l1)
 63 {
 64     shu[x].su=l1-shu[x].su;
 65     swap(shu[x].l[0],shu[x].l[1]);
 66     swap(shu[x].r[0],shu[x].r[1]);
 67     swap(shu[x].le[0],shu[x].le[1]);
 68     if(!shu[x].laz)
 69       shu[x].yi^=1;
 70     else
 71       shu[x].laz=((shu[x].laz-1)^1)+1;
 72 }
 73 void updata(int x,int l1,int l2)
 74 {
 75     int l=x*2,r=x*2+1;
 76     if(shu[x].yi)
 77       {
 78           shu[x].yi=0;
 79         ggg(l,l1);
 80         ggg(r,l2);
 81       }
 82     if(shu[x].laz)
 83       {
 84           int k=shu[x].laz-1;
 85           shu[x].laz=0;
 86           gg(l,k,l1);
 87           gg(r,k,l2);
 88       }
 89 }
 90 void gai(int x,int l,int r,int L,int R,int k)
 91 {
 92     if(l>=L&&r<=R)
 93       {
 94         gg(x,k,r-l+1);
 95           return;
 96       }
 97     int mid=(l+r)>>1;
 98     updata(x,mid-l+1,r-mid);
 99     if(L<=mid)
100       gai(x*2,l,mid,L,R,k);
101     if(R>mid)
102       gai(x*2+1,mid+1,r,L,R,k);
103     geng(x,mid-l+1,r-mid);
104 }
105 void fan(int x,int l,int r,int L,int R)
106 {
107     if(l>=L&&r<=R)
108       {
109           ggg(x,r-l+1);
110           return;
111       }
112     int mid=(l+r)>>1;
113     updata(x,mid-l+1,r-mid);
114     if(L<=mid)
115       fan(x*2,l,mid,L,R);
116     if(R>mid)
117       fan(x*2+1,mid+1,r,L,R);
118     geng(x,mid-l+1,r-mid);
119 }
120 int query(int x,int l,int r,int L,int R)
121 {
122     if(l>=L&&r<=R)
123       return shu[x].su;
124
125     int mid=(l+r)>>1,ans=0;
126     updata(x,mid-l+1,r-mid);
127     if(L<=mid)
128       ans+=query(x*2,l,mid,L,R);
129     if(R>mid)
130       ans+=query(x*2+1,mid+1,r,L,R);
131     return ans;
132 }
133 int query1(int x,int l,int r,int L,int R)
134 {
135     if(l>=L&&r<=R)
136       return shu[x].le[1];
137     int mid=(l+r)>>1,ans=0,l1=0,r1=0;
138     updata(x,mid-l+1,r-mid);
139     if(L<=mid)
140       {
141         ans=max(ans,query1(x*2,l,mid,L,R));
142         if(R>mid)
143           l1=min(shu[x*2].r[1],mid-max(l,L)+1);
144       }
145     if(R>mid)
146       {
147         ans=max(ans,query1(x*2+1,mid+1,r,L,R));
148         if(L<=mid)
149           r1=min(shu[x*2+1].l[1],min(r,R)-mid);
150       }
151     ans=max(ans,l1+r1);
152     return ans;
153 }
154 int main()
155 {
156     n=read();
157     m=read();
158     for(int i=1;i<=n;i++)
159       a[i]=read();
160     build(1,1,n);
161     for(int i=1;i<=m;i++)
162       {
163           int k=read(),A=read()+1,B=read()+1;
164           if(k<2)
165             gai(1,1,n,A,B,k);
166           if(k==2)
167             fan(1,1,n,A,B);
168           if(k==3)
169             printf("%d\n",query(1,1,n,A,B));
170           if(k==4)
171             printf("%d\n",query1(1,1,n,A,B));
172       }
173     return 0;
174 }

转载于:https://www.cnblogs.com/xiw5/p/5603020.html

bzoj 1858: [Scoi2010]序列操作相关推荐

  1. P2572 [SCOI2010]序列操作

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

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

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

  3. 【[SCOI2010]序列操作】

    好颓啊,我竟然来写了一道恶心的板子 旁边的魏佬嘲讽我,还用欺负我 嘤嘤嘤 那就不膜魏佬了 嘤嘤嘤 这是一道无聊的板子 看到这些操作,我们看到这些操作就知道我们需要维护的东西了 首先那个最长的连续的\( ...

  4. luogu P2572 [SCOI2010]序列操作

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

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

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

  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. 我对计算机的看法英语作文,我对网络的看法英语作文
  2. Rosalind: 兔子与递归
  3. 实在不好意思,最近写个项目,一直没时间来灌水
  4. 101每日发现练习大图
  5. windows server 2008 如何取消禁ping
  6. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  7. Spring @Import
  8. 访问控制:protected
  9. 在PaddlePaddle框架下通过两层全连接网络实现IRIS数据分类
  10. 分享Swing学习的一些经验
  11. css 注释写法注意事项
  12. 离线脱机版个人笔记软件的选择
  13. laravel 框架使用hdjs 实现富文本编辑器功能
  14. 路由器实验之配置实验、直连路由验证、静态路由
  15. “智能营销新图景”梅花网大展华院数据主题演讲
  16. 【Salesforce】地理位置情報項目を使って周辺検索 GMaps
  17. 金融行业文档加密方案
  18. 网络变压器通频带、网络变压器插入损耗及矩形脉冲失真的关系
  19. 无公网服务器(ip)做内网穿透
  20. 发生系统错误 1219。不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。

热门文章

  1. 域名有效期10年后怎么办
  2. 揭秘企业实现企业盈利有哪些原则?
  3. 很多人想不通为什么创业失败者众成功者少
  4. 失业几个月找不到工作是一种怎样的体验?
  5. 写了一篇关于餐饮业陷入困境的文章
  6. 创始团队的执行力很重要
  7. 学会用感情营销是最高的智慧
  8. 层次分析法模型及代码
  9. 使用Microsoft数据迁移助手在Oracle数据库和SQL Server之间迁移的具体示例
  10. UK Biobank专题