CF915E Physical Education Lessons(线段树动态开点)

这篇博客探讨了动态开点线段树在解决CF915E题目中的应用,强调动态开点对于简化问题的重要性。作者指出,虽然动态开点可以简化离散化的复杂过程,但需要注意空间复杂度的控制,尤其是在面对3e5次询问和1e9规模的n值时。文中提到,采用只存储l和r指针的方法可以节省空间,但可能会使空间需求接近2logn。此外,线段树的懒惰标记法用于处理修改操作,配合快速输入避免超时。
摘要由CSDN通过智能技术生成

传送门
会动态开点的话是裸题.不会的话学完就是例题.
动态开点有很多种写法.建议大家根据自己平时写的普通线段树的写法转化成自己的独特写法.说一下开点的问题.
这题离散化可以做但是有点麻烦.动态开点会方便一点,但空间复杂度要很注意才不会爆.我的写法是只存l,r指针不存这个节点表示的l,r区间范围.因为这样子要多开2个空间去存这两个信息,这题的询问有3e5,n在1e9,空间卡的比较死.而且我的懒惰写法会比实际多开一倍的点,所以空间可能不够用,开满了才勉勉强强够用.至于开多大保险.答案是能开多大开多大.
为什么会多开一倍呢,因为不管用到左边的区间还是右边的区间,我都暴力的开两个区间记录,所以一次询问就开了2logn个节点.
线段树的操作部分没什么好讲的,用一个lazy标记记录一下被修改过的值就好了.
我的线段树自带大常数,所以用快读输入了一下,不然tle
代码

#pragma GCC optimize(2)
#define LL long long
#define pq priority_queue
#define ULL unsigned long long
#define pb push_back
#define mem(a,x) memset(a,x,sizeof a)
#define pii pair<int,int>
#define fir(i,a,b) for(int i=a;i<=b;++i)
#define afir(i,a,b) for(int i=a;i>=b;--i)
#define ft first
#define vi vector<int>
#define sd second
#define ALL(a) a.begin(),a.end()
#define bug puts("-------")
#define lson tree[i].ls
#define rson tree[i].rs
#include <bits/stdc++.h>

using namespace std;
const int N = 2e5+10;
const int MAX_N = 1.5e7+10;

inline int read(){
   
	int x = 0,f=1;char ch = getchar();
	while(ch<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值