hdu-5023线段树刷题
title: hdu-5023线段树刷题
date: 2018-10-18 13:32:13
tags:
- acm
- 刷题
categories: - ACM-线段树
概述
这道题和上次做的那道染色问题一样,,,这次主要是看看我再过去两三天之后,,大概凭借以前的记忆敲出来得多长的时间,,,,
结果是,,,大体的框架没问题了,,,,一遍下来编译也没问题,,,但是,,细节问题有两个,,,
- 数组写成了1e6而不是1e6+10虽然对本题没什么影响,,
- 建树中的初始化操作时染色初始化为2,,,所以应该是从右往左数的第二个bit记为1,,,然后我就少算了一位,,,因为bitset可以看作是一个从右向左并且从0开始的数组,,所以是col[1] = 1,,,这样wa了一发
- 最后一个,,,,输出格式错误,,,,噗噗噗噗
代码
思路与poj那一道一模一样,,直接扔代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
const int maxn = 1e6 + 10;
struct node
{
int l;
int r;
int laz;
bitset<30> col;
}node[maxn << 2];
#define aaa cout << node[rt].col << endl;
void build(int rt , int l , int r)
{
node[rt].l = l;
node[rt].r = r;
node[rt].laz = 0;
node[rt].col = 0;
if(node[rt].l == node[rt].r)
{
bitset<30> t;
t.set(1);
node[rt].col = t;
return;
}
int mid = (node[rt].l + node[rt].r) >> 1;
build(rt << 1 , l , mid);
build(rt << 1 | 1 , mid + 1 , r);
node[rt].col = node[rt << 1].col | node[rt << 1 | 1].col;
return;
}
void pushdown(int rt)
{
if(node[rt].laz)
{
node[rt << 1].col = node[rt].col;
node[rt << 1 | 1].col = node[rt].col;
node[rt << 1].laz = node[rt].laz;
node[rt << 1 | 1].laz = node[rt].laz;
node[rt].laz = 0;
}
}
void update(int rt , int L , int R , int C)
{
if(L <= node[rt].l && node[rt].r <= R)
{
bitset<30> t;
t.set(C - 1);
node[rt].col = t;
node[rt].laz = C;
return;
}
pushdown(rt);
int mid = (node[rt].l + node[rt].r) >> 1;
if(L <= mid) update(rt << 1 , L , R , C);
if(R > mid) update(rt << 1 | 1 , L , R , C);
node[rt].col = node[rt << 1].col | node[rt << 1 | 1].col;
return;
}
bitset<30> query(int rt , int L , int R)
{
if(L <= node[rt].l && node[rt].r <= R)
{
return node[rt].col;
}
pushdown(rt);
bitset<30> ans(0);
int mid = (node[rt].l + node[rt].r) >> 1;
if(L <= mid) ans |= query(rt << 1 , L , R);
if(R > mid) ans |= query(rt << 1 | 1 , L , R);
return ans;
}
int main()
{
int n , m;
while(scanf("%d%d" , &n , &m) && n && m)
{
build(1 , 1 , n);
while(m--)
{
char c;
scanf(" %c" , &c);
if(c == 'P')
{
int l , r , v;
scanf("%d%d%d" , &l , &r , &v);
update(1 , l , r , v);
}
else
{
int l , r;
scanf("%d%d" , &l , &r);
bitset<30> ans = query(1 , l , r);
bool flag = true;
for(int i = 1; i <= 30; ++i , ans>>=1)
if(ans[0] == 1)
if(flag)
printf("%d" , i) , flag = false;
else
printf(" %d" , i);
printf("\n");
}
}
}
}
先水一题,,,下午继续QAQ
(end)
hdu-5023线段树刷题的更多相关文章
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- poj-2777线段树刷题
title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...
- zoj-1610线段树刷题
title: zoj-1610线段树刷题 date: 2018-10-16 16:49:47 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道简单的线段树区间染色问 ...
- hdu 5023 线段树+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...
- HDU 5023线段树区间染色,统计区间内颜色个数
这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...
- hdu 5023 线段树+位运算
主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...
- hdu 5023 线段树延迟更新+状态压缩
/* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...
- HDU 4893 线段树裸题
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu 5023 线段树
成端更新+统计区间内的值 挺模板的题... 一开始没想起来用set统计,傻傻地去排序了[大雾 #include<iostream> #include<cstdio> #incl ...
随机推荐
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第六课 CronTrigger
第六课 CronTrigger CronTrigger比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间. 使用Simp ...
- 视差滚动(Parallax Scrolling)的一点小心得
下面内容来源于我知乎的这个答案:http://www.zhihu.com/question/20990029/answer/21436067 假期有空,整理到博客园这边,并做了一些语境的调整. ——— ...
- python加速包numba并行计算多线程
1.下面直接上代码需要注意的地方numba的官网找到 1)有一些坑自己去numba的官网找找看,下面是我的写的一个加速的程序,希望对你有帮助. #coding:utf-8 import time fr ...
- Css之备忘录~
1.background-size:contain/cover 两者的作用都是一样,一般用于设置小图标作为背景图,两者的区别是: Contain:不会失真 cover:会失真 2.a标签里面如 ...
- [转]GCC常用参数详解
简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 .gcc/g++在执行编译工作的时候,总共需要以下几步:1.预处理,生成.i的文件[预处理器cpp]2.将预处理后 ...
- 【逆向知识】PE ASLR
1.知识点 微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出 ASLR技术会使PE文件 ...
- leetcode刷刷刷
1.链表节点的插入排序(写了个插入排序,但是报段错误,自己编译器里能运行) #include <iostream> #include <stdlib.h> #include & ...
- Django 基于类的视图(CBV)执行流程 CBV 源码分析
一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...
- 定制Eclipse
转载自http://chriszz.sinaapp.com 一般从Eclipse官网eclipse.org下载的,都是打包好的版本,比如标准版.jee版.java版.c++版.php版.测试版等.有时 ...
- HTML标签列表总览
超文本标记语言(简称:HTML)标记标签通常被称为HTML标签,HTML标签是HTML语言中最基本的单位,HTML标签是HTML(标准通用标记语言下的一个应用)最重要的组成部分.HTML标签的大小写无 ...