题意: Change operations:
0 a b change all characters into '0's in [a , b]
1 a b change all characters into '1's in [a , b]
2 a b change all '0's into '1's and change all '1's into '0's in [a, b]
Output operations:
3 a b output the number of '1's in [a, b]
4 a b output the length of the longest continuous '1' string in [a , b]

Sample Input
1
10 10
0 0 0 1 1 0 1 0 1 1
1 0 2
3 0 5
2 2 2
4 0 4
0 3 6
2 3 7
4 2 8
1 0 5
0 5 6
3 3 9

Sample Output

5
2
6
5

嗯嗯

2015-07-26:专题复习

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
const int MAXN=;
int n,m,t,Min,tt;
int msum1[MAXN<<],col[MAXN<<],lsum1[MAXN<<],rsum1[MAXN<<];
int msum0[MAXN<<],lsum0[MAXN<<],rsum0[MAXN<<],xxor[MAXN<<];
int sum1[MAXN<<],sum0[MAXN<<];
void fun1(int rt,int m,int val) //改变区间内0/1的变化
{
msum1[rt]=lsum1[rt]=rsum1[rt]=sum1[rt]=val?m:;
msum0[rt]=lsum0[rt]=rsum0[rt]=sum0[rt]=val?:m;
}
void fun2(int rt)
{
swap(msum1[rt],msum0[rt]);
swap(lsum1[rt],lsum0[rt]);
swap(rsum1[rt],rsum0[rt]);
swap(sum1[rt],sum0[rt]);
} void pushup(int rt,int m)
{
sum1[rt]=sum1[rt<<]+sum1[rt<<|];
lsum1[rt]=lsum1[rt<<];
rsum1[rt]=rsum1[rt<<|];
if(lsum1[rt]==(m-(m>>))) lsum1[rt]+=lsum1[rt<<|];
if(rsum1[rt]==(m>>)) rsum1[rt]+=rsum1[rt<<];
msum1[rt]=max(lsum1[rt<<|]+rsum1[rt<<],max(msum1[rt<<],msum1[rt<<|])); sum0[rt]=sum0[rt<<]+sum0[rt<<|];
lsum0[rt]=lsum0[rt<<];
rsum0[rt]=rsum0[rt<<|];
if(lsum0[rt]==(m-(m>>))) lsum0[rt]+=lsum0[rt<<|];
if(rsum0[rt]==(m>>)) rsum0[rt]+=rsum0[rt<<];
msum0[rt]=max(lsum0[rt<<|]+rsum0[rt<<],max(msum0[rt<<],msum0[rt<<|]));
}
void build(int l,int r,int rt)
{
col[rt]=-;
xxor[rt]=;
if(l==r)
{
int num;
scanf("%d",&num);
msum1[rt]=lsum1[rt]=rsum1[rt]=sum1[rt]=num?:;
msum0[rt]=lsum0[rt]=rsum0[rt]=sum0[rt]=num?:;
return;
}
build(lson);
build(rson);
pushup(rt,r-l+);
}
void pushdown(int rt,int m)
{
if(col[rt]!=-)
{
xxor[rt<<]=xxor[rt<<|]=;
col[rt<<]=col[rt<<|]=col[rt];
fun1(rt<<,m-(m>>),col[rt]);
fun1(rt<<|,m>>,col[rt]);
col[rt]=-;
}
else if(xxor[rt])
{
if(col[rt<<]!=-)
{
col[rt<<]^=;
fun1(rt<<,m-(m>>),col[rt<<]);
}
else
{
xxor[rt<<]^=;
fun2(rt<<); //最大连续1的变化有点麻烦,必须要重新开一个最大连续0的变量
}
if(col[rt<<|]!=-)
{
col[rt<<|]^=;
fun1(rt<<|,(m>>),col[rt<<|]);
}
else
{
xxor[rt<<|]^=;
fun2(rt<<|);
}
xxor[rt]=;
}
}
void update(int L,int R,int val,int l,int r,int rt)
{
if(l>=L&&r<=R)
{
if(val<=)
{
xxor[rt]=;
col[rt]=val;
fun1(rt,r-l+,val);
}
else
{
if(col[rt]!=-)
{
col[rt]^=;
fun1(rt,r-l+,col[rt]);
}
else
{
xxor[rt]^=;
fun2(rt);
}
}
return;
}
pushdown(rt,r-l+);
if(L<=mid) update(L,R,val,lson);
if(R>mid) update(L,R,val,rson);
pushup(rt,r-l+);
}
int query1(int L,int R,int l,int r,int rt) //查询区间内1的个数
{
if(l>=L&&r<=R)
{
return sum1[rt];
}
pushdown(rt,r-l+);
int ans=;
if(L<=mid) ans+=query1(L,R,lson);
if(R>mid) ans+=query1(L,R,rson);
return ans;
}
int query2(int L,int R,int l,int r,int rt) //查询区间内最长连续1的个数
{
if(l>=L&&r<=R)
{
return msum1[rt];
}
pushdown(rt,r-l+); if(R<=mid) return query2(L,R,lson);
if(L>mid) return query2(L,R,rson);
int a=query2(L,R,lson);
int b=query2(L,R,rson);
a=max(a,b);
b=min(mid-L+,rsum1[rt<<])+min(R-mid,lsum1[rt<<|]);
return max(a,b);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int t,n,m,op,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
build(root);
while(m--)
{
scanf("%d%d%d",&op,&a,&b);
a++,b++;
if(op<=) update(a,b,op,root);
else
{
if(op==) printf("%d\n",query1(a,b,root));
else printf("%d\n",query2(a,b,root));
}
}
}
return ;
}
 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int num0[maxn<<],num1[maxn<<];
