bzoj 1858: [Scoi2010]序列操作
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]序列操作相关推荐
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
- BZOJ1858 [Scoi2010]序列操作 线段树
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1858 题意概括 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1 ...
- 【[SCOI2010]序列操作】
好颓啊,我竟然来写了一道恶心的板子 旁边的魏佬嘲讽我,还用欺负我 嘤嘤嘤 那就不膜魏佬了 嘤嘤嘤 这是一道无聊的板子 看到这些操作,我们看到这些操作就知道我们需要维护的东西了 首先那个最长的连续的\( ...
- luogu P2572 [SCOI2010]序列操作
传送门 这个题我写了差不多一周吧-- 终于改成了一个能在考试的时候写完的版本 大量的区间操作 1e5 显然线段树解决 确实是板子题 但是极其难调-- 最后听rabbithu学姐讲了一下才用" ...
- Luogu P2572 [SCOI2010]序列操作 线段树。。
咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1961 Solved: 991 [Submit][Stat ...
- bzoj 2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MB [Submit][Status][Discuss] Description 有一个长度为n的序列 ...
- 问题 F: 序列操作Ⅱ(前缀最大公约数,后缀最大公约数)
问题 F: 序列操作Ⅱ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选择一个数 ...
- 问题 E: 序列操作Ⅰ(01背包)
问题 E: 序列操作Ⅰ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选出若干个 ...
最新文章
- 我对计算机的看法英语作文,我对网络的看法英语作文
- Rosalind: 兔子与递归
- 实在不好意思,最近写个项目,一直没时间来灌水
- 101每日发现练习大图
- windows server 2008 如何取消禁ping
- 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
- Spring @Import
- 访问控制:protected
- 在PaddlePaddle框架下通过两层全连接网络实现IRIS数据分类
- 分享Swing学习的一些经验
- css 注释写法注意事项
- 离线脱机版个人笔记软件的选择
- laravel 框架使用hdjs 实现富文本编辑器功能
- 路由器实验之配置实验、直连路由验证、静态路由
- “智能营销新图景”梅花网大展华院数据主题演讲
- 【Salesforce】地理位置情報項目を使って周辺検索 GMaps
- 金融行业文档加密方案
- 网络变压器通频带、网络变压器插入损耗及矩形脉冲失真的关系
- 无公网服务器(ip)做内网穿透
- 发生系统错误 1219。不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。