【BZOJ2333】棘手的操作(左偏树,STL)
【BZOJ2333】棘手的操作(左偏树,STL)
题面
题解
正如这题的题号
我只能\(2333\)
神TM棘手的题目。。。
前面的单点/联通块操作
很显然是一个左偏树+标记
(确实很显然,只是写死人。。。)
然后对于全局的最大值而言
搞一个\(multi\)来水
看起来真的简单。。
写起来真的想死。。。
记住:要特判一下已经联通的块就不要再去\(Merge\)了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 300010
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n;
multiset<int> S;
struct Node
{
int ls,rs,ff;
int v,dis;
int lz;
}t[MAX];
int Lazy,root;
int getf(int x){while(t[x].ff)x=t[x].ff;return x;}
void putlazy(int x,int w)
{
t[x].v+=w;
t[x].lz+=w;
}
void pushdown(int x)
{
if(!t[x].lz)return;
if(t[x].ls)putlazy(t[x].ls,t[x].lz);
if(t[x].rs)putlazy(t[x].rs,t[x].lz);
t[x].lz=0;
}
int Merge(int r1,int r2)
{
if(!r1||!r2)return r1+r2;
pushdown(r1);pushdown(r2);
if(t[r1].v<t[r2].v)swap(r1,r2);
t[r1].rs=Merge(t[r1].rs,r2);
t[t[r1].rs].ff=r1;
if(t[t[r1].ls].dis<t[t[r1].rs].dis)swap(t[r1].ls,t[r1].rs);
t[r1].dis=t[t[r1].rs].dis+1;
return r1;
}
void Update(int x)
{
if(!x)return;
if(t[t[x].ls].dis<t[t[x].rs].dis)swap(t[x].ls,t[x].rs);
t[x].dis=t[t[x].rs].dis+1;
Update(t[x].ff);
}
void Alldown(int x)
{
if(t[x].ff)Alldown(t[x].ff);
pushdown(x);
}
void Del(int x)
{
Alldown(x);
t[t[x].ls].ff=t[t[x].rs].ff=0;
if(t[t[x].ff].rs==x)t[t[x].ff].rs=0;
else t[t[x].ff].ls=0;
int rtt=getf(t[x].ff);
Merge(rtt,Merge(t[x].ls,t[x].rs));
Update(t[x].ff);
t[x].ff=t[x].ls=t[x].rs=0;
}
void Plus(int x,int w)//单点修改
{
int rtt=getf(x);
if(!t[x].ff)
{
S.erase(S.find(t[x].v));
t[t[x].ls].ff=t[t[x].rs].ff=0;
pushdown(x),rtt=Merge(t[x].ls,t[x].rs);
t[x].ff=t[x].ls=t[x].rs=0;
}
else Del(x),S.erase(S.find(t[rtt].v));
t[x].v+=w;
int gg=Merge(x,rtt);
S.insert(t[gg].v);
}
void AllPlus(int x,int w)
{
x=getf(x);
S.erase(S.find(t[x].v));
putlazy(x,w);
S.insert(t[x].v);
}
int main()
{
n=read();
for(int i=1;i<=n;++i)t[i].v=read(),S.insert(t[i].v);
int Q=read();
char ch[5];
while(Q--)
{
scanf("%s",ch);
if(ch[0]=='A')
{
if(ch[1]=='1')
{
int x=read(),v=read();
Plus(x,v);
}
else if(ch[1]=='2')
{
int x=read(),v=read();
AllPlus(x,v);
}
else Lazy+=read();
}
else if(ch[0]=='F')
{
if(ch[1]=='1')
{
int x=read();
Alldown(x);
printf("%d\n",t[x].v+Lazy);
}
else if(ch[1]=='2')
{
int x=read();
x=getf(x);
printf("%d\n",t[x].v+Lazy);
}
else printf("%d\n",*--S.end()+Lazy);
}
else
{
int x=read(),y=read();
x=getf(x),y=getf(y);
if(x==y)continue;
int kk=Merge(x,y);
S.erase(S.find(kk==x?t[y].v:t[x].v));
}
}
return 0;
}
【BZOJ2333】棘手的操作(左偏树,STL)的更多相关文章
- 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...
- 洛谷.3273.[SCOI2011]棘手的操作(左偏树)
题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数 ...
- 左偏树 / 非旋转treap学习笔记
背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- P3378 【模板】堆 (内含左偏树实现)
P3378 [模板]堆 题解 其实就是一个小根堆啦,STL就可以解决,但是拥有闲情雅致的我学习了Jelly_Goat的左偏树,增加了代码长度,妙啊 Solution 1 STL STL 里面prior ...
- 洛谷P3377 【模板】左偏树(可并堆) 题解
作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- 左偏树(Leftist Heap/Tree)简介及代码
左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...
随机推荐
- 11个phpstorm 快捷键介绍
11个phpstorm 快捷键介绍 http://phpstorm.tips/tips/11-toggling-case
- Navicat的使用
Navicat的使用 navicat作为一种数据库的操作工具,在工作中使用的频率很高.相比phpMyAdmin而言,无论是从界面操作的易用性上,还是外观上,抑或是IP的配置上都有着很大的突出优势.ph ...
- nginx 浏览php的时候会变成下载
php的时候会变成下载:这是因为nginx没有设置好碰到php文件时,要传递到后方的php解释器.看看你的nginx.conf配置,里面有没有这样的设置:location ~ .*\.php$ {fa ...
- 关于DOM与BOM的总结
1.什么是BOM,什么是DOM(基本概念) BOM: Browers Object MOdel 浏览器对象模型 DOM: Document Object MOdel ...
- 【转】磁盘I/O那些事
背景 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时 ...
- Java多线程推荐使用的停止方法和暂停方法
判断线程结束和让线程结束 package cn.lonecloud.Thread.study; /** * 用于循环1000次的线程 * @Title: Run1000Thread.java * @P ...
- aforge 学习-基本图像处理要用的类库
1.图像灰度化:Grayscale.CommonAlgorithms.BT709(3种) FiltersSequence =new FiltersSequence(数组处理函数): 2.二值化(阈值 ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- TensorFlow与主流深度学习框架对比
引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平台上横扫中日韩围棋高手,取得60连胜,未尝败绩.AlphaGo背后神秘的推动力就是TensorFlow--Google于2015年 ...
- hi3531的时钟系统
时钟管理模块对芯片时钟输入.时钟生成和控制进行统一的管理,包括: 时钟管理模块有以下两部分输入: