bzoj 2827: 千山鸟飞绝
2827: 千山鸟飞绝
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 802 Solved: 228
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1 1
3 1 2
4 4 4
2 0 1
2 2 3
5
1 1 2
2 4 4
2 4 3
3 0 1
5 0 1
Sample Output
4
6
8
8
HINT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100010
#define M 500010
using namespace std;
int ch[M][];
int rnd[M],key[M],sz[M],cnt[M],d1[M],d2[M],tot;
int z[N],rt[M],sum;
int mx[N],tog[N],w[N];
struct query{
int x,y,id;
void input(){scanf("%d%d%d",&id,&x,&y);}
}q[M];
struct point{
int x,y;
point(int x=,int y=):x(x),y(y){}
bool operator < (const point &b)const{
return x<b.x||x==b.x&&y<b.y;
}
bool operator == (const point &b)const{
return x==b.x&&y==b.y;
}
}p[N],san[M];
int cmp(int x,int val){
if(w[key[x]]==w[val])return key[x]<val;
return w[key[x]]<w[val];
}
int cmp2(int x,int val){
if(key[x]==val)return -;
return w[key[x]]<=w[val];
}
void mark_down(int x,int u,int v){
d1[x]=max(d1[x],u);
d2[x]=max(d2[x],v);
mx[key[x]]=max(mx[key[x]],u);
tog[key[x]]=max(tog[key[x]],v);
}
void push_up(int x){
sz[x]=cnt[x]+sz[ch[x][]]+sz[ch[x][]];
}
void push_down(int x){
if(!d1[x]&&!d2[x]||!x)return;
if(ch[x][])mark_down(ch[x][],d1[x],d2[x]);
if(ch[x][])mark_down(ch[x][],d1[x],d2[x]);
d1[x]=d2[x]=;
}
void rot(int &x,int d){
int k=ch[x][d^];
ch[x][d^]=ch[k][d];
ch[k][d]=x;
push_up(x);push_up(k);
x=k;
}
void insert(int &x,int val){
if(x==){
tot++;
ch[tot][]=ch[tot][]=;
key[tot]=val;
rnd[tot]=rand();
sz[tot]=cnt[tot]=;
x=tot;
return;
}
push_down(x);
int d=cmp(x,val);
insert(ch[x][d],val);
if(rnd[ch[x][d]]>rnd[x])rot(x,d^);
push_up(x);
}
int get_max(int x){
if(!x)return -;
push_down(x);
if(ch[x][])return get_max(ch[x][]);
return w[key[x]];
}
void gao(int id,int i){//位置,编号
if(rt[id]){
mx[i]=max(get_max(rt[id]),mx[i]);
mark_down(rt[id],w[i],);
}
insert(rt[id],i);
mark_down(rt[id],,sz[rt[id]]-);
}
int haxi(point v){
return lower_bound(san+,san++sum,v)-san;
}
void del(int &x,int val){
if(x==)return;
push_down(x);
int d=cmp(x,val);
if(key[x]==val)d=-;
if(d==-){
if(ch[x][]*ch[x][]==)x=ch[x][]+ch[x][];
else{
int d2=rnd[ch[x][]]>rnd[ch[x][]];
push_down(ch[x][d2^]);
rot(x,d2);
del(ch[x][d2],val);
}
}
else del(ch[x][d],val);
if(x)push_up(x);
}
int main(){
int n;scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&w[i],&p[i].x,&p[i].y);
san[++sum]=p[i];
}
int t;scanf("%d",&t);
for(int i=;i<t;i++){
q[i].input();
san[++sum]=point(q[i].x,q[i].y);
}
sort(san+,san+sum+);
sum=unique(san+,san+sum+)-san-;
for(int i=;i<=n;i++){//枚举每只鸟
z[i]=haxi(p[i]);//z[i]是初始时的位置
gao(z[i],i);
}
for(int i=;i<t;i++){
int u=q[i].id,xx=q[i].x,yy=q[i].y;
del(rt[z[u]],u);
z[u]=haxi(point(xx,yy));
gao(z[u],u);
}
for(int i=;i<=n;i++)del(rt[z[i]],i);
for(int i=;i<=n;i++)printf("%lld\n",1LL*mx[i]*tog[i]);
return ;
}
bzoj 2827: 千山鸟飞绝的更多相关文章
- 2827: 千山鸟飞绝 非旋treap
国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...
- 「算法笔记」Splay
一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
随机推荐
- 分享知识-快乐自己:N及分类(双重循环、递归)实现
实现多级分类: 1.双重 for 循环实现 N 及分类 /*** * 执行遍历 * * @param menus * 所有权限列表集合 * @param list * 指定角色查询到的 权限Id * ...
- python中的enumerate()函数用法
enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌 ...
- 微信菜单加emoji图标
1.https://icomoon.io/app/#/select----------------选择图标后进入 2. 笑脸表情可选择更多图标,左侧e901,是“字体码” 3.将图片复制件自定义菜单编 ...
- OpenCV-Python 霍夫直线检测-HoughLinesP函数参数
cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...
- WC2010 BZOJ1758 重建计划_长链剖分
题目大意: 求长度$\in [L,U]$的路径的最大边权和平均值. 题解 首先二分就不用说了,分数规划大家都懂. 这题有非常显然的点分治做法,但还是借着这个题学一波长链剖分. 其长链剖分本身也没啥,就 ...
- 幻想乡三连B:连在一起的幻想乡
$G[k][x]$表示所有$x$个点的无向图中每一个图的边数的$k$次方之和. $F[k][x]$就是在$G[k][x]$的基础上加了一个整体连通的性质. 有一个经典的套路就是对于$F$在对应的$G$ ...
- ngCookies都做了什么
根据官方的api文档,ngCookies的$cookieStore服务,提供了这样几个方法: 1.get(key); 2.put(key, value); 3.remove(key); 以上方法都是对 ...
- LeetCode 510. Inorder Successor in BST II
原题链接在这里:https://leetcode.com/problems/inorder-successor-in-bst-ii/ 题目: Given a binary search tree an ...
- 汇编题目:在窗口上显示Welcome to masm!
题目:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 该程序题目来自<王爽 汇编语言_第2版>的188页的说明.相关资料也在上面都有详细说明. 题 ...
- maven的配置文件取不同版本
1. 两个地方需要配置首先是要定义配置源,dev/test/prod对应的配置源需要指定:这是灵活的,可变的:其次要定义配置文件,该配置文件里面的内容采用占位符的方式来编制,在编译打包的过程中要动态根 ...