洛谷 P4200 千山鸟飞绝&&平衡树

题目传送门
题目十分阴间……
是一道练习平衡树的好题。
我们可以看到题目描述得天花乱坠,其实只需要对于每只鸟所在的坐标维护一颗splay就好了。
注意是对每只鸟所在的坐标,不是每个坐标。
我们需要维护的信息是最大团结值和 sizsizsiz 和最大威武值和 valvalval。
为此需要维护两个懒标记,一个记录 sizsizsiz,一个记录 valvalval。
然后在 splaysplaysplay 的过程中下传标记维护即可。
数据范围过大,所以需要用 mapmapmap 来存坐标。
还有一处小细节,就是 rotaterotaterotate 的时候最后更新 xxx,yyy节点信息的时候一定要先更新 yyy!!!
因为此时 yyy 已经变成 xxx 的儿子,显然要先更新儿子……
我之前一直先更新的 xxx……
可能是普通平衡树模板数据水了吧
代码:

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int maxn=3e5+5;
int siz[maxn],f[maxn],son[maxn][2],val[maxn],tot_size,root[maxn],a[maxn];
int laz1[maxn],laz2[maxn],ans1[maxn],ans2[maxn],q[maxn],num,w[maxn];
map<pii,int>vis;
inline ll read()
{ll ret=0;char son=' ',c=getchar();while(!(c<='9'&&c>='0')) son=c,c=getchar();while(c<='9'&&c>='0') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();return son=='-'?-ret:ret;
}
int get(int x) {return x==son[f[x]][1];}
void clear(int x) {son[x][1]=son[x][0]=siz[x]=f[x]=val[x]=laz1[x]=laz2[x]=0;}
void update(int x)
{siz[x]=siz[son[x][1]]+siz[son[x][0]]+1;val[x]=max(max(val[son[x][1]],val[son[x][0]]),w[x]);
}
void rotate(int x)
{int y=f[x],z=f[y],type=get(x);son[y][type]=son[x][type^1];f[son[x][type^1]]=y;son[x][type^1]=y;f[y]=x,f[x]=z;if(z) son[z][y==son[z][1]]=x;update(y);update(x);
}
void pushdown(int x)
{int k1=laz1[x],k2=laz2[x];for(int i=0;i<=1;i++){if(son[x][i]){int j=son[x][i];ans1[j]=max(ans1[j],k1);ans2[j]=max(ans2[j],k2);laz1[j]=max(laz1[j],k1);laz2[j]=max(laz2[j],k2);}}laz1[x]=laz2[x]=0;
}
void splay(int x,int &rt)
{int top=0;for(int fa=x;fa;fa=f[fa]) q[++top]=fa;while(top) pushdown(q[top--]);for(int fa;fa=f[x];rotate(x)) if(f[fa]) rotate(get(fa)==get(x)?fa:x);rt=x;
}
int find_pre(int p)
{int now=son[root[p]][0];while(son[now][1]) now=son[now][1];return now;
}
void del(int p,int x)
{splay(x,root[p]);int now=root[p];if(!son[now][0]&&!son[now][1]){clear(now);root[p]=0;return;}for(int i=0;i<=1;i++){if(!son[now][i]){root[p]=son[now][i^1];f[root[p]]=0;clear(now);return;}}x=find_pre(p);splay(x,root[p]);f[son[now][1]]=x;son[x][1]=son[now][1];clear(now);update(root[p]);
}
void insert(int &p,int x,int fa)
{if(!p){p=x,f[p]=fa,val[p]=w[p],siz[p]=1;return;}pushdown(p);if(!son[p][0]) insert(son[p][0],x,p);else insert(son[p][1],x,p);
}
int main()
{int n=read();for(int i=1;i<=n;i++){w[i]=read();int x=read(),y=read();if(!vis.count(mp(x,y))) vis[mp(x,y)]=++num;int k=vis[mp(x,y)];a[i]=k;ans1[i]=max(ans1[i],val[root[k]]);ans2[i]=max(ans2[i],siz[root[k]]);insert(root[k],i,0);splay(i,root[k]);laz1[root[k]]=max(laz1[root[k]],w[i]);laz2[root[k]]=max(laz2[root[k]],siz[root[k]]-1);}int t=read();while(t--){int i=read(),x=read(),y=read();if(!vis.count(mp(x,y))) vis[mp(x,y)]=++num;int k=vis[mp(x,y)],pre=a[i];a[i]=k;del(pre,i);ans1[i]=max(ans1[i],val[root[k]]);ans2[i]=max(ans2[i],siz[root[k]]);insert(root[k],i,0);splay(i,root[k]);laz1[root[k]]=max(laz1[root[k]],w[i]);laz2[root[k]]=max(laz2[root[k]],siz[root[k]]-1);}for(int i=1;i<=n;i++){splay(i,root[a[i]]);printf("%lld\n",1ll*ans1[i]*ans2[i]);}return 0;
}

