[bzoj2827]千山鸟飞绝【splay】
[题目描述]
2827: 千山鸟飞绝
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 815 Solved: 231
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1 1
3 1 2
4 4 4
2 0 1
2 2 3
5
1 1 2
2 4 4
2 4 3
3 0 1
5 0 1
Sample Output
4
6
8
8
HINT
Source
湖北省队互测
[题解]
每个位置开一个splay,加入时先更新原树答案(打tag),在更新这个点,最后再加入
/* --------------user Vanisherproblem bzoj-2827
----------------*/
# include <bits/stdc++.h>
# define N 400010
# define ll long long
using namespace std;
int read(){int tmp=0, fh=1; char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') fh=-1; ch=getchar();}while (ch>='0'&&ch<='9'){tmp=tmp*10+ch-'0'; ch=getchar();}return tmp*fh;
}
struct point{int x,y;}now;
struct node{int w,p;}p[N];
struct Tree{int pl,pr,tagi,tagj,fa;point num;
}T[N];
int ansi[N],ansj[N],rt[N],place,ti,size[N],n,m,at[N];
map <point, int> mp;
bool operator <(point x, point y){return x.x<y.x||x.x==y.x&&x.y<y.y;}
bool operator ==(point x, point y){return x.x==y.x&&x.y==y.y;}
void pushtag(int x){ansi[T[x].num.y]=max(ansi[T[x].num.y],T[x].tagi);ansj[T[x].num.y]=max(ansj[T[x].num.y],T[x].tagj);T[T[x].pl].tagi=max(T[T[x].pl].tagi,T[x].tagi);T[T[x].pl].tagj=max(T[T[x].pl].tagj,T[x].tagj);T[T[x].pr].tagi=max(T[T[x].pr].tagi,T[x].tagi);T[T[x].pr].tagj=max(T[T[x].pr].tagj,T[x].tagj);T[x].tagi=0; T[x].tagj=0;
}
void zig(int x){int y=T[x].fa;pushtag(y); pushtag(x);if (T[T[y].fa].pl==y) T[T[y].fa].pl=x; else T[T[y].fa].pr=x;T[x].fa=T[y].fa;T[y].pl=T[x].pr; T[T[x].pr].fa=y;T[x].pr=y; T[y].fa=x;
}
void zag(int x){int y=T[x].fa;pushtag(y); pushtag(x);if (T[T[y].fa].pl==y) T[T[y].fa].pl=x; else T[T[y].fa].pr=x;T[x].fa=T[y].fa;T[y].pr=T[x].pl; T[T[x].pl].fa=y;T[x].pl=y; T[y].fa=x;
}
void splay(int p, int x){int root=rt[p];if (x==root) return;while (T[x].fa!=root){int y=T[x].fa;if (T[y].fa==root)if (T[y].pl==x) zig(x); else zag(x);else if (T[T[y].fa].pl==y)if (T[y].pl==x) zig(y), zig(x);else zag(x), zig(x);else if (T[y].pl==x) zig(x), zag(x);else zag(y), zag(x); }if (T[root].pl==x) zig(x); else zag(x);rt[p]=x;
}
void extend(int p, point x){int now=++place;at[x.y]=now;T[now].num=x;size[p]++;if (size[p]==1){rt[p]=now;return;}T[rt[p]].tagi=max(T[rt[p]].tagi,size[p]-1); int i=rt[p],las=0; point mx;while (i!=0){mx=T[i].num;i=T[i].pr;}ansj[x.y]=max(ansj[x.y],mx.x);ansi[x.y]=max(ansi[x.y],size[p]-1);T[rt[p]].tagj=max(T[rt[p]].tagj,x.x);las=0, i=rt[p];while (i!=0){pushtag(i); las=i;if (T[i].num<x) i=T[i].pr; else i=T[i].pl;}if (T[las].num<T[now].num)T[las].pr=now; else T[las].pl=now;T[now].fa=las;splay(p,now);
}
void del(int p, point x){int i=rt[p];while (i!=0){pushtag(i); if (T[i].num==x) break;if (T[i].num<x) i=T[i].pr; else i=T[i].pl;}splay(p,i);int l=T[rt[p]].pl,r=T[rt[p]].pr;T[l].fa=0; T[r].fa=0;if (l==0&&r==0) rt[p]=0;else if (l==0) rt[p]=r;else if (r==0) rt[p]=l;else {rt[p]=l;int las=0;while (l!=0){pushtag(l); las=l;l=T[l].pr;}splay(p,las);T[rt[p]].pr=r;T[r].fa=rt[p];}size[p]--;
}
int main(){n=read();for (int i=1; i<=n; i++){p[i].w=read(), now.x=read(), now.y=read();if (mp.find(now)==mp.end()) mp[now]=++ti;p[i].p=mp[now];extend(p[i].p,(point){p[i].w,i});}m=read();for (int i=1; i<=m; i++){int j=read(); now.x=read(), now.y=read(); if (mp.find(now)==mp.end()) mp[now]=++ti;int nex=mp[now];del(p[j].p,(point){p[j].w,j});extend(nex,(point){p[j].w,j});p[j].p=nex;}for (int i=1; i<=n; i++){splay(p[i].p,at[i]);pushtag(rt[p[i].p]);printf("%lld\n",(ll)ansi[i]*ansj[i]);}return 0;
}
[bzoj2827]千山鸟飞绝【splay】相关推荐
- 2827: 千山鸟飞绝 splay打标记
Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. ...
- 二逼平衡树——树套树(线段树套Splay平衡树)
题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...
- 简析平衡树(三)——浅谈Splay
前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...
- AVL树、splay树(伸展树)和红黑树比较
AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...
- bzoj1251: 序列终结者 (splay)
splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出in ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- [BZOJ1503]郁闷的出纳员(Splay)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表
题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...
- splay + 线段树 ---- P3765总统选举 [带修改的动态区间众数 摩尔投票+n棵splay]
题目链接 题目大意: 解题思路: 1.摩尔投票法: 题意是找n个数内出现次数大于n/2的数 保证存在这个数用的方法叫做摩尔投票法 首先我们注意到这样一个现象: 在任何数组中,出现次数大于该数组长度一半 ...
- Splay ---- 区间翻转 区间最大值 区间加 P4146 序列终结者
题目链接 题目大意: 解题思路: 这是一道很入门的Splay的题目 但是第一次写有很多坑点 首先是maxmaxmax值的更新:就是因为这个点的最小值是会出现负数负数的,当你左右儿子有一个没有的话,那么 ...
最新文章
- C#初学——doWhile
- 服务信息块协议 SMB(Server Message Block protocol)
- FastDFS5.02安装说明
- LightOJ1298 One Theorem, One Year(DP + 欧拉函数性质)
- java try finally connectoin close_Java SocketChannel類代碼示例
- c# 网口相机可以通过_电脑可以跑安卓9.0了!完全免费
- 分支程序设计02 - 零基础入门学习C语言11
- php cannot bind port to socket,PHP基于socket实现客户端和服务端通讯功能
- Matlab代码生成任意边长等间距正六边形采样点
- django缓存优化(一)
- 19【推荐系统8】PNN模型——加强特征交叉能力
- java 子类型_Java – 基类和子类中的equals方法
- mysql将公历农历转换_SQL 日期转换(阳历转阴历)
- 树莓派4B 编译安装rtl8192eu usb网卡驱动
- PyG 中Message Passing机制详解
- 记录微信支付解密错误Tag mismatch
- 【Sensors】原始GNSS测量(6)
- 中国虚拟招聘工具行业深度调研与市场规模份额预测报告2022年
- tring_vector容器test
- Android 集成Crosswalk替换成X5WebView
热门文章
- 以“人民的名义”劝你快去读点书
- [论文阅读]PIXER: an automated particle-selection method based on segmentation using deep neural network
- 软文管家发布平台_企业软文如何做好
- 征服c指针_征服C指针.pdf
- 知识点 - 快速沃尔什变换
- 【Linux】自动执行Mysql常用命令脚本
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
- 2012服务器系统 3389,windows 2012r2如何修改默认的3389远程端口
- android禁用状态栏5.1,Android5.1禁止状态栏下拉(SystemUI StatusBar)
- 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...