首页 > 其他分享 >线段树

线段树

时间:2024-11-25 23:43:52浏览次数:5  
标签:ad rs int 线段 mid bitset 区间

P5670

prob:

1.区间加
2.区间异或和后 m 位 (\(m \le 10\))
3.n 1e5

sol:

用 bitset 维护线段树区间。
具体的,开 1024 位 bitset 表示每种数对异或贡献为 0/1,有区间可加性。
时间复杂度 \(O(\frac{n \log n 2^m}{w})\),但是这题半秒,很卡常,需要优化。。(感觉甚至不如暴力/lh)
发现区间较小时 bitset 算确实不如暴力优,令长度小于阈值的区间暴力算即可。

注意:
1.暴力算的时候要把当前节点的 tag 加上。
2.不要习惯性的把循环里所有东西都写成 i !!!(modify 里那个 p)

namespace sgt {
	#define ls(p) p<<1
	#define rs(p) p<<1|1
	const int M = 1<<10;
	const int B = 1<<5; // bf range
	bitset <M> b[N<<2];
	int ad[N<<2];
	void pushup(int p) {
		b[p] = b[ls(p)]^b[rs(p)];
	}
	void upd(int p, int k) {
		k &= M-1;
		b[p] = b[p]<<k | b[p]>>M-k;
		ad[p] += k;
	}
	void pushdown(int p) {
		if(!ad[p]) return ;
		upd(ls(p), ad[p]), upd(rs(p), ad[p]);
		ad[p] = 0;
	}
	void build(int p, int l, int r) {
		if(r-l+1 <= B) {
			rep(i, l, r) b[p].flip(a[i]);
			return ;
		}
		int mid = l+r>>1;
		build(ls(p), l, mid), build(rs(p), mid+1, r);
		pushup(p);
	}
	void modify(int p, int l, int r, int x, int y, int k) {
		if(r-l+1 <= B) {
			int lb = max(l, x), rb = min(r, y);
			rep(i, lb, rb) b[p].flip(a[i]+ad[p] & M-1);
			rep(i, lb, rb) a[i] += k;
			rep(i, lb, rb) b[p].flip(a[i]+ad[p] & M-1);
			return ;
		}
		if(l >= x && r <= y) return upd(p, k);
		pushdown(p);
		int mid = l+r>>1;
		if(x <= mid) modify(ls(p), l, mid, x, y, k);
		if(y > mid) modify(rs(p), mid+1, r, x, y, k);
		pushup(p);
	}
	bitset <M> ask(int p, int l, int r, int x, int y) {
		bitset <M> s;
		if(r-l+1 <= B) {
			int lb = max(l, x), rb = min(r, y);
			rep(i, lb, rb) s.flip(a[i]+ad[p] & M-1);
			return s;
		}
		if(l >= x && r <= y) return b[p];
		pushdown(p);
		int mid = l+r>>1;
		if(x <= mid) s ^= ask(ls(p), l, mid, x, y);
		if(y > mid) s ^= ask(rs(p), mid+1, r, x, y);
		return s;
	}
}

总结:bitset 太神秘!

ABC356F

唐题

标签:ad,rs,int,线段,mid,bitset,区间
From: https://www.cnblogs.com/lowbit/p/18569052

相关文章

  • 华为OD机试真题-最少量线段覆盖-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述给定坐标轴上的一组线......
  • 线段树上二分
    线段树上二分费劲学的,得单领出来说说。网上有没有多少详细文章,有例题。线段树的奇幻科技——线段树上二分-Mercury_City-博客园(cnblogs.com)这篇博客讲的好,但仍不详细。不是二分+线段树,是直接利用线段树去二分查找。从而把\(O(\log^2n)\)变为\(O(\logn)\)。基本原......
  • 李超线段树学习笔记
    P4097【模板】李超线段树/[HEOI2013]Segment前言李超线段树并不是一种新的线段树,而是对一类题维护最值的过程做了改进,使线段树仍然有不错的复杂度。引入简要题意实现两种操作:在区间\([x_0,y_0]\)上加入一条两端为\((x_0,y_0)\),\((x_1,y_1)\)的线段。查询下标\(k......
  • 郝玩的数据结构——线段树(待upd)
    线段树,是一种支持点修点查,去修区查的高级数据结构,单词操作时间复杂度为O(log2点数),非常的优秀拉张图来解释一下线段树:每个父节点的权值是两个子节点权值的和好的。首先建一棵线段树我们来采用递归建树:先从根节点DFS遍历,然后返回后使用push_up函数累加——这样就可以保证线段树......
  • 线段树分治略解&杂题解析
    可能做到好题之后会再更新吧。总叙线段树与离线询问结合技巧又被称为线段树分治。使用线段树分治维护的信息通常会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。以下是线段树分治的基本模板:change将信息按时间段覆盖在线......
  • 浅谈李超线段树
    众所周知,\(Li\Chao\Tree=LCT=Link\Cut\Tree\)。在我们的日常学习生活中,经常会遇到以下问题:维护一种数据结构,要求:添加一条线段求解\(x=k\)与所有线段交点中,\(y\)最大的一个。众所周知,线段会影响一个区间的答案。区间取\(max+\)单点最大值,想到线段树。但是该怎......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......
  • 线段树进阶应用学习笔记(一)(2024.7.19)(2024.8.22)
    线段树优化建图算法流程复杂度分析例题一#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=5e5,M=5e6+9;structEdge{ intv,w,nex;}e[M];inthead[M],ecnt;voidAddEdge(intu,intv,intw){ e[++ecnt]=Edge{v,w,hea......
  • [ABC371D] 1D Country 线段树解法
    其实这题还可以用值域线段树来做的。。。考虑到\([-1e9,1e9]\)的数据范围,则一般的线段树绝对会MLE,但同时我们注意到点的个数只有\(2e5\)个,考虑使用动态开点线段树。即对于每个村庄,看做一个点,所以我们的线段树无需模拟满二叉树。由于\(log_2(2e9)\approx30\),所以我们的线......
  • 线段树与离散化技巧 Mayor's posters——poj 2528
    问题描述:有一堵海报墙,从左到右一共有10000000个小块,墙上贴了许多海报,每张海报的高度与墙的高度相同,宽度不同,新帖的海报会将原有的海报覆盖,问当所有人把海报贴完是,墙上可以看到几张海报输入:第一行输入一个整数c表示测试数,每个测试第一行输入一个整数n(1<=N<=10000),代表张贴海报数......