链接:

#include <stdio.h>
int main()
{puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csdn.net/vmurder/article/details/45721413");
}

题解:

首先先把坐标离散化一下,
然后对于每个坐标点我们建一棵平衡树,每次插入操作后给整颗平衡树下传一下需求的两个标记。

注意:

splay有的人(比如我)习惯每棵都先建-inf、inf两个节点以便于查找前驱后继。然后这道题的数据是爆0x3f3f3f3f的……呵呵,怪不得我跑了千组极限数据都没挂,然后vfk的数据我直接爆零……(我的点权值随机的[1,10086])

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 35000
#define M 700000
#define ls son[x][0]
#define rs son[x][1]
#define end(i) n+(i<<1)
#define is(x) (son[fa[x]][1]==x)
#define inf 0x7fffffff
using namespace std;
int ad[M],ap[M]; // 团结值、士气值
struct DATA
{int v,f,k; // 第v只鸟于时刻f飞到k处。long long x,y;void read(int _f){f=_f;scanf("%d%lld%lld",&v,&x,&y);}
}gank[M];
bool cmpf(const DATA &A,const DATA &B){return A.f<B.f;}
bool cmpxy(const DATA &A,const DATA &B){return A.x==B.x?A.y<B.y:A.x<B.x;}
int n,m,cnt;
struct SPT
{int root[M],belong[M];int son[M][2],fa[M],kda[M]; // 威武值int AD[M],AP[M],num[M];void pushdown(int x){ad[x]=max(ad[x],AD[x]);ap[x]=max(ap[x],AP[x]);AD[ls]=max(AD[ls],AD[x]);AD[rs]=max(AD[rs],AD[x]);AP[ls]=max(AP[ls],AP[x]);AP[rs]=max(AP[rs],AP[x]);AD[x]=AP[x]=0;}void link(int x,int y,int d){son[y][d]=x,fa[x]=y;}void rotate(int x){int y,z,i=is(x),t;y=fa[x],z=fa[y],t=son[x][!i];pushdown(y),pushdown(x);link(x,z,is(y)),link(y,x,!i),link(t,y,i);son[0][0]=son[0][1]=fa[0]=0;}void splay(int rt,int x,int d=0){int y,z;while(fa[x]!=d){y=fa[x],z=fa[y];if(z==d)rotate(x);else rotate(is(x)==is(y)?y:x),rotate(x);}if(!d)root[rt]=x;}int pred(int rt,int x){splay(rt,x);for(x=ls;rs;x=rs);return x;}void insert(int rt,int v){belong[v]=rt;int x=root[rt],pre,pr;pushdown(x);while(son[x][kda[x]<kda[v]])pushdown(x=son[x][kda[x]<kda[v]]);link(v,x,kda[x]<kda[v]),num[rt]++;splay(rt,v);pre=pred(rt,end(rt));pr=pred(rt,pre);if(pre<=n){pushdown(pre);AD[pre]=num[rt]-1;ap[pre]=max(ap[pre],kda[pr]);int lss=son[pre][0],rss=son[pre][1];AP[lss]=max(AP[lss],kda[pre]);AP[rss]=max(AP[rss],kda[pre]);}}void remove(int rt,int x){int pre=pred(rt,x);splay(rt,pre),splay(rt,x,pre);pushdown(pre),pushdown(x);link(rs,pre,1),num[rt]--;ls=rs=fa[x]=0;}void init(int m){int a,b;for(int i=1;i<=m;i++){b=end(i),a=b-1;root[i]=a,kda[a]=-inf;link(b,a,1),kda[b]=inf;}for(int i=1;i<=n;i++)insert(gank[i].k,gank[i].v);}void work(int i){remove(belong[gank[i].v],gank[i].v);insert(gank[i].k,gank[i].v);}
}spt;
int main()
{int i,j,k;int a,b,c;scanf("%d",&n);for(i=1;i<=n;i++){gank[i].read(0);spt.kda[i]=gank[i].v;gank[i].v=i;}scanf("%d",&m);for(i=1;i<=m;i++)gank[i+n].read(i);sort(gank+1,gank+n+m+1,cmpxy);gank[0].x=gank[1].x^1;for(i=1;i<=n+m;i++){if(gank[i].x!=gank[i-1].x||gank[i].y!=gank[i-1].y)cnt++;gank[i].k=cnt;}sort(gank+1,gank+n+m+1,cmpf);spt.init(cnt);for(i=n+1;i<=n+m;i++)spt.work(i);for(i=1;i<=n;i++)spt.remove(spt.belong[i],i);for(i=1;i<=n;i++)printf("%lld\n",(long long)ad[i]*ap[i]);return 0;
}

