【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
【BZOJ2827】千山鸟飞绝 hash+堆+SBT的更多相关文章
- bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记
这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...
- 【BZOJ1125】[POI2008]Poc hash+map+SBT
[BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...
- BZOJ2827: 千山鸟飞绝
离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树.每次插入时打2个标记,同时更新自身.这个方法比较显然,而且好写.正解好像用很迷的方法乱搞了一波,然后用线段树不打标记就做出来了,并不会. trea ...
- OI分类
黑字:认识 红字:要学 未添加:要学 ├─模拟├─字符串│ ├─字符串基础│ ├─manacher│ ├─kmp│ ├─trie│ ├─ac自动机│ ├─后缀数组( ...
- 程序员编程艺术:第三章续、Top K算法问题的实现
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha. 致谢:微软100题实现组,狂想曲创作组. 时间:2011年05月08日 ...
- 海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
1.从set/map谈到hashtable/hash_map/hash_set 稍后本文第二部分中将多次提到hash_map/hash_set,下面稍稍介绍下这些容器,以作为基础准备.一般来说,STL ...
- bzoj4165: 矩阵(堆+hash)
求第k大用堆维护最值并出堆的时候扩展的经典题... 因为只有正数,所以一个矩阵的权值肯定比它的任意子矩阵的权值大,那么一开始把所有满足条件的最小矩阵加进堆里,弹出的时候上下左右扩展一行加进堆,用has ...
- day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树
来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...
- 栈 队列 hash表 堆 算法模板和相关题目
什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...
随机推荐
- Tomcat7中开启gzip压缩功能的配置方法
使用gzip压缩可以减少数据传输大小,加快网页加载速度.很多大站都开启了gzip压缩,不过也有很多网站并没有开启gzip压缩,上次看了一篇文章说开启gzip压缩后对搜索引擎不友好,但从带宽和流量的角度 ...
- linux下挂载win7的共享文件夹
由于跨平台开发的需要,需要在Linux和windows之间共享文件夹,所以找了一下方法,我试验了两种都可以使用. 首先声明一下我使用的是VMware10.CentOS6.2 一.手动操作 1.按照下图 ...
- jquery清空textarea等输入框
转载自:http://blog.csdn.net/dyllove98/article/details/8870307 完整示例:http://www.keleyi.com/keleyi/phtml/c ...
- 如何找到文件的家-打开文件对话框openFileDialog
private void button1_Click(object sender, EventArgs e) { openFileDialog1.Filter = "*.txt|*.txt& ...
- lscpu和cat /proc/cpuinfo
lscpu的使用 描述: 此命令用来显示cpu的相关信息 lscpu从sysfs和/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读 命令输出的信息包含cpu数量,线程,核数,套接字 ...
- MySQL5.0、5.1、5.5、5.6功能进化
目前线上使用的版本情况:新上线端口统一使用5.5,不说别的,一个快速恢复重启就值回票价. 但因为历史原因还有大量5.1的版本,甚至,I’am sorry,还有少数5.0的版本. 至于5.0以前的版本, ...
- jsp中9个内置对象与servlet对应关系及四个作用域
参考: <jsp&servlet学习笔记.第2版.林信良><JSR-245 JavaServer Pages 2.2 Maintenance Release Specifi ...
- IoC最大的好处是什么
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有 ...
- HttpServlet中,用来处理POST请求的方法是(选择1项)
HttpServlet中,用来处理POST请求的方法是(选择1项) A. doHead B. doGet C. doPost D. doPut 解答:C
- ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对记录进行排序. 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字.