主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位有0和1两种情况,0表示这个区间不存在这种颜色,1就表示存在,我在这里用到或运算,我们确定一个非叶子节点的值时,可以把它的两个儿子节点的值做或运算,只要某一位有1,那么这一位就是1了,这样就完成了颜色的上传。看代码吧。

建树:

struct node{
int w,f;    //w是颜色的二进制表示的值,f是懒标记
}tree[*+];
int n,m,k,t,a,b,c,ans;
void build(int l,int r,int k)
{
tree[k].f=;
if(l==r)
{
tree[k].w=(<<);  //初始都是2,把二进制第二位变成1
return;
}
int mid=(l+r)/;
build(l,mid,k*);
build(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}

区间修改:(区间是a到b,颜色是c)

void change_interval(int l,int r,int k)
{
if(l>=a&&r<=b)
{
tree[k].f=c;  
tree[k].w=(<<(c-));
return ;
}
if(tree[k].f) //下传懒标记
down(k);
int mid=(l+r)/;
if(mid>=a)
change_interval(l,mid,k*);
if(mid<b)
change_interval(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}

区间查询:我把所有颜色都保存到了ans里

void ask_interval(int l,int r,int k)
{
if(l>=a&&r<=b)
{
ans|=tree[k].w;
return;
}
if(tree[k].f)
down(k);
int mid=(l+r)/;
if(a<=mid)
ask_interval(l,mid,k*);
if(b>mid)
ask_interval(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}

完整代码:

#include<iostream>
#include<cstring>
using namespace std;
struct node{
int w,f;
}tree[*+];
int n,m,k,t,a,b,c,ans;
void build(int l,int r,int k)
{
tree[k].f=;
if(l==r)
{
tree[k].w=(<<);
return;
}
int mid=(l+r)/;
build(l,mid,k*);
build(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}
void down(int k)
{
tree[k*].f=tree[k].f;
tree[k*+].f=tree[k].f;
tree[k*].w=<<(tree[k].f-);
tree[k*+].w=<<(tree[k].f-);
tree[k].f=;
}
void change_interval(int l,int r,int k)
{
if(l>=a&&r<=b)
{
tree[k].f=c;
tree[k].w=(<<(c-));
return ;
}
if(tree[k].f)
down(k);
int mid=(l+r)/;
if(mid>=a)
change_interval(l,mid,k*);
if(mid<b)
change_interval(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}
void ask_interval(int l,int r,int k)
{
if(l>=a&&r<=b)
{
ans|=tree[k].w;
return;
}
if(tree[k].f)
down(k);
int mid=(l+r)/;
if(a<=mid)
ask_interval(l,mid,k*);
if(b>mid)
ask_interval(mid+,r,k*+);
tree[k].w=tree[k*].w|tree[k*+].w;
}
int main()
{
while(cin>>n>>m)
{
if(!n&&!m)
break;
build(,n,);
for(int i=;i<m;i++)
{
char ch[];
cin>>ch;
if(ch[]=='P')
{
cin>>a>>b>>c;
change_interval(,n,);
}
else if(ch[]=='Q')
{
cin>>a>>b;
ans=;
ask_interval(,n,);
int ss[],cnt=; //这个ss数组是为了保存颜色,好控制格式
memset(ss,,sizeof(ss));
for(int i=;i<=;i++)
{
if(&(ans>>(i-)))
ss[++cnt]=i;
}
for(int i=;i<=cnt;i++)
{
if(i!=cnt)
cout<<ss[i]<<' ';
else
cout<<ss[i]<<endl;
}
}
}
}
return ;
}

hdu 5023 线段树+位运算的更多相关文章

  1. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  2. poj 3225 线段树+位运算

    略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...

  3. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

  4. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  5. Codeforces 620E New Year Tree(线段树+位运算)

    题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...

  6. Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)

    链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...

  7. Count Color(线段树+位运算 POJ2777)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...

  8. HDU 5023线段树区间染色,统计区间内颜色个数

    这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...

  9. hdu 5023 线段树延迟更新+状态压缩

    /* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...

随机推荐

  1. UDP通讯协议实例

    1.服务端 import java.io.IOException; import java.net.*; public class UDPDemo { public static void main( ...

  2. day31-软件开发规范

    一.为什么要规范软件开发? 1.1 为什么要有规范软件开发 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目, ...

  3. redis开启外网访问

    redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf   打开redis.conf文件在NETWORK部分有说明   ######################### ...

  4. android平台yuv缩放相关<转>

    Android的视频相关的开发,大概一直是整个Android生态,以及Android API中,最为分裂以及兼容性问题最为突出的一部分.摄像头,以及视频编码相关的API,Google一直对这方面的控制 ...

  5. rtmp推流开源代码备注一下

    https://github.com/runner365/AnyRTC-RTMP https://github.com/runner365

  6. Others-工具箱

    pycharm下载激活工具 : https://www.lanzous.com/i20tl8f作者(来源):https://www.52pojie.cn/thread-803822-1-1.html ...

  7. [原]vue - webapp 返回无效 解决方案

  8. 一个简单的SignalR例子

    本文介绍如何使用SignalR的Hub制作一个简单的点赞页面.不同浏览器(或者不同窗口)打开同一个页面,在任何一个页面点赞,所有页面同时更新点赞数. 1.使用Visual Studio Communi ...

  9. Sonya and Exhibition 1004B

    B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. 经典论文翻译导读之《Google File System》(转)

    [译者预读] GFS这三个字母无需过多修饰,<Google File System>的论文也早有译版.但是这不妨碍我们加点批注.重温经典,并结合上篇Haystack的文章,将GFS.TFS ...