离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树。每次插入时打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]);
}
}

最新文章

  1. 用 C# 轻松读取、改变文件的创建、修改、访问时间
  2. 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
  3. 【Web】Eclipse + Maven + Struts搭建服务器
  4. Java堆内存
  5. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.7.Slider控件
  6. Android去除CPU占用过高时屏幕四周闪红框
  7. VS2010解决方案不显示无法添加项目问题
  8. php代码加密|PHP源码加密——实现方法
  9. 速卖通api--发起授权
  10. CF History(区间合并)
  11. 从移动硬盘开机,引导VHD(Win10)
  12. solr学习-基础环境搭建(一)
  13. 使用Spring框架实现用户登录实例
  14. python模板:自动化执行测试函数
  15. ABP CORE 框架入门视频教程《电话薄》基于 Asp.NET Core2.0 EF Core
  16. Advanced Pricing - How to source Pricing Attributes using QP_CUSTOM_SOURCE.Get_Custom_Attribute_Valu
  17. mysql以zip安装,解决the service already exists
  18. element-ui的回调函数Events的用法
  19. Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态
  20. 如何干净的卸载docker

热门文章

  1. Excel导入导出(篇二)
  2. Trilateration三边测量定位算法
  3. coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记
  4. android之视频播放
  5. [转]搞ACM的你伤不起(转自Roba大神)
  6. svn1.8 server client eclipse 插件 配置 完全教程
  7. SharedPreference写入-读取
  8. windows server2008 r2 下启用 sqlserver 2008的远程连接
  9. Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现
  10. git组成结构