po3580SuperMemo(splay)
操作不少,不过都是一些基本的操作,增删,旋转,逆转,询问最小。
注意一点:T<0时 让t=0;
旋转的时候,是顺时针旋转,数据范围在int内。
刚开始旋转转错方向了。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 200010
#define LL long long
#define INF 0xfffffff
#define key_value ch[ch[root][1]][0]
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
using namespace std;
int a[N];
struct splay_tree
{
int pre[N],size[N];
int ch[N][];
int root,tot;
int lz2[N];
LL s[N],lz1[N],key[N];
// void dfs(int x)
// {
// if(x)
// {
// dfs(ch[x][0]);
// printf("结点%2d:左儿子 %2d 右儿子 %2d 父结点 %2d size=%2d,key=%2d lz1 = %d lz2 = %d min = %d\n",
// x,ch[x][0],ch[x][1],pre[x],size[x],key[x],lz1[x],lz2[x],s[x]);
// dfs(ch[x][1]);
// }
// }
// void debug()
// {
// printf("root:%d\n",root);
// dfs(root);
// }
//以上用于debug*/
void newnode(int &x,int v,int fa)//新建一结点
{
x = ++tot;
ch[x][]=ch[x][] = ;
pre[x] = fa;
lz1[x] = lz2[x] = ;
size[x] = ;
s[x] = v;
key[x] = v;
}
void pushdown(int w)
{
int l = ch[w][],r = ch[w][];
if(lz1[w])
{
lz1[l] += lz1[w];
lz1[r] += lz1[w];
s[l]+=lz1[w];
s[r]+=lz1[w];
key[l]+=lz1[w];
key[r]+=lz1[w];
lz1[w] = ;
}
if(lz2[w])
{
lz2[l]^=lz2[w];
lz2[r]^=lz2[w];
swap(ch[w][],ch[w][]);
lz2[w] = ;
}
}
void pushup(int w)
{
size[w] = size[ch[w][]]+size[ch[w][]]+;
s[w] = key[w];
if(ch[w][])
s[w] = min(s[w],s[ch[w][]]);
if(ch[w][])
s[w] = min(s[w],s[ch[w][]]);
}
void rotate(int r,int kind)
{
int y = pre[r];
pushdown(y);
pushdown(r);
ch[y][!kind] = ch[r][kind];
pre[ch[r][kind]] = y;
if(pre[y])
{
ch[pre[y]][ch[pre[y]][]==y] = r;
}
pre[r] = pre[y];
ch[r][kind] = y;
pre[y] = r;
pushup(y);
pushup(r);
}
void splay(int r,int goal)
{
pushdown(r);
while(pre[r]!=goal)
{
if(pre[pre[r]]==goal)
{
rotate(r,ch[pre[r]][]==r);
}
else
{
int y = pre[r];
int kind = (ch[pre[y]][]==y);
if(ch[y][kind]==r)
{
rotate(r,!kind);
rotate(r,kind);
}
else
{
rotate(y,kind);
rotate(r,kind);
}
}
}
pushup(r);
if(goal==) root = r;
}
int get_k(int k)
{
int r = root;
pushdown(r);
while(size[ch[r][]]+!=k)
{
if(size[ch[r][]]>=k)
r = ch[r][];
else
{
k-=(size[ch[r][]]+);
r = ch[r][];
}
pushdown(r);
}
return r;
}
void add(int l,int r,int k)
{
splay(get_k(l),);
splay(get_k(r+),root);
lz1[key_value]+=k;
s[key_value]+=k;
key[key_value]+=k;
pushup(ch[root][]);
pushup(root);
}
LL query(int l,int r)
{
splay(get_k(l),);
splay(get_k(r+),root);
return s[key_value];
}
void reverse(int l,int r)
{
splay(get_k(l),);
splay(get_k(r+),root);
lz2[key_value]^=;
pushup(ch[root][]);
pushup(root);
}
void revolve(int l,int r,int k)
{
splay(get_k(r-k+),);
splay(get_k(r+),root);
int nod = key_value;
key_value = ;
pushup(ch[root][]);
pushup(root); splay(get_k(l),);
splay(get_k(l+),root);
key_value = nod;
pre[nod] = ch[root][];
pushup(ch[root][]);
pushup(root);
}
void insert(int k,int p)
{
splay(get_k(k),);
splay(get_k(k+),root);
newnode(key_value,p,ch[root][]);
pushup(ch[root][]);
pushup(root);
}
void updelete(int k)
{
splay(get_k(k),);
splay(get_k(k+),root);
key_value = ;
pushup(ch[root][]);
pushup(root);
}
void build(int &x,int l,int r,int fa)
{
int m = (l+r)>>;
if(l>r) return ;
newnode(x,a[m],fa);
build(ch[x][],l,m-,x);
build(ch[x][],m+,r,x);
pushup(x);
}
void init(int o)
{
int i;
for(i = ; i <= o ; i++)
scanf("%d",&a[i]);
size[] = ch[][] = ch[][] = key[] = lz1[] = lz2[] = s[] = ;
root = tot = ;
newnode(root,,);
newnode(ch[root][],,root);
build(ch[ch[root][]][],,o,ch[root][]);
size[root] = ;
pushup(ch[root][]);
pushup(root);
}
// void work()
// {
// for(int i = 1; i <= size[root] ;i++)
// cout<<key[get_k(i)]<<" ";
// puts("");
// }
} SP;
int main()
{
int n,q,k,x,y;
char sq[];
while(scanf("%d",&n)!=EOF)
{
SP.init(n);
scanf("%d",&q);
while(q--)
{
scanf("%s",sq);
if(sq[]=='A')
{
scanf("%d%d%d",&x,&y,&k);
SP.add(x,y,k);
}
else if(strcmp(sq,"REVERSE")==)
{
scanf("%d%d",&x,&y);
SP.reverse(x,y);
}
else if(strcmp(sq,"REVOLVE")==)
{
scanf("%d%d%d",&x,&y,&k);
if(k<=) continue;
k = k%(y-x+);
SP.revolve(x,y,k);
}
else if(sq[]=='I')
{
scanf("%d%d",&k,&x);
SP.insert(k+,x);
}
else if(sq[]=='D')
{
scanf("%d",&k);
SP.updelete(k);
}
else if(sq[]=='M')
{
scanf("%d%d",&x,&y);
printf("%d\n",SP.query(x,y));
}
//SP.work();
}
}
return ;
}
po3580SuperMemo(splay)的更多相关文章
- 伸展树(Splay树)的简要操作
伸展树(splay树),是二叉排序树的一种.[两个月之前写过,今天突然想写个博客...] 伸展树和一般的二叉排序树不同的是,在每次执行完插入.查询.删除等操作后,都会自动平衡这棵树.(说是自动,也就是 ...
- 【BZOJ3506】排序机械臂(Splay)
[BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...
- 【BZOJ1500】【NOI2005】维修数列(Splay)
[BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...
- 【CF809D】Hitchhiking in the Baltic States(Splay,动态规划)
[CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个 ...
- 【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)
[BZOJ1862][ZJOI2006]游戏排名系统 (Splay) 题面 BZOJ 洛谷 题解 双倍经验题
- 【BZOJ1056】[HAOI2008]排名系统(Splay)
[BZOJ1056][HAOI2008]排名系统(Splay) 题面 BZOJ 洛谷 题解 \(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压. ...
- 伸展树(Splay Tree)进阶 - 从原理到实现
目录 1 简介 2 基础操作 2.1 旋转 2.2 伸展操作 3 常规操作 3.1 插入操作 3.2 删除操作 3.3 查找操作 3.4 查找某数的排名.查找某排名的数 3.4.1 查找某数的排名 3 ...
- 【BZOJ1014】火星人(Splay,哈希)
[BZOJ1014]火星人(Splay,哈希) 题面 BZOJ 题解 要动态维护这个串,一脸的平衡树. 那么用\(Splay\)维护这个哈希值就好了. 每次计算答案的时候二分+Splay计算区间哈希值 ...
- 【BZOJ2329】括号修复(Splay)
[BZOJ2329]括号修复(Splay) 题面 BZOJ 洛谷 题解 本来想着用线段树来写 但是有一个区间翻转 所以不能用线段树了,就只能用平衡树 然后直接\(Splay\)就好了 注意一下几个标记 ...
随机推荐
- php filter 安全过滤函数
转自:http://www.blags.org/archives/741.html php 利用filter 扩展编写的参数处理静态类,欢迎使用.希望大家看得开心,用得放心. <?php /** ...
- 数据表示Numpy
1 基本 1.1 基本介绍 掌握表示, 清洗, 统计和展示数据的能力 Numpy, Matplotlib, Pandas, Projects 摘要: 有损的提取数据特征的过程 可以将一组数据, 摘要出 ...
- mysql 数据库修改用户名和密码
因为经常修改数据库密码,也找到了几种修改数据库密码的方式,在这里给大家介绍下供大家参考通过navicat 管理数据库客户端来修改数据库密码: 选择数据库 --- 点击导航条的用户 --- 编辑用户 ...
- 不能访问tomcat中的项目
tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能访问. 关闭eclipse里面的tomcat,在 ...
- 关于ubuntu 16.04 docker常用命令
1.sudo docker ps -a 查看当前docker实例的信息: CONTAINER ID IMAGE COMMAND ...
- GitHub的使用方法
版本控制系统 > Git 分布式 > Subversion 集中式 1. 安装git: # apt-get install git //root权限 $ sudo apt-get inst ...
- Windows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括基本输入输出机制介绍
Some Basic Background Story of The Win32 APIs Win32 API背景故事/背景知识 The Win32 application programming i ...
- docker --help 详解
[root@c1 _src]# dockerd --help Usage: dockerd [OPTIONS] A self-sufficient runtime for containers. Op ...
- StarUML中时序图
StarUML中时序图 在看时序图的例子的时候,发现有些的时序图上有小人的图标,可是一些UML工具却没有找到小人的图标,这让我很闹心,一直没解决,今天终于将该问题给解决了.解决这个问题来自于网上的一个 ...
- 怎样通过计算机ip地址访问sql server 2008数据库
在设置外网访问SQL2008数据库之前,首先必须保证局域网内访问SQL2008没有问题 .那么,我们先来看看局域网内访问SQL2008数据库需要哪些步骤和设置,才能做到在局域网内任何一台机器上输入 ...