洛谷 P4200 千山鸟飞绝平衡树相关推荐

  1. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  2. 洛谷 P3391 文艺平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...

  3. 浅尝无旋Treap (基于洛谷P3391 文艺平衡树)

    说是浅尝吧,确实也挺浅的,完全是基于下面这道题写的↓ 洛谷P3391 自己去看题,我是懒得粘了... 分析 其实也没有什么好分析的,这就是一道Splay树的模板题,解决一般的Treap不能解决的区间维 ...

  4. 洛谷P3391文艺平衡树(Splay)

    题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...

  5. 洛谷P3369 普通平衡树

    刚学平衡树,分别用了Splay和fhq-treap交了一遍. 这是Splay的板子,貌似比较短? Splay #include <iostream> #include <cstdio ...

  6. [洛谷P3391]文艺平衡树

    题目 传送门 to luogu 思路 题外话:一开始用Splay\text{Splay}Splay写了一发,结果-- 然后就换成了Treap\text{Treap}Treap.嗯,无旋Treap\te ...

  7. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  8. 洛谷 P3835: 【模板】可持久化平衡树

    题目传送门:洛谷P3835. 题意简述: 题面说的很清楚了. 题解: 考虑建立一棵每个节点都表示一个版本的树. 以初始版本 \(0\) 为根.对于第 \(i\) 个操作,从 \(v_i\) 向 \(i ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  10. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...

最新文章

  1. Springboot项目中的favicon
  2. Java中如何读写cookie (二)
  3. JZOJ 3822. 【NOIP2014模拟9.9】逆光
  4. mongodb 查多个不等于_高可用架构之商城的mongodb设计分析
  5. .net开发人员应该知道(一)
  6. new / delete与malloc / free的异同及实现原理
  7. datasnap 2011连接池,数据集对象池
  8. 研磨设计模式之 工厂方法模式-3
  9. 简明python教程 答案1
  10. 我的世界java版海岛种子_我的世界海岛种子大全(附:大型海岛村庄种子)
  11. JS/JQuery如何判断文本中是否有繁体字
  12. Head First 系列图书资源-PDF网盘下载(更新中)
  13. java 缓存的简单实现
  14. 一个语法分析器的实现
  15. PyTorch中的squeeze()和unsqueeze()详解与应用案例
  16. 【电商】电商供应链产品介绍
  17. 内存输出流ByteArrayOutputStream
  18. 虚电路和数据报的区别以及应用
  19. evpp mingw64编译过程
  20. Linux_15_软件安装-RPM/YUM

热门文章

  1. 编译MKL50.1 (for 一加手机)
  2. windows server 2012 NIC组合---概念
  3. PCB需要清洗的技巧
  4. 浅谈公安大数据的建设
  5. winsxs目录清理工具
  6. project之任务计划(任务之间的依赖关系)
  7. sersync+rsync的热备份研究(热备+断点续传)
  8. 音视频数据处理入门:AAC音频码流解析
  9. 京东面试题咖啡杯问题(贪心算法、递归综合运用)
  10. 数字内容产业的产业链结构