int lb0[maxn<<],lb1[maxn<<];
int rb0[maxn<<],rb1[maxn<<];
int mx1[maxn<<],mx0[maxn<<];
int col[maxn<<];
int xxor[maxn<<];
int num;
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
void pushup(int rt,int m)
{
lb0[rt]=lb0[rt<<];rb0[rt]=rb0[rt<<|];
if(lb0[rt]==m-(m>>)) lb0[rt]+=lb0[rt<<|];
if(rb0[rt]==(m>>)) rb0[rt]+=rb0[rt<<]; lb1[rt]=lb1[rt<<];rb1[rt]=rb1[rt<<|];
if(lb1[rt]==m-(m>>)) lb1[rt]+=lb1[rt<<|];
if(rb1[rt]==(m>>)) rb1[rt]+=rb1[rt<<]; num0[rt]=num0[rt<<]+num0[rt<<|];
num1[rt]=num1[rt<<]+num1[rt<<|]; mx1[rt]=max(mx1[rt<<],mx1[rt<<|]);
mx1[rt]=max(mx1[rt],rb1[rt<<]+lb1[rt<<|]); mx0[rt]=max(mx0[rt<<],mx0[rt<<|]);
mx0[rt]=max(mx0[rt],rb0[rt<<]+lb0[rt<<|]);
}
void build(int l,int r,int rt){
col[rt]=-; xxor[rt]=;
if(l==r){
scanf("%d",&num);
num0[rt]=lb0[rt]=rb0[rt]=mx0[rt]=(num?:);
num1[rt]=lb1[rt]=rb1[rt]=mx1[rt]=(num?:);
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt,r-l+);
}
void init(int rt,int m,int cmd){
lb0[rt]=rb0[rt]=mx0[rt]=num0[rt]=m*(-cmd);
lb1[rt]=rb1[rt]=mx1[rt]=num1[rt]=m*cmd;
}
void change(int rt){
swap(lb0[rt],lb1[rt]);
swap(rb0[rt],rb1[rt]);
swap(mx0[rt],mx1[rt]);
swap(num0[rt],num1[rt]);
}
void pushdown(int rt,int m){
if(col[rt]!=-){
col[rt<<]=col[rt<<|]=col[rt];
xxor[rt<<]=xxor[rt<<|]=;
init(rt<<,m-(m>>),col[rt]);
init(rt<<|,(m>>),col[rt]);
col[rt]=-;
}
else if(xxor[rt]){
if(col[rt<<]!=-){
col[rt<<]^=;
init(rt<<,m-(m>>),col[rt<<]);
}
else {
xxor[rt<<]^=;
change(rt<<);
}
if(col[rt<<|]!=-){
col[rt<<|]^=;
init(rt<<|,(m>>),col[rt<<|]);
}
else {
xxor[rt<<|]^=;
change(rt<<|);
}
xxor[rt]=;
}
}
void update(int L,int R,int cmd,int l,int r,int rt){
if(L<=l&&r<=R){
if(cmd<=){
xxor[rt]=;//取消异或标记
col[rt]=cmd;//真个区间被完全覆盖为cmd
init(rt,r-l+,cmd);
}
else {
if(col[rt]!=-){//被完全覆盖,全是0或者全是1,相当于取反
col[rt]^=;
init(rt,r-l+,col[rt]);
}
else {
xxor[rt]^=;
change(rt);
}
}
return ;
}
pushdown(rt,r-l+);
int m=(l+r)>>;
if(L<=m) update(L,R,cmd,lson);
if(R>m) update(L,R,cmd,rson);
pushup(rt,r-l+);
}
int query1(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return num1[rt];
pushdown(rt,r-l+);
int m=(l+r)>>;
int ans=;
if(L<=m) ans+=query1(L,R,lson);
if(R>m) ans+=query1(L,R,rson);
return ans;
}
int query2(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) {
return mx1[rt];
}
pushdown(rt,r-l+);
int m=(l+r)>>;
if(R<=m) return query2(L,R,lson);
if(L>m) return query2(L,R,rson);
int a=query2(L,R,lson);
int b=query2(L,R,rson);
a=a>b?a:b;
b=min(m-L+,rb1[rt<<])+min(R-m,lb1[rt<<|]);
return a>b?a:b;
}
int main(){
int t,n,m,op,a,b;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
build(,n-,);
while(m--){
scanf("%d%d%d",&op,&a,&b);
if(op<=) update(a,b,op,,n-,);
else {
if(op==) printf("%d\n",query1(a,b,,n-,));
else printf("%d\n",query2(a,b,,n-,));
}
}
}
return ;
}

