题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线性基. 用线段树去维护区间合并 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5; struct node { ],lazy,st; void init() { memset(bas,,sizeof(bas));…
人生第一道Ynoi,开心 Description https://www.luogu.com.cn/problem/P5607 Solution 拿到这个题,看了一下,发现询问要求最大异或和,怎么办? 没办法,我只学过线性基,就顺着这个思路硬上吧. 我们开一颗线段树,里面的节点存线性基,那么空间复杂度是\(O(n \log v)\)的 先不管修改操作,那么我们容易分析得到单次查询的复杂度是\(O(\log n \log^2 v)\) 这个复杂度一看就是正解,接着想修改 区间\(\text{xor…
[Luogu3733][HAOI2017]八纵八横(线性基,线段树分治) 题面 洛谷 题解 看到求异或最大值显然就是线性基了,所以只需要把所有环给找出来丢进线性基里就行了. 然后线性基不资磁撤销?线段树分治,没了. #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<bitset> using namespace std; #define…
学到了线段树新姿势! 先离线读入,根据时间建一棵线段树,每个节点上开一个vector存这个区间内存在的数(使用map来记录每个数出现的一段时间),然后在线段树上dfs,到叶子节点就计算答案. 注意!!从父节点带下来的线性基数组一定要放在函数里传给子节点!全局变量就会多出好多东西!这个其实是常识吧然而我蠢... #include<iostream> #include<cstdio> #include<vector> #include<map> using na…
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂漫的生活,自然也无暇考虑什么拯救世界之类的重任. 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完毕之…
题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列. 当然,他还会不断修改其中的某一项. 为了不被他鄙视,你必须要快速并正确地回答完所有问题. 注意:只有一个数的数列也是等差数列. 输入输出格式 输入格式: 第一行包含两个正整数n,m(1<=n,m<=300000),分别表示序列的长度和操作的次数. 第二行包含n个整数,依次表示序列中的…
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace std; struct ben { int lmax,rmax,len,sum,lz; }tr[400005]; void bt(int x,int l,int r)//建树 { tr[x].lz=0;//标记清空 tr[x].sum=tr[x].len=tr[x].lmax=tr[x].rmax=r-l+1…
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $x$ ,或询问使用 $[l,r]$ 内瓶子能够凑出的最小体积. 输入 第一行包括两个数字:瓶子数n,事件数m. 第二行包含n个整数,表示每个瓶子的容量vi. 接下来m行,每行先有三个整数fi li ri. 若fi=1表示询问li到ri他最少能倒腾出的汽油量最少是多少? 若fi=2 再读入一个整数x.…
首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路径上所有点的S中都加入这条路径.树剖之后,相当于对log个区间中的点都加入log个区间.具体实现有树剖后线段树维护虚树.矩形扫描线.线段树+set存区间等多种方法,这里不再多说.两个log:先树剖,然后对每个点开一棵线段树存储它的S,由于题中没有修改,所以可以树上差分+线段树合并,这样可以将方法一中…
[BZOJ3307] 雨天的尾巴(树上差分+线段树合并) 题面 给出一棵N个点的树,M次操作在链上加上某一种类别的物品,完成所有操作后,要求询问每个点上最多物品的类型. N, M≤100000 分析 考虑树上差分.对于每条链(x,y),我们在x,y打一个+标记,lca(x,y)和lca(x,y)的父亲打一个-标记.然后在每个节点建立一棵权值线段树,下标v维护物品v的个数.如果有物品v,就把下标为v的位置+1,如果有-标记,就-1.线段树push_up的时候可以计算出最多物品的类型 然后从下往上线…