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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用Pycharm连接服务器[通俗易懂]

    利用Pycharm连接服务器[通俗易懂]利用Pycharm连接服务器前言当下,很多深度学习的模型需要高配置的设备来跑,本地的pc可能无法满足要求。所以就需要利用服务器来训练,但是在服务器上操作代码不是很方便。利用Pycharm可以在本地编写/修改代码,能够同步到服务器上,并且能直接在本地利用pycharm运行同步到服务器上的代码。非常的方便。-前提一台装有anaconda的服务器,本地装了专业版的pycharm。操作步骤步骤一:在pycharm上使用服务器的python环境用pycharm任意打开一个项目,从工具栏中选择Fil

    2022年8月29日
    1
  • idea修改文字大小_为什么idea设置不了字体大小

    idea修改文字大小_为什么idea设置不了字体大小idea设置修改字体大小与样式详细步骤【备注】:不同idea版本设置方法类似,找到对应的面板设置即可第一步:点击工具栏最上方的File选项第二步:选择Setting选项第三步:选择Appearance选项,选择size设置自己喜欢的大小即可,我设置为14第四步:选择Editor选项中的font面板,同样找到size,设置对应的大小,即可设置代码主窗口的字体大小ide…

    2022年8月29日
    1
  • war包解压与压缩_ls命令linux

    war包解压与压缩_ls命令linux下面要给大家介绍到的就是和war包解压以及java项目打包成war包相关的内容,一起来具体的看看吧!1、javawar打包、解压命令在Window上war包的解压,经常会将工程打包成war包,如下://将当前目录打包成war包jarcvftemp.war*/.命令格式:javacvf打包文件名称要打包的目录打包文件保存路径解压自然就是:jarxvftemp.warjar和li…

    2022年10月4日
    0
  • BYTE类型的使用

    BYTE类型的使用BYTE类型的使用:BYTE在VC的定义为Unsingnedchar,在语义上九可以理解为单个字符类型,而在实际应用中BYTE泽多应用在数据类型的使用上,如16进制数组(用于表示数据流),在本次使用的IP地址控件中用于表示Ip地址栏的四个IP地址值,这样就会与其本来的定义似乎有冲突。通过断点运行发现,系统对BYTE类型的处理是这样的:当输入数字类型的BYT

    2022年6月28日
    57
  • CAD制图系列之中心线画法[通俗易懂]

    CAD制图系列之中心线画法[通俗易懂]我们将做个简单的笔记:CAD中心线怎么画CAD中心线一般为点划线,画法很简单,首先先设置线型一般步骤为:1、首先,打开CAD,点击进入图层特性管理器2、在图层特性管理器中点击线型进行设置3

    2022年8月3日
    11
  • Swift 书面 ToDo App

    Swift 书面 ToDo App

    2022年1月5日
    157

发表回复

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

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