Sequence operation(线段树区间多种操作)
Sequence operation
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7452 Accepted Submission(s): 2220
题解:测试数据对了但是一直re。。。。先贴着吧。。。
0,1,2,代表操作,0代表将区间内全部变为0,1代表区间内全部变为1,2代表区间内0,1取反
3,4代表查询,3代表查询区间内1的总数,4代表查询区间内最长连续1的个数
re代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x,y) scanf("%lf%lf",&x,&y)
#define P_ printf(" ")
#define ll root<<1
#define rr root<<1|1
#define lson ll,l,mid
#define rson rr,mid+1,r
typedef long long LL;
const int MAXN=;
struct Node{
int len,n0,ln0,rn0,sum,v,lazy,x_or;
int n1,ln1,rn1;
Node init(){
SI(v);
n0=ln0=rn0=(v==);
n1=ln1=rn1=(v==);
sum=v;
}
};
Node tree[MAXN<<];
void XOR(int root,int v){
swap(tree[root].n0,tree[root].n1);
swap(tree[root].ln0,tree[root].ln1);
swap(tree[root].rn0,tree[root].rn1);
tree[root].sum=v-tree[root].sum;
if(tree[root].lazy!=-)tree[root].lazy^=;
//printf("%d %d %d %d %d %d\n",tree[root].n0,tree[root].ln0,tree[root].rn0,tree[root].n1,tree[root].ln1,tree[root].rn1);
}
void pushup(int root){
tree[root].sum=tree[ll].sum+tree[rr].sum;
tree[root].ln0=tree[ll].ln0;
tree[root].rn0=tree[rr].rn0;
if(tree[ll].ln0==tree[ll].len)tree[root].ln0+=tree[rr].ln0;
if(tree[rr].rn0==tree[rr].len)tree[root].rn0+=tree[ll].rn0;
tree[root].n0=max(max(tree[root].ln0,tree[root].rn0),tree[ll].rn0+tree[rr].ln0); tree[root].ln1=tree[ll].ln1;
tree[root].rn1=tree[rr].rn1;
if(tree[ll].ln1==tree[ll].len)tree[root].ln1+=tree[rr].ln1;
if(tree[rr].rn1==tree[rr].len)tree[root].rn1+=tree[ll].rn1;
tree[root].n1=max(max(tree[root].ln1,tree[root].rn1),tree[ll].rn1+tree[rr].ln1); }
void pushdown(int root,int v){
if(tree[root].lazy!=-){
tree[ll].lazy=tree[rr].lazy=tree[root].lazy;
tree[ll].ln0=tree[ll].n0=tree[ll].rn0=tree[root].lazy?:tree[ll].len;
tree[rr].ln0=tree[rr].n0=tree[rr].rn0=tree[root].lazy?:tree[rr].len;
tree[rr].ln1=tree[rr].n1=tree[rr].rn1=tree[root].lazy?tree[rr].len:;
tree[ll].ln1=tree[ll].n1=tree[ll].rn1=tree[root].lazy?tree[ll].len:;
tree[ll].sum=tree[root].lazy?tree[ll].len:;
tree[rr].sum=tree[root].lazy?tree[rr].len:;
/*
tree[root].sum=v;
tree[root].ln0=tree[root].rn0=tree[root].lazy?0:tree[root].len;
tree[root].ln1=tree[root].rn1=tree[root].lazy?tree[root].len:0;
*/
tree[ll].x_or=tree[rr].x_or=;
tree[root].lazy=-;
}
if(tree[root].x_or){
tree[ll].x_or^=;
tree[rr].x_or^=;
XOR(ll,tree[ll].len);
XOR(rr,tree[rr].len);
tree[root].x_or=;
}
}
void build(int root,int l,int r){
tree[root].len=r-l+;
tree[root].lazy=-;
tree[root].x_or=;
if(l==r){
tree[root].init();return;
}
int mid=(l+r)>>;
build(lson);build(rson);
pushup(root);
}
void update(int root,int l,int r,int A,int B,int c){
int mid=(l+r)>>;
pushdown(root,tree[root].len);
if(l>=A&&r<=B){
//printf("c=%d\n",c);
if(c<){
tree[root].lazy=c;
tree[root].sum=tree[root].lazy?tree[root].len:;
tree[root].n0=tree[root].ln0=tree[root].rn0=tree[root].lazy?:tree[root].len;
tree[root].n1=tree[root].ln1=tree[root].rn1=tree[root].lazy?tree[root].len:;
}
else{
tree[root].x_or=;
XOR(root,tree[root].len);
}
return;
}
pushdown(root,r-l+);
if(mid>=A)update(lson,A,B,c);
if(mid<B)update(rson,A,B,c);
pushup(root);
}
int query(int root,int l,int r,int A,int B,int c){
if(l>=A&&r<=B){
// printf("%d %d\n",tree[root].sum,tree[root].n1);
if(c==)return tree[root].sum;
else return tree[root].n1;
}
pushdown(root,r-l+);
int mid=(l+r)>>;
if(mid>=B)return query(lson,A,B,c);
else if(mid<A)return query(rson,A,B,c);
else{
int ans1=query(lson,A,mid,c);
int ans2=query(rson,mid+,B,c);
if(c==)return ans1+ans2;
else return max(max(ans1,ans2),min(mid-A+,tree[ll].rn1)+min(B-mid,tree[rr].ln1));
}
}
int main(){
int T,N,M;
SI(T);
while(T--){
SI(N);SI(M);
build(,,N-);
while(M--){
int p,a,b;
scanf("%d%d%d",&p,&a,&b);
if(p<=)update(,,N-,a,b,p);
else{
printf("%d\n",query(,,N-,a,b,p));
}
}
}
return ;
}
Sequence operation(线段树区间多种操作)的更多相关文章
- hdu 3397 Sequence operation (线段树 区间合并 多重标记)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...
- hdu 3397 Sequence operation 线段树 区间更新 区间合并
题意: 5种操作,所有数字都为0或1 0 a b:将[a,b]置0 1 a b:将[a,b]置1 2 a b:[a,b]中的0和1互换 3 a b:查询[a,b]中的1的数量 4 a b:查询[a,b ...
- 线段树区间更新操作及Lazy思想(详解)
此题题意很好懂: 给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...
- hdu-3397 Sequence operation 线段树多种标记
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...
- hdu3397 Sequence operation 线段树
hdu3397 Sequence operation #include <bits/stdc++.h> using namespace std; ; struct node { /// l ...
- HDU 4578 Transformation (线段树区间多种更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...
- hdu 3397 Sequence operation 线段树
题目链接 给出n个数, 每个数是0或1, 给5种操作, 区间变为1, 区间变为0, 区间0,1翻转, 询问区间内1的个数, 询问区间内最长连续1的个数. 需要将数组开成二维的, 然后区间0, 1翻转只 ...
- Transformation(线段树+HDU4578+多种操作+鬼畜的代码)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目: 题意:n个数初始值为0,进行四种操作:1.将区间内的数字加c:2.将区间内的数字乘c:3 ...
- HDU-4578 Transformation(线段树的多种区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others) Memory Lim ...
随机推荐
- python 爬虫时遇到问题及解决
源代码: #unicoding=utf-8import reimport urllib def gethtml(url): html=urllib.urlopen(url) page=html.rea ...
- 浅析document.createDocumentFragment()与js效率
对于循环批量操作页面的DOM有很大帮助!利用文档碎片处理,然后一次性append,并且使用原生的javascript语句操作 document.createDocumentFragment()说白了就 ...
- 移动网络山寨版(OpenBTS)的意义或者无意义 【1】
在美国内华达州北部,靠近加州的峡谷中,有一片平坦的沙漠,名叫黑岩沙漠(Black Rock Desert).自从1986年以来,每年夏天,在这片沙漠中,都会举办一个为期八天的狂欢节.这个狂欢节的名字叫 ...
- 论山寨手机与Android联姻 【6】MTK手机的基带芯片
MTK的硬件技术的核心,在于它的基带芯片.为了降低成本,同时缩减手机主板的面积,基带芯片中除了CPU以外,还集成了很多外设控制器.Feature Phone的功能,基本上取决于基带芯片所支持的外设功能 ...
- SSH连接不上
网上查了 大概说,一要安装开启ssh服务 然后关掉防火墙 service sshd restart service iptables stop 可是我用了之后还是连接不上, 很郁闷. 我尝试着ping ...
- Windows下使用XManager访问Ubuntu 11.04的设置方法
1.Download the attached file and upload it to the server. And, enter the following command to update ...
- git push报错
git: No refs in common and none specified; doing no (2012-10-28 11:43:10) 转载▼ 标签: 杂谈 分类: 项目管理 用gitol ...
- 可解压带中文名称文件的zip包
package com.text.ziptest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; i ...
- Web API Login with Cookie
public HttpWebResponse InitiliazeWebRequest() { string responseData =string.Empty;//string url = Get ...
- Coroutine,你究竟干了什么?
一 引子 使用Unity已经有一段时间了,对于Component.GameObject之类的概念也算是有所了解,而脚本方面从一开始就选定了C#,目前来看还是挺明智的:Boo太小众,而且支持有限:JS( ...