牛客-Forsaken的数列(Treap)
题目传送门
sol:第一次看题还真信了是用线段树来做,但是没什么想法,看了题解发现是我不会的Treap,然后花了几天时间学习了一下并补掉题目
- 无旋Treap
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + ;
struct Treap {
int ls, rs;
int rand, size;
LL sum, val, lazy;
} node[MAXN];
int root, tot;
int add_node(int v) {
int i = ++tot;
node[i].ls = node[i].rs = ;
node[i].rand = rand();
node[i].sum = node[i].val = v;
node[i].lazy = ;
node[i].size = ;
return i;
}
void push_down(int rt) {
int ls = node[rt].ls;
int rs = node[rt].rs;
if (ls != ) {
node[ls].lazy += node[rt].lazy;
node[ls].val += node[rt].lazy;
node[ls].sum += node[ls].size * node[rt].lazy;
}
if (rs != ) {
node[rs].lazy += node[rt].lazy;
node[rs].val += node[rt].lazy;
node[rs].sum += node[rs].size * node[rt].lazy;
}
node[rt].lazy = ;
}
void push_up(int rt) {
int ls = node[rt].ls;
int rs = node[rt].rs;
node[rt].size = node[ls].size + node[rs].size + ;
node[rt].sum = node[ls].sum + node[rs].sum + node[rt].val;
}
void split(int rt, int& a, int& b, int s) {
if (rt == ) {
a = b = ;
return;
}
push_down(rt);
int size = node[node[rt].ls].size;
if (size < s) {
a = rt;
split(node[rt].rs, node[a].rs, b, s - size - );
} else {
b = rt;
split(node[rt].ls, a, node[b].ls, s);
}
push_up(rt);
}
void merge(int& rt, int a, int b) {
if (a == || b == ) {
rt = a + b;
return;
}
push_down(a);
push_down(b);
if (node[a].rand < node[b].rand) {
rt = a;
merge(node[rt].rs, node[a].rs, b);
} else {
rt = b;
merge(node[rt].ls, a, node[b].ls);
}
push_up(rt);
}
void insert(int p, int v) {
int x = , y = ;
split(root, x, y, p - );
merge(root, x, add_node(v));
merge(root, root, y);
}
void add(int l, int r, int v) {
int x = , y = , z = ;
split(root, root, z, r);
split(root, x, y, l - );
node[y].lazy += v;
node[y].val += v;
node[y].sum += node[y].size * v;
merge(root, x, y);
merge(root, root, z);
}
LL query(int l, int r) {
int x = , y = , z = ;
split(root, root, z, r);
split(root, x, y, l - );
LL sum = node[y].sum;
merge(root, x, y);
merge(root, root, z);
return sum;
}
int main() {
int n, q;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
int v; scanf("%d", &v);
merge(root, root, add_node(v));
}
scanf("%d", &q);
for (int i = ; i <= q; i++) {
int opt; scanf("%d", &opt);
if (opt == ) {
int pos; scanf("%d", &pos);
insert(pos, );
} else if (opt == ) {
int l, r, v;
scanf("%d%d%d", &l, &r, &v);
add(l, r, v);
} else {
int l, r;
scanf("%d%d", &l, &r);
printf("%lld\n", query(l, r));
}
}
return ;
}在前置知识都掌握的情况下Treap还是挺好懂的,而且之前感觉lazy标记挺乱的,看了这题之后感觉理清了
牛客-Forsaken的数列(Treap)的更多相关文章
- 牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)
https://ac.nowcoder.com/acm/contest/907/C 链接:https://ac.nowcoder.com/acm/contest/907/C来源:牛客网 题目描述 Ra ...
- C数列下标 牛客OI赛制测试赛2
链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi 表示 数列A中 Ai 右边第一个比 Ai 大的 ...
- 牛客小白月赛18 Forsaken给学生分组
牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 Forsaken有 ...
- 牛客小白月赛18 Forsaken喜欢数论
牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...
- 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解
题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...
- 斐波那契数列 牛客网 剑指Offer
斐波那契数列 牛客网 剑指Offer 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 class Solution: ...
- 最大连续数列和 牛客网 程序员面试金典 C++ Python
最大连续数列和 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有正有负的整数数组,请找出总和最大的连续数列. 给定一个int数组A和数组大小n,请返回最大的连续数列的和.保证n的大小 ...
- 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...
- 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契
牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...
随机推荐
- h5-动画基本介绍
1.介绍 *{ ; ; } div{ width: 200px; height: 200px; background-color: #5aff61; /*添加动画效果*/ /*1.animation- ...
- 【收藏】免费开源好看的bootstrap后台模板
1.ace admin github:https://github.com/bopoda/acedemo:http://ace.jeka.by/ 2.CoreUI jQuery.Angular.Rea ...
- CTF - bugku-分析
1.flag被盗 下载链接是.pcang文件 用wireshark打开 像这种流量分析题目,就要用Wireshark自带的搜索功能找尝试查找一些关键词(比如key.flag.shell.pass等) ...
- Mybatis实现if trim(四)
1. 准备 请先完成Mybatis实现增删改查(二)和Mybatis实现条件查询(三)的基本内容 2. 关于多条件查询的疑问 在Mybatis实现条件查询(三)中我们实现了多条件(商品编码.商品名称. ...
- Linux&Win双系统下时间显示不正常的问题
于近期开始研究Linux,目前用的是ubuntu.本想着用Linux搞事情,没想到却被Linux搞了. 我安装的是双系统,Linux&windows的组合.相信刚开始用双系统的小伙伴们一定会碰 ...
- html分页自适应居中;css设置分页自适应居中
制作网页列表的分页必不可少,显示的列表条数也不一样,让我们一起来看看如何让分页标签根据给定的分页自动居中呢. 对<ul>标签设置样式为:{ display: table margin:40 ...
- day65-CSS选择器和样式优先级
1. CSS CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). 2.CSS语法 每个 ...
- Maven--Eclipse maven相关配置
选择自己安装的 Maven 版本: 更改配置文件路径,这里选择自己安装的 Maven 下的配置文件,方便配置及统一控制:
- Django2.0——路由配置
URL配置就像是Django所支撑网站的目录,它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.URL需要在urls.py进行配置,与其对应的视图函数写在views.py文件中.ur ...
- 描述符(\_\_get\_\_和\_\_set\_\_和\_\_delete\_\_)
描述符(__get__和__set__和__delete__) 一.描述符 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个, ...