Problem Analysis
题目大意: 给定一个序列,支持以下操作:
- 查询给定区间 [ l , r ] [l, r] [l,r]内 v a l val val的个数;
- 交换第 x x x和 x + 1 x + 1 x+1只兔子的颜色。
首先考虑建权值数组,也就是对于每个颜色维护一棵主席树,然后操作就是一个普通的单点查询,直接树上二分到叶节点即可(可以考虑离散化)。
对于交换 x x x和 x + 1 x + 1 x+1颜色的操作,不难证明对于主席树而言,受影响的的版本只有 r o o t [ x ] root[x] root[x],而对于 r o o t [ x + 1 ] root[x + 1] root[x+1],交换颜色后,权值数组并没有发生什么变化(交换后两个数仍然位于 [ 1 , x + 1 ] [1,x+1] [1,x+1]范围内,位置不影响权值数组)。
对于 r o o t [ x ] root[x] root[x]版本,我们只需要将 x x x的颜色权值 − 1 -1 −1,然后将 x + 1 x + 1 x+1的颜色权值 + 1 +1 +1即可。非常模板。
Attention:千万千万不要用cin和cout,快读换成scanf也能过,但是cin和cout的IO会T的飞起。。。
Accepted Code
#include
using namespace std;
const int N = 3e5 + 10;
int tot = 0, root[N], sum[N
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?