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方法,并非大家想象中的从一个端口发送消息到另一个 ...
随机推荐
- 11-cp 命令总结
- python基础-range用法_python2.x和3.x的区别
#range帮助创建连续的数字,通过设置步长来指定不连续 python2.7 #直接就在内存中创建出来(0-99) >>> range(100)[0, 1, 2, 3, 4, 5, ...
- “CEPH浅析”系列之八——小结
最初决定写这些文章的时候,本打算大致记录一下,几千字也就了事了.可是越写越觉得东西多,不说明白总有些不甘心,于是就越写越长,到这儿为止貌似已经有一万七千多字了.除了博士论文之外,应该是没有写过更长的东 ...
- [转]用jpa创建web项目,报错:No persistence units parsed from {classpath*:META-INF/persistence.xml}
原文地址:http://blog.sina.com.cn/s/blog_6826662b01015opk.html 最近做一个web项目用到了Spring+JPA,由于没有正确配置persistenc ...
- iOS开发--二维码的生成
一.需要包含头文件 #import <CoreImage/CoreImage.h> 二.示例代码 -- 以下生成的二维码不够清晰 如图: - (void)touchesBegan:(NSS ...
- FastFDFS_Jave客户端调用(亲测可用)
一.配置文件(fdfs_client.properties) 1 2 3 4 5 6 7 8 9 10 connect_timeout = 30 network_timeout = 60 charse ...
- 通过js写一个消息弹框
prompt(data,time) { let alertForm = document.createElement('div'); alertForm.id="promptBox" ...
- nginx正向代理,反向代理,透明代理(总结)
1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...
- Canny Edge Detector
Canny边缘检测算法有自己的理论和经验性的推导, 没仔细看/没看明白. 它的步骤如下: 对原图的灰度图进行高斯滤波 求一阶导数, 得到每个像素点的梯度强度和方向. 非最大抑制. 对每个edge ca ...
- 简进祥--iOS开发基础知识
1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = [NSURL URLWithString:UIApplicatio ...