【BZOJ2827】千山鸟飞绝 离散化+splay
链接:
#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相关推荐
- 2827: 千山鸟飞绝 splay打标记
Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. ...
- 【CCCC】L3-026 传送门 (30分),splay(待复盘)
problem 7-14 传送门 平面上有 2n 个点,它们的坐标分别是 (1,0),(2,0),⋯(n,0) 和 (1,10 9 ),(2,10 9 ),⋯,(n,10 9 ...
- 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 ...
- FHQ大战Splay
目录 前言 Splay 例题 学习Splay 翻转 splay 求x的排名 求排名为x的数字 前驱后继 插点 删点 代码 区间操作 小结 FHQ Treap 例题 学习FHQ Treap 每个点都有些 ...
- 【splay】BZOJ 1152 3506:[cqoi2014]排序机械臂
BZOJ 1152 && 3506:[cqoi2014]排序机械臂 Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,第二行为N个用空格隔开的正整数 ...
- 二逼平衡树——树套树(线段树套Splay平衡树)
题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...
- 简析平衡树(三)——浅谈Splay
前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...
- AVL树、splay树(伸展树)和红黑树比较
AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...
- H - Parity game-poj1733(需要离散化)
题意:给一个序列这个序列都是由0和1组成,现在随意拿出来一个序列,然后说出他的和是奇数还是偶数,因为有可能存在假话,让你判断前多少条没有假话,也就是查找第一个假话的位置-1 // 这道题很像D题,都是 ...
- usaco Picture(离散化求线段周长)
usac前面有一题是递归求矩形覆盖面积的,学到不少东西 离散化 把所有矩形离散化(就是将整个平面分成许多"竖条"或"横条",对其操作),每个矩形都由四条边组成, ...
最新文章
- 将Java程序变成可执行文件的简单方法
- 浓缩版java8新特性
- 同步 GIT@OSC 实现MARKDOWN文件发布或更新到CSDN博客中
- input输入框小写字母自动转换成大写字母
- jsp获取连接池的实时连接数_一篇看懂数据库连接池概念、原理、运行机制
- java定义属性时用this_(转载)深入Java关键字this的用法的总结
- 先有鸡还是先有蛋? 加拿大科学家揭开谜底
- 使用表的id+随机数做不重复的订单号
- 微信好友只有昵称没有微信号_没微信号能找到人吗 只有微信昵称怎么找人
- Safari浏览器兼容性问题处理
- linux通过ip查询域名,无法通过ip地址查找对应的域名
- 一套最有效的商业模式,老板贷款80万开火锅店,开业就回本?
- ArcGIS 移动、旋转、比例缩放、复制工具
- 如何做好一个中小型企业计算机网络管理员
- 【vscode 插件】为 markdown 文章标题自动添加多级序号
- SpringBoot集成Docker下的Redis哨兵(一主两从一哨兵)
- 服务器配置与软件安装合集
- 一亿用户背后架构的秘密
- 采购入库单扫码校验,收货校验发现供应商送货错误。思迅安卓盘点机PDA
- left out join举例