hdu 3397 线段树的更多相关文章

  1. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  3. HDU 3397 线段树区间修改

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. HDU 3397 线段树 双懒惰标记

    这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了 自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了 跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全 ...

  5. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  9. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

随机推荐

  1. 20145202马超 2016-2017-2 《Java程序设计》第三次实验

    实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 在IDEA中使用工具(Code->Re ...

  2. springcloud的Turbine配置监控多个服务的一些坑!!!!InstanceMonitor$MisconfiguredHostException,No message available","path":"/actuator/hystrix.stream,页面不显示服务或者一直loading

    踩了几个小时坑,使用仪表盘监控单个服务的时候很容易,但是一到多个服务,瞬间坑就来了,大概碰到下面三个: 1InstanceMonitor$MisconfiguredHostException, No ...

  3. mysql优化【转】

    最近听讲了博森瑞老师的mysql优化公开课,这个是我整理的笔记. 现在说一下mysql的内存和I/O方面的两个特点. 一. mysql内存特点: 1.  也有全局内存和每个session的内存(每个s ...

  4. Add custom daemon on Linux System

    Ubuntu add custom service(daemon) Task 需要在系统启动的时候自动启动一个服务(后台程序),在系统关闭的时候关闭服务. 比如在部署某个应用之前,需要将某个任务设置成 ...

  5. jdbc一次性采集mysql和oracle的海量数据,5000W+为例

    最近做的采集工具遇到采集一天数据(超过5000W行数据)的情况, 采集mysql的时候直接采用流式读取的方式可以一次全部都读取出来,速度的话取决于网络速度 stmt = conn.createStat ...

  6. 忘记SVN密码怎么办

    1:下载TSvnPwd.exe 2:使用wireshark抓包.例如: PROPFIND /svn/dev2/!svn/vcc/default HTTP/1.1Host: 192.168.156.1: ...

  7. dedecms自定义模型之独立模型在首页、列表页、内容调用内容

    dedecms关于自定义模型(独立模型)的首页.列表页.内容怎么调用?在后台自定义模型(独立模型)的建立及自定义字段的添加比较简单,需要注意两点: (1)如果某个字段需要在前台列表页显示,则在前台参数 ...

  8. 浮动元素垂直居中,bootstrap栅格布局垂直居中

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. HDU 4632 Palindrome subsequence(区间DP求回文子序列数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...

  10. python图片处理(二)

    python中图像处理有pillow和skimage 图像中一般有个RGBA值,RGB顾名思义就是红绿蓝值,A表示alpha表示是透明度. from PIL import ImageColor pri ...