[模版]平衡树splay2
题目描述
输入
输出
若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解
样例输入
样例输出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N=,INF=;
struct node
{
node *child[],*fa;
int x,mark,size,val;long long sum;
}a[N];
node *pos=a,*root,*newone;
void check(node *r);
void updata(node *&r)
{
if(r){
r->sum=(r->child[]?r->child[]->sum:)+(r->child[]?r->child[]->sum:)+r->val;
r->size=(r->child[]?r->child[]->size:)+(r->child[]?r->child[]->size:)+;
}
}
void pushdown(node *&r)
{
if(!r || !r->mark)return ;
if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
updata(r);
r->mark=;
}
void rotate(node *&r,bool t)//0left 1right
{
node *y=r->fa;
pushdown(y);
pushdown(r);
y->child[!t]=r->child[t];
if(r->child[t])r->child[t]->fa=y;
if(y->fa)y->fa->child[y->fa->child[]==y]=r;
r->fa=y->fa;
r->child[t]=y;
y->fa=r;
updata(r);
updata(y);
updata(r->fa);
}
void splay(node *r,node *g)
{
while(r->fa!=g)
{
if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
else
{
node *y=r->fa;
bool t=y->fa->child[]==y;
if(y->child[t]==r)rotate(r,!t);
else rotate(y,t);
rotate(r,t);
}
}
if(g==NULL)root=r;
}
void newnode(node *&r,int key,int val,node *fa)
{
r=pos++;
r->fa=fa;
r->child[]=r->child[]=NULL;
r->x=key;r->val=val;r->mark=;r->size=;r->sum=val;
}
void insert(node *&r,int key,int val,node *fa)
{
if(r==NULL){
newnode(r,key,val,fa);
splay(r,NULL);
return ;
}
else {
pushdown(r);
insert(r->child[key>r->x],key,val,r);
}
}
node *pre,*nxt;
void getpre(node *r,int key)
{
if(r==NULL)return ;
if(r->x>=key)getpre(r->child[],key);
else pre=r,getpre(r->child[],key);
}
void getnext(node *r,int key)
{
if(r==NULL)return ;
if(r->x<=key)getnext(r->child[],key);
else nxt=r,getnext(r->child[],key);
}
void work(int l,int r)
{
getpre(root,l);getnext(root,r);
splay(pre,NULL);splay(nxt,pre);
updata(root->child[]);updata(root);
}
void Delet(int l,int r)
{
work(l,r);
root->child[]->child[]=NULL;
updata(root->child[]);updata(root);
}
void add(int l,int r,int to)
{
work(l,r);
root->child[]->child[]->mark+=to;
root->child[]->child[]->sum+=(ll)to*root->child[]->child[]->size;
root->child[]->child[]->val+=to;
updata(root->child[]);updata(root);
}
long long ask(int l,int r)
{
work(l,r);
node *y=root->child[]->child[];
return y==NULL?:y->sum;
}
void haha()
{
insert(root,-INF,,NULL);
insert(root,INF,,NULL);
}
int main()
{
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
haha();
int n;
char ch;int x,y,z;
scanf("%d",&n);
while(n--)
{
scanf("\n%c%d%d",&ch,&x,&y);
if(ch=='I')insert(root,x,y,NULL);
if(ch=='D')Delet(x,y);
if(ch=='M'){
scanf("%d",&z);
add(x,y,z);
}
if(ch=='Q')printf("%lld\n",ask(x,y));
}
return ;
}
[模版]平衡树splay2的更多相关文章
- hihocoder#1333 : 平衡树·Splay2 (区间操作)
题面: #1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊! ...
- Hihocoder #1333 : 平衡树·Splay2
1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙 ...
- hihocoder #1333 : 平衡树·Splay2
描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙管理一下团队的人员,但是感觉好难啊. 小Hi:说来听听? 小Ho:事情是这样的.我们有一个运动同好会 ...
- 【hihocoder 1333】平衡树·Splay2
[题目链接]:http://hihocoder.com/problemset/problem/1333 [题意] [题解] 伸展树; 要求提供操作: 1.插入一个元素,两个权值,id作为查找的比较权值 ...
- Hihocoder 1333 (splay)
Problem 平衡树 splay2 题目大意 维护一个序列,支持四种操作: 操作1:添加一个数,编号为x,权值为y. 操作2:删除编号在区间[x,y]内的数. 操作3:将编号在区间[x,y]内的数的 ...
- tyvj 1729 文艺平衡树
文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...
- 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1347 Solved: 724[Submit][Stat ...
- BZOJ3224普通平衡树【Splay】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11751 Solved: 5013 Descriptio ...
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...
随机推荐
- 冲刺NO.7
Alpha冲刺第七天 站立式会议 项目进展 前期数据库设计所遗留的问题在今天得到了部分的解决,对物资管理所需要的数据内容进行了细化,但并未开始编写物资相关模块,主要精力还是放在项目的核心功能(信用管理 ...
- Scrum 冲刺 第四日
目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 小组会议 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调 ...
- css变化代码
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- ubuntu启动报/root/.profile mesg:ttyname failed错误的解决办法
修改/root/.profile文件,如下命令 sudo gedit /root/profile 将文中的最后一行mesg n修改成tty -s && mesg n
- Docker学习笔记 - Docker容器与外部网络的连接
学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...
- gradle入门(1-6)将Java项目从maven迁移到gradle
gradle项目与maven项目相互转化(转) 转自: http://www.cnblogs.com/yjmyzz/p/gradle-to-maven.html 一.maven项目->gradl ...
- PHP基础(2)
测试模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- django的模型类管理器-----------数据库操作的封装
模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...
- 谈谈自己的理解:python中闭包,闭包的实质
闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内 ...
- 记录java/javascript让浮点数显示两位小数的方法
参考:http://www.jb51.net/article/46010.htm 另,如果只是要在页面层展示的时候,显示为两位小数,也可以直接改前端js代码. item.turnoverRate = ...