【BZOJ2827】千山鸟飞绝 hash+堆+SBT
【BZOJ2827】千山鸟飞绝
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
题解:容易想到hash,将坐标相同的鸟都放到一起,用一个数据结构维护一下,这个数据结构需要维护以下操作:
插入,删除,统计个数;
统计权值最大值和次大值,以及其编号;
用最大值更新其它点的答案,用次大值更新最大值的答案。
可以用可删除堆维护最大值和次大值,其余的用SBT打标记维护。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=30010;
const ll P=999983;
int n,m,tot;
int s1[maxn],s2[maxn],v[maxn],rt[maxn*11],X[maxn],Y[maxn];
bool vis[maxn*11];
struct node
{int ch[2],siz,org,t1,t2;
}s[maxn];
struct pt
{int x,y,num;pt() {}pt(int a,int b,int c) {x=a,y=b,num=c;}
};
vector<pt> hs[999990];
struct Num
{int x;Num() {}Num(int a) {x=a;}bool operator < (const Num &b) const{return v[x]<v[b.x];}
};
struct heap
{priority_queue<Num> p1,p2;inline int top(){while(!p2.empty()&&p1.top().x==p2.top().x) p1.pop(),p2.pop();return (p1.empty())?0:p1.top().x;}inline int top2(){int x=top();if(p1.empty()) return 0;p1.pop();int y=top(); p1.push(Num(x));return y;}inline void erase(int x) {p2.push(Num(x));}inline void push(int x) {p1.push(Num(x));}
}p[maxn*11];
inline int point(int x,int y)
{ll val=((((ll(x)<<20)+y)^((ll(y)<<10)+x))%P+P)%P;int i;for(i=0;i<(int)hs[val].size();i++) if(hs[val][i].x==x&&hs[val][i].y==y) return hs[val][i].num;hs[val].push_back(pt(x,y,++tot));return tot;
}
inline void upd(int x,int t1,int t2)
{s1[s[x].org]=max(s1[s[x].org],t1),s2[s[x].org]=max(s2[s[x].org],t2);s[x].t1=max(s[x].t1,t1),s[x].t2=max(s[x].t2,t2);
}
inline void pushdown(int x)
{if(s[x].t1||s[x].t2){if(s[x].ch[0]) upd(s[x].ch[0],s[x].t1,s[x].t2);if(s[x].ch[1]) upd(s[x].ch[1],s[x].t1,s[x].t2);s[x].t1=s[x].t2=0;}
}
inline void pushup(int x)
{s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
}
inline void rotate(int &x,int d)
{int y=s[x].ch[d];pushdown(x),pushdown(y);s[x].ch[d]=s[y].ch[d^1],s[y].ch[d^1]=x;pushup(x),pushup(y);x=y;
}
inline void maintain(int &x,int d)
{if(s[s[s[x].ch[d]].ch[d]].siz>s[s[x].ch[d^1]].siz) rotate(x,d);else if(s[s[s[x].ch[d]].ch[d^1]].siz>s[s[x].ch[d^1]].siz) rotate(s[x].ch[d],d^1),rotate(x,d);else return ;maintain(s[x].ch[d],d),maintain(s[x].ch[d^1],d^1);maintain(x,d),maintain(x,d^1);
}
void insert(int &x,int y)
{if(!x){x=y,s[x].siz=1,s[x].ch[0]=s[x].ch[1]=s[x].t1=s[x].t2=0;return ;}pushdown(x);int d=(s[y].org>s[x].org);insert(s[x].ch[d],y),pushup(x);maintain(x,d);
}
int del(int &x,int y)
{pushdown(x),s[x].siz--;if(s[x].org==y){if(!s[x].ch[0]||!s[x].ch[1]){int u=x;x=s[x].ch[0]^s[x].ch[1];return u;}int u=s[x].ch[1];pushdown(u);while(s[u].ch[0]) u=s[u].ch[0],pushdown(u);s[x].org=s[u].org;return del(s[x].ch[1],s[u].org);}if(s[x].org>y) return del(s[x].ch[0],y);return del(s[x].ch[1],y);
}
void updata(int x,int t1,int t2)
{if(!x) return ;pushdown(x);if(s[x].org<=t1) upd(s[x].ch[0],v[t1],0);if(s[x].org>=t1) upd(s[x].ch[1],v[t1],0);if(s[x].org==t1) s1[s[x].org]=max(s1[s[x].org],v[t2]);else s1[s[x].org]=max(s1[s[x].org],v[t1]),updata(s[x].ch[t1>s[x].org],t1,t2);
}
inline int rd()
{int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
inline void add(int x,int y,int a,int b)
{int pos=point(a,b);s[y].org=x,insert(rt[pos],y);p[pos].push(x);upd(rt[pos],0,s[rt[pos]].siz-1);updata(rt[pos],p[pos].top(),p[pos].top2());
}
inline int rem(int x,int a,int b)
{int pos=point(a,b),y=del(rt[pos],x);p[pos].erase(x);return y;
}
void dfs(int x)
{if(!x) return ;pushdown(x);dfs(s[x].ch[0]),dfs(s[x].ch[1]);
}
int main()
{n=rd();int i,a,b;for(i=1;i<=n;i++){v[i]=rd(),X[i]=rd(),Y[i]=rd();add(i,i,X[i],Y[i]);}m=rd();for(i=1;i<=m;i++){a=rd(),b=rem(a,X[a],Y[a]);X[a]=rd(),Y[a]=rd(),add(a,b,X[a],Y[a]);}for(i=1;i<=n;i++){a=point(X[i],Y[i]);if(!vis[a]) vis[a]=1,dfs(rt[a]);}for(i=1;i<=n;i++) printf("%lld\n",(ll)s1[i]*s2[i]);return 0;
}//5 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
转载于:https://www.cnblogs.com/CQzhangyu/p/7812915.html
【BZOJ2827】千山鸟飞绝 hash+堆+SBT相关推荐
- 数据结构 单词查找 二分法-索引表-Hash表
问题说明: 从标准输入中读入一个英文单词及查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt中查找该单词,返回查找结果(查找到返回1,否则返回0)和查找过程中单词的比较次数 ...
- 程序员编程艺术:第三章续、Top K算法问题的实现
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha. 致谢:微软100题实现组,狂想曲创作组. 时间:2011年05月08日 ...
- LienJack-2年前端面试心路历程(字节跳动、YY、虎牙、BIGO)
LienJack-2年前端面试心路历程(字节跳动.YY.虎牙.BIGO) 大厂面经 字节跳动 1 面 对 tree-shaking 的了解 虽然生产模式下默认开启,但是由于经过 babel 编译全部模 ...
- offer收割机: 字节跳动、YY、虎牙、BIGO
推荐:一个非常强的小哥哥, 逆袭成功-- 作者:lienjack https://juejin.im/post/5e85ec79e51d4547153d0738 由于微信禁止外链,为了更好的阅读体验, ...
- [笔试题目] 简单总结笔试和面试中的海量数据问题
最近在笔试和面试中遇到了很多关于海量数据的问题,在此进行简单的记录,写一篇方便自己下次学习的处理海量数据的文章及在线笔记,同时也希望对你有所帮助.当然,海量数据最出名的还是七月July,但这里我是想直 ...
- 腾讯后台面经大全(整合版)
来源:牛客网 腾讯提前批一面 Tcp如何实现可靠传输 如何处理syn flood Os如何实现内存管理 进程间调度和上下文切换怎么实现 系统调用或者说中断的过程 软中断 硬中断 内存延迟分配怎么实现的 ...
- 2 年前端面试字节跳动、YY、虎牙、BIGO心路历程总结
作者 | LienJack 来源 | https://juejin.im/post/5e85ec79e51d4547153d0738 本文将先从个人背景讲起,然后谈谈在字节跳动.虎牙.YY 以及 BI ...
- 推荐引擎算法学习导论:协同过滤、聚类、分类(2011年旧文)
推荐引擎算法学习导论:协同过滤.聚类.分类 作者:July 出处:结构之法算法之道 引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了.于是昨天下午开始到今天凌晨3点,便研究了一 ...
- 笔试和面试中的海量数据问题
一. 原题重现 2015年9月27日百度笔试论述题二选一,其中第一道是关于MapReduce相关的:第二道是搜索引擎中url去重,海量数据集url如何在爬取过程中避免重复爬取过的url. ...
- 简单总结笔试和面试中的海量数据问题
最近在笔试和面试中遇到了很多关于海量数据的问题,在此进行简单的记录,写一篇方便自己下次学习的处理海量数据的文章及在线笔记,同时也希望对你有所帮助.当然,海量数据最出名的还是七月July,但这里我是想直 ...
最新文章
- java 把char转换成int型,java如何把char型数据转换成int型数据(转)
- CentOS7中NAT网卡设置静态IP
- Docker容器硬盘热扩容-centos6
- 技术解读丨GaussDB数仓高可用容灾利器之逻辑备份
- (四)基于Multisim的超外差接收系统:检波器的设计
- Redis命令参考【EXPIRE】
- 在Docker官网上浏览版本号
- JFinal Web开发学习(一)开启HelloWorld
- Android学习之多触点滑动
- VB连接ACCESS数据库精简版
- p6s与onvif_大华的录像机添加海康摄像头,使用了onvif协议,为啥也添加不进去?...
- 发几个vb整人小程序代码.第一次发帖.希望大家多多支持
- 【WLM200Think无线鼠标拆解】鼠标中键有什么用?如何用鼠标中键提高效率? 鼠标中键不灵敏如何修理?
- 火焰传感器模块的使用
- oracle里的ols机制,[Oracle] 数据库安全之 - Oracle标签安全(OLS)
- jQuery菜鸟教程01
- 格局打开,外贸牛人的价格谈判策略!
- Halcon/C++编程
- 思维导图软件哪个好?分享3款免费的思维导图软件
- 2019最新全套JAVA全套课程