BZOJ2827: 千山鸟飞绝
离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树。每次插入时打2个标记,同时更新自身。这个方法比较显然,而且好写。正解好像用很迷的方法乱搞了一波,然后用线段树不打标记就做出来了,并不会。
treap旋转没传引用,调了好久。
#include<bits/stdc++.h>
#define N 30005
#define M 330005
#define x first
#define y second
#define IF else if
using namespace std;
int n,m,i,v[M];
typedef int ds[N];
ds f,l,r,z;
typedef pair<int,int>vec;
vec a[M],s[M];
struct node{
int v,a,i,j,s,q;
node*r,*l;
}*t[M],e[M];
node*back=e+1;
node*null=e;
node*create(int v){
return&(*back++=(node){v,z[v],0,0,1,rand(),e,e});
}
void update(node*t){
t->s=t->l->s+t->r->s+1;
t->a=max(max(t->l->a,t->r->a),z[t->v]);
}
void lturn(node*&t){
node*s=t->r;
t->r=s->l;
update(s->l=t);
update(t=s);
}
void rturn(node*&t){
node*s=t->l;
t->l=s->r;
update(s->r=t);
update(t=s);
}
void eq2(int&a,int b){
a=a<b?b:a;
}
void devolve(node*s){
eq2(s->l->i,s->i);
eq2(s->l->j,s->j);
eq2(s->r->i,s->i);
eq2(s->r->j,s->j);
eq2(l[s->v],s->i);
eq2(r[s->v],s->j);
s->i=s->j=0;
}
void insert(int v,node*&s){
if(s==null)
s=create(v);
devolve(s);
if(v<s->v){
insert(v,s->l);
if(s->l->q>s->q)
rturn(s);
}
IF(s->v<v){
insert(v,s->r);
if(s->r->q>s->q)
lturn(s);
}
update(s);
}
void erase(int v,node*&s){
devolve(s);
if(v<s->v)
erase(v,s->l);
IF(s->v<v)erase(v,s->r);
IF(s->l==null){
s=s->r;
return;
}
IF(s->r==null){
s=s->l;
return;
}
IF(s->l->q>s->r->q){
devolve(s->l);
rturn(s);
erase(v,s->r);
}
else{
devolve(s->r);
lturn(s);
erase(v,s->l);
}
update(s);
}
void come(int v,node*&s){
eq2(s->i,z[v]);
eq2(s->j,s->s);
eq2(l[v],s->a);
eq2(r[v],s->s);
insert(v,s);
}
void dfs(node*t){
if(t!=null){
devolve(t);
dfs(t->l);
dfs(t->r);
}
}
int main(){
srand(20000327);
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d%d%d",z+i,&a[i].x,&a[i].y);
s[i]=a[i];
}
scanf("%d",&m);
for(i=n+1;i<=n+m;++i){
scanf("%d%d%d",v+i,&a[i].x,&a[i].y);
s[i]=a[i];
}
sort(s+1,s+n+m+1);
for(i=1;i<=n+m;++i)
t[i]=null;
for(i=1;i<=n;++i)
come(i,t[f[i]=lower_bound(s+1,s+n+m+1,a[i])-s]);
for(i=n+1;i<=n+m;++i){
erase(v[i],t[f[v[i]]]);
come(v[i],t[f[v[i]]=lower_bound(s+1,s+n+m+1,a[i])-s]);
}
for(i=1;i<=n;++i){
dfs(t[f[i]]);
t[f[i]]=null;
printf("%lld\n",1ll*l[i]*r[i]);
}
}
BZOJ2827: 千山鸟飞绝的更多相关文章
- bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记
这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...
- 【BZOJ2827】千山鸟飞绝 hash+堆+SBT
[BZOJ2827]千山鸟飞绝 Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.v ...
- bzoj 2827: 千山鸟飞绝
2827: 千山鸟飞绝 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 802 Solved: 228[Submit][Status][Discuss ...
- 2827: 千山鸟飞绝 非旋treap
国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...
- C# Tcp协议收发数据
运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的“控制面板\系统和安全\Windows 防火墙\自定义设置”路径中,将“家庭或工作(专用)网络位置设置”和“公用 ...
- AI翻译离无障碍交流有多远
AI翻译服务通过硬件.软件连接千千万万个应用场景,会打破语言不通的尴尬局面吗?会是人工翻译的终结者吗? 世界这么大,我想去看看!十一长假临近,梦想中的你背起行囊,自由行走在异国的大街小巷.然而现实的画 ...
- 零基础学Python--------第4章 序列的应用
第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看 ...
- 三、Python-列表
一.序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引:从左到右的索引从0开始依次增加的正整数:从右到左的索引为-1开始的复数 切片(分片):一中获取序列中的元素的方 ...
- 简单的C#TCP协议收发数据示例
参考:http://www.cnblogs.com/jzxx/p/5630516.html 一.原作者的这段话很好,先引用一下: Socket的Send方法,并非大家想象中的从一个端口发送消息到另一个 ...
随机推荐
- 基本数据类型-列表_元组_字典_day4
一.列表(list)书写格式:[] #通过list类创建的 li = [1, 12, 9, ", 10, ],"庞麦郎"], "ales", True ...
- webkit webApp 开发技术要点总结
如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现呢?幸好,webkit内核的浏览器能帮助我们完成这一切.接触 webkit webApp的开发已经有一段时间了,现把一些技巧分享给大家 ...
- 高手详解SQL性能优化十条经验
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会 ...
- [转] 使用Spring MVC构建REST风格WEB应用
原文地址:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理 ...
- Kernel Methods (6) The Representer Theorem
The Representer Theorem, 表示定理. 给定: 非空样本空间: \(\chi\) \(m\)个样本:\(\{(x_1, y_1), \dots, (x_m, y_m)\}, x_ ...
- 查看本机ip
视窗+R 然后输入cmd, enter 后再黑色窗口里输入 ipconfig
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jre或者jdk并配置好环境变量.(2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本不一致 ...
- 给<tr>标签添加边框
今天做网站时发现给<tr>添加border无效.起初还以为tr不支持这个属性,百度,原来只要给<table>添加一句代码就可以了,代码如下: table{border-coll ...
- UITableView的常用属性和代理方法
以下是近期总结的关于tableView的一些属性和代理方法,以及一些常见的问题,现汇总如下,今后还会持续更新,请继续关注: tableView 的头部和尾部视图属性: UISwitch *foot ...
- for 循环 正方形
<?php//================================正方形//for($q = 1; $q <= 5; $q ++ ){// for($z =1; $z & ...