首页 > 其他分享 >CF915E 题解(动态开点线段树)

CF915E 题解(动态开点线段树)

时间:2023-03-12 13:57:09浏览次数:49  
标签:val int 题解 线段 tr mid CF915E laz

题目传送门

简要题意:题面就挺简要的。

看到题目第一眼想到线段树,再看一眼数据范围,\(1 ≤ n ≤ 10^9\),
,既然不能直接用线段树,那怎么办呢?可以离散化,为了避免麻烦的离散化,我们选择一种简单好用的方式, 动态开点线段树!!!!!

跟线段树差不多,只不过不再记录左右端点而是记录左右端点的编号,在需要创建这个儿子的时候再创建它,这样就能避免空间太大炸掉了,剩下的看代码理解吧。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long ull;
const int N = 1.5e7 + 5, INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;

int n, q, rt;
struct segment_tree
{
	int l, r, val, laz = -1;
}tr[N];
int idx;

void pushup(int x)
{
	tr[x].val = tr[tr[x].l].val + tr[tr[x].r].val;
}

void pushdown(int x, int l, int r)
{
	if(tr[x].laz == -1) return;
	int mid = l + r >> 1;
	if(!tr[x].l) tr[x].l = ++ idx;
	tr[tr[x].l].val = tr[x].laz * (mid - l + 1);
	tr[tr[x].l].laz = tr[x].laz;
	if(!tr[x].r) tr[x].r = ++ idx;
	tr[tr[x].r].val = tr[x].laz * (r - mid);
	tr[tr[x].r].laz = tr[x].laz;
	tr[x].laz = -1;
}

void update(int &x, int nl, int nr, int l, int r, int k)
{
	if(!x) x = ++ idx;
	if(nl <= l && r <= nr)
	{
		tr[x].val = (r - l + 1) * k;
		tr[x].laz = k;
		return;
	}
	pushdown(x, l, r);
	int mid = l + r >> 1;
	if(nl <= mid) update(tr[x].l, nl, nr, l, mid, k);
	if(nr > mid) update(tr[x].r, nl, nr, mid + 1, r, k);
	pushup(x);
}

int main()              //主函数
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> q;
	update(rt, 1, n, 1, n, 1);
	while(q --)
	{
		int l, r, k;
		cin >> l >> r >> k;
		if(k == 1) update(rt, l, r, 1, n, 0);
		else update(rt, l, r, 1, n, 1);
		cout << tr[1].val << '\n';
	}
    return 0;
}

标签:val,int,题解,线段,tr,mid,CF915E,laz
From: https://www.cnblogs.com/Svemit/p/17208062.html

相关文章

  • P2782 友好城市题解
    题目传送门题意:给定一些上下的线段,求出最多不相交的线段数量。一开始看错题了,以为是给定一堆线段,求出线段最大不交数量,然后就写了一个树状数组优化\(dp\)结果样例都不过,......
  • CF1785D Range = √Sum 题解
    题目传送门(第一次CF场切绿欸)题意考虑将这段序列的平均数设为\(4n\),那么总和就会是\(4n^2\),这时候就需要让最值差等于\(2n\),直接让他等于\(3n\)和\(5n\)就可......
  • 【题解】CF1801G A task for substrings
    考虑拆开贡献,前缀贡献痕容易算。而跨越\([l-1,l]\)的贡献,考虑在正串ACAM找到\([1,l-1]\),反串ACAM找到\([l,r]\),那么要做的就是在两串的fail链祖先上,找到能凑成完......
  • 2020 年百度之星·程序设计大赛 · 官方题解汇总
    1、测试赛2、初赛一留个备份,方便以后找3、初赛二4、初赛三5、复赛......
  • P1149 [NOIP2008 提高组] 火柴棒等式 题解
    [NOIP2008提高组]火柴棒等式题目描述给你\(n\)根火柴棍,你可以拼出多少个形如\(A+B=C\)的等式?等式中的\(A\)、\(B\)、\(C\)是用火柴棍拼出的整数(若该数非零,则最高......
  • 题解 ABC293D【Tying Rope】
    颜色是不好处理的,我们不妨不区分绳子的两个端点,将每条绳子作为一个节点,每条边直接将两个节点连接起来。每个绳子的端点本质上是保证了每个点的度数不超过\(2\),也就是说图......
  • 题解 ABC293E【Geometric Progression】
    由于模数不一定是大质数,我们不能直接套等比数列求和公式。换一种思路,数列\(\langle1,A,A^2,\cdots,A^{X-1}\rangle\)可以看做线性递推,因此设计矩阵:\[\boldsymbolT=\b......
  • 题解 ABC293F【Zero or One】
    我们可以暴力检查进制数不超过\(B\)的是否符合要求;然后对于进制数大于\(B\)的,位数不超过\(\log_BN\),可以暴力枚举每一位的值然后二分进制数检查。代码中\(B=10^3\)......
  • 题解 ABC293G【Triple Index】
    莫队板子。类似于小B的询问,在移动指针过程中,维护每个数出现次数\(cnt_i\),同时维护\(\sum\binom{cnt_i}{3}\)即可。取序列分块块长\(B=\frac{n}{\sqrt{m}}\),有最优......
  • [ABC293E] Geometric Progression 题解
    [ABC293E]GeometricProgression题解神中神数论题目描述给定整数\(A,X,M\),求\[\sum_{i=0}^{X-1}A^i\bmodM\]\(1\leA,M\le10^9\)\(1\leX\le10^......