HDU3577 线段树(区间更新)

HDU3577 线段树(区间更新)

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 ,普通的线段树区间更新题目,较简单。

 


 

  相当于一个区间覆盖问题,有一点要注意的就是叶子节点是一个长度为1的区间,而不是一个离散的点,两种叶子节点的具体区别我在这篇博客里提到过。

 

#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <string> #include <string.h> #include <algorithm>
using namespace std; #define LL __int64
#define eps 1e-8
#define INF INT_MAX
#define lson l , m , rt << 1
#define rson m , r , rt << 1 | 1
const int MOD = 10000007; const int maxn = 1000000 + 5; const int N = 100000 + 5; int cnt[maxn << 2] , col[maxn << 2]; int ans[N]; void build() { memset(cnt , 0 , sizeof(cnt)); memset(ans , 0 , sizeof(ans)); memset(col , 0 , sizeof(col)); } void PushUp(int rt) { cnt[rt] = max(cnt[rt << 1] , cnt[rt << 1 | 1]); } void PushDown(int rt) { if(col[rt]) { col[rt << 1] += col[rt]; col[rt << 1 | 1] += col[rt]; cnt[rt << 1] += col[rt]; cnt[rt << 1 | 1] += col[rt]; col[rt] = 0; } } void update(int L , int R , int l , int r , int rt) { if(L <= l && R >= r) { cnt[rt]++; col[rt]++; return; } PushDown(rt); int m = (l + r) >> 1; if(L >= m) update(L , R , rson); else if(R <= m) update(L , R , lson); else { update(L , R , lson); update(L , R , rson); } PushUp(rt); } bool query(int L , int R , int k , int l , int r , int rt) { if(L <= l && R >= r) { return cnt[rt] < k; } PushDown(rt); int m = (l + r) >> 1; if(L >= m) return query(L , R , k , rson); else if(R <= m) return query(L , R , k , lson); else
        return query(L , R , k , lson) && query(L , R , k , rson); } int main() { int T , i , n , m , k , a , b; cin >> T; for(int j = 1 ; j <= T ; j++) { build(); scanf("%d %d" , &k , &m); for(i = 1 ; i <= m ; i++) { scanf("%d %d" , &a , &b); if(query(a , b , k , 1 , maxn , 1)) { update(a , b , 1 , maxn , 1); ans[i]++; } } printf("Case %d:\n" , j); for(i = 1 ; i <= m ; i++) if(ans[i]) printf("%d " , i); printf("\n\n"); } return 0; }

 

提供几组测试数据:

4
3 6
1 6
1 6
3 4
1 5
1 2
2 4

3 10
2 4
4 6
6 8
2 8
1 8
1 2
1 10
2 9
3 7
9 10

3 10
4 5
5 6
6 7
7 8
9 10
1 4
1 10
2 9
4 6
3 8

3 8
4 6
6 8
9 10
1 4
1 10
2 9
4 6
3 8

Case 1:
1 2 3 5

Case 2:
1 2 3 4 5 6 10

Case 3:
1 2 3 4 5 6 7 8

Case 4:
1 2 3 4 5 6

 

转载于:https://www.cnblogs.com/H-Vking/p/4297275.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109543.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PCR雷达传感器感应_倒车雷达传感器在哪里

    PCR雷达传感器感应_倒车雷达传感器在哪里一.设备唤醒i》检测人靠近设备ii》无视穿越的人员iii》可做手势识别应用场景:智能音箱;笔记本;广告机;投影仪;灯具;控制面板开关独特算法:1》 检测静止不动的人员,内置检测人的呼吸信号。图示为雷达传感器抓取人呼吸的信号在0.3-0.35hz效果。2》 可过滤快速移动物体干扰,内置仅对慢速移动检测,图示效果为雷达传感器过滤风扇对测试的影响。二.车内人员检测欧洲新车评估计划(EuroNCAP)计划在2022年将儿童存在检测纳入全面评级。测试评估分析:1岁婴儿睡在儿童保护座椅上

    2022年9月29日
    3
  • 面试题集锦(一)

    #一、选择题(32分)#1、python不支持的数据类型有(A)#A、char#B、int#C、float#D、list#2.下列执行的结果是(E)#x='foo&#39

    2022年3月29日
    37
  • Linux系统平均负载是如何计算的?[通俗易懂]

    Linux系统平均负载是如何计算的?[通俗易懂]关于负载的计算,它的结果是包含有小数的一个浮点数,内核中是不能使用float变量的,那么这里就采用了一个整型变量的低11位来表示小数部分。那么对于数值1来说,它就是FIXED_1,也就是需要对1进行左移11bit。实际上此时这个整型变量保存的值是1024。cat/proc/loadavg0.430.580.655/701045102那么我们通过cat命令查看负载值如上说是,它显示的是带有两个小数表示的一个浮点数,所以最后在输出这个数值时还需要做一个转换,如果从1024个值中得出这100小数

    2022年9月12日
    2
  • 证明frobenius范数是个范数_1范数怎么求

    证明frobenius范数是个范数_1范数怎么求Frobenius范数,简称F-范数,是一种矩阵范数,记为||·||F。矩阵A的Frobenius范数定义为矩阵A各项元素的绝对值平方的总和,即

    2022年8月3日
    5
  • 《MySQL必懂系列》全局锁、表级锁、行锁

    《MySQL必懂系列》全局锁、表级锁、行锁

    2022年2月17日
    43
  • so文件格式详解_文件xls文件怎么打开

    so文件格式详解_文件xls文件怎么打开可执行链接格式(ExecutableandLinkingFormat)最初是由UNIX系统实验室(UNIXSystemLaboratories,USL)开发并发布,作为应用程序二进制接口(ApplicationBinaryInterface,ABI)的一部分,它是一种常用的目标文件格式,主要包含以下三种类型1、可重定位文件:可与其它目标文件一起创建可执行文件和共

    2022年9月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号