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个非负整数 ...
随机推荐
- Selenium-js弹窗浮层
学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性 ...
- nodejs stream基础知识
分类 nodejs 的 stream 有四种: Readable:可读流 Writable: 可写流 Duplex:双工流 Transform:转换流 Readable // _read方法是从底层系 ...
- MFC动态创建
每个继承自CObject的对象并不会有与之对应的CRuntimeClass与之对应,除非使用了宏DECLARE_DYNAMIC\DECLARE_DYNCREATE\DECLARE_SERIAL. 这三 ...
- codeforces 553A A. Kyoya and Colored Balls(组合数学+dp)
题目链接: A. Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes i ...
- Android中高效的显示图片之二——在非UI线程中处理图片
在“加载大图”文章中提到的BitmapFactory.decode*方法,如果源数据是在磁盘.网络或其它任何不是在内存中的位置,那么它都不应该在UI线程中执行.因为它的加载时间不可预测且依赖于一系列因 ...
- 数据交换格式XML和JSON对比
1.简介: XML:extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组 ...
- TYVJ P1728 普通平衡树
P1728 普通平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第一道:普通平衡树 描述 您需要写一种数据结构(可参考题目标题),来维护 ...
- uoj problem 12 猜数
题目大意 每次询问给出g,l,有\(a*b = g*l = n\),且\(a,b\)均为\(g\)的倍数.求\(a+b\)的最小值和\(a-b\)的最大值. 题解 因为\(a,b\)均为\(g\)的倍 ...
- bzoj 3752: Hack 预处理+暴力dfs
题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...
- bean validator - Hibernate validator
在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质 ...