BZOJ2827: 千山鸟飞绝
2024-10-18 23:28:25
离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树。每次插入时打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]);
}
}
最新文章
- 用 C# 轻松读取、改变文件的创建、修改、访问时间
- 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
- 【Web】Eclipse + Maven + Struts搭建服务器
- Java堆内存
- 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.7.Slider控件
- Android去除CPU占用过高时屏幕四周闪红框
- VS2010解决方案不显示无法添加项目问题
- php代码加密|PHP源码加密——实现方法
- 速卖通api--发起授权
- CF History(区间合并)
- 从移动硬盘开机,引导VHD(Win10)
- solr学习-基础环境搭建(一)
- 使用Spring框架实现用户登录实例
- python模板:自动化执行测试函数
- ABP CORE 框架入门视频教程《电话薄》基于 Asp.NET Core2.0 EF Core
- Advanced Pricing - How to source Pricing Attributes using QP_CUSTOM_SOURCE.Get_Custom_Attribute_Valu
- mysql以zip安装,解决the service already exists
- element-ui的回调函数Events的用法
- Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态
- 如何干净的卸载docker
热门文章
- Excel导入导出(篇二)
- Trilateration三边测量定位算法
- coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记
- android之视频播放
- [转]搞ACM的你伤不起(转自Roba大神)
- svn1.8 server client eclipse 插件 配置 完全教程
- SharedPreference写入-读取
- windows server2008 r2 下启用 sqlserver 2008的远程连接
- Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现
- git组成结构