【BZOJ2827】千山鸟飞绝 离散化+splay相关推荐

  1. 2827: 千山鸟飞绝 splay打标记

    Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. ...

  2. 【CCCC】L3-026 传送门 (30分),splay(待复盘)

    problem 7-14 传送门 平面上有 2n 个点,它们的坐标分别是 (1,0),(2,0),⋯(n,0) 和 (1,10 ​9 ​​ ),(2,10 ​9 ​​ ),⋯,(n,10 ​9 ​​ ...

  3. bzoj 1552: [Cerc2007]robotic sort bzoj 3506: [Cqoi2014]排序机械臂(splay区间翻转)

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1206  Solved: 460 [Submi ...

  4. FHQ大战Splay

    目录 前言 Splay 例题 学习Splay 翻转 splay 求x的排名 求排名为x的数字 前驱后继 插点 删点 代码 区间操作 小结 FHQ Treap 例题 学习FHQ Treap 每个点都有些 ...

  5. 【splay】BZOJ 1152 3506:[cqoi2014]排序机械臂

    BZOJ 1152 && 3506:[cqoi2014]排序机械臂 Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,第二行为N个用空格隔开的正整数 ...

  6. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  7. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  8. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  9. H - Parity game-poj1733(需要离散化)

    题意:给一个序列这个序列都是由0和1组成,现在随意拿出来一个序列,然后说出他的和是奇数还是偶数,因为有可能存在假话,让你判断前多少条没有假话,也就是查找第一个假话的位置-1 // 这道题很像D题,都是 ...

  10. usaco Picture(离散化求线段周长)

    usac前面有一题是递归求矩形覆盖面积的,学到不少东西 离散化 把所有矩形离散化(就是将整个平面分成许多"竖条"或"横条",对其操作),每个矩形都由四条边组成, ...

最新文章

  1. 将Java程序变成可执行文件的简单方法
  2. 浓缩版java8新特性
  3. 同步 GIT@OSC 实现MARKDOWN文件发布或更新到CSDN博客中
  4. input输入框小写字母自动转换成大写字母
  5. jsp获取连接池的实时连接数_一篇看懂数据库连接池概念、原理、运行机制
  6. java定义属性时用this_(转载)深入Java关键字this的用法的总结
  7. 先有鸡还是先有蛋? 加拿大科学家揭开谜底
  8. 使用表的id+随机数做不重复的订单号
  9. 微信好友只有昵称没有微信号_没微信号能找到人吗 只有微信昵称怎么找人
  10. Safari浏览器兼容性问题处理
  11. linux通过ip查询域名,无法通过ip地址查找对应的域名
  12. 一套最有效的商业模式,老板贷款80万开火锅店,开业就回本?
  13. ArcGIS 移动、旋转、比例缩放、复制工具
  14. 如何做好一个中小型企业计算机网络管理员
  15. 【vscode 插件】为 markdown 文章标题自动添加多级序号
  16. SpringBoot集成Docker下的Redis哨兵(一主两从一哨兵)
  17. 服务器配置与软件安装合集
  18. 一亿用户背后架构的秘密
  19. 采购入库单扫码校验,收货校验发现供应商送货错误。思迅安卓盘点机PDA
  20. left out join举例

热门文章

  1. keepalived+nginx,haproxy
  2. php 加号转义,URL中加号(+)转义问题
  3. 安卓开发颜色以及对应代码(转载)
  4. android手机定时截屏软件,最好用的截图软件 安卓手机截图软件横评对比
  5. 吴恩达反向传播算法推导,吴恩达卷积神经网络ppt
  6. 计算机学院实验报告,大学计算机实验报告-EXCEL电子表格实验
  7. 图着色问题(超详细!!!)
  8. 苏格拉底-爱情、婚姻、外遇、生活
  9. 你想要的宏基因组-微生物组知识全在这(2020.11)
  10. 基于R的飞机航线数据可视化(卫星地图)