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方法,并非大家想象中的从一个端口发送消息到另一个 ...
随机推荐
- c#自动关闭 MessageBox 弹出的窗口
我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...
- apache 多端口配置和虚拟主机配置
1 打开httpd.conf文件 2 添加端口监听 (找到Lisen 80 在后面添加 Listen 端口号 如Listen 1112) port =>你的端口 project_name=> ...
- linux 权限
ls -la 查看文件 drwxr-xr-x 2 root root 4096 ...... 第一个d:代表目录:-代表文件 后面三个一组:r:读:w:写:x:执行 第一个root 代表所属用户: 第 ...
- SharePoint 站点集和子站点数据互相读取
1.站点集中可以使用SPSite.AllWeb,然后遍历所有站点的isRootWeb,根据siteTemplate取得需要的子站点. /// <summary> /// Handles t ...
- MyBatis学习--逆向工程
简介 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..).企业实际 ...
- ELK 的好文章连接
http://www.wklken.me/posts/2016/05/24/elk-mysql-slolog.html 处理mysql慢查询日志 http://www.wklken.me/post ...
- 【转】JSP使用上传文件,并生产高清缩略图示例
原文地址:http://blog.csdn.net/yakson/article/details/9875731 前言 刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下js ...
- 【POJ 1151】Atlantis
离散化后扫描线扫一遍. 夏令营时gty学长就讲过扫描线,可惜当时too naive,知道现在才写出模板题. 当时也不会线段树啊233 #include<cstdio> #include&l ...
- Image Segmentation的定义
Definition 图像分割将一张图分为\(n\)个region, 需要满足下面5个条件 每一个像素都要属于一个region 每个region都是连通的 region与region之间没有交集 re ...
- 几种Aop实现及Castle.DynamicProxy的使用
AoP(Aspect Oriented Programming,面向切面编程) .Net平台AOP技术研究 简单实现 通过继承实现 public interface ICoding { void Do ...