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个非负整数 ...
随机推荐
- 分享知识-快乐自己:Java常用API总结
1):java.io.BufferedReader类(用于从文件中读入一段字符:所属套件:java.io) 1. 构造函数BufferedReader(java.io.FileReader FileR ...
- jQuery与javascript库
[jquery-javascript库] 为了简化javascript的开发,诞生了javascript程序库,他封装了很多预定的对象和实用函数.下面是几种流行的javascript程序库:proto ...
- ES _all、_source的使用——_all字段连接所有字段的值构成一个用空格(space)分隔的大string而被analyzed和index,document主体保存在_source中
1._all 1.1_all field _all字段是一个很少用到的字段,它连接所有字段的值构成一个用空格(space)分隔的大string,该string被analyzed和index,但是不被s ...
- Java_数据交换_dom4j_01_解析xml
1.说明 详细原理以后再研究,先将例子存着 2.代码 2.1 xml内容 <?xml version="1.0" encoding="UTF-8"?> ...
- 用cookie登录慕课网络教学中心刷评论
声明:本文仅供学习参考 我们学校和的网络教学平台是在慕课网上的,需要登录到慕课网的教学平台以后,拿到cookie 注意:没次提交后需要休眠,否则刷评论过快会被系统发现 如果请求太快,很容易被系统发现( ...
- codeforces 86D D. Powerful array(莫队算法)
题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input stan ...
- 继续学习C:运算符
" / " 两整数相除,结果为整数,有一方是实数形式,结果保留小数 " % " 求余运算符要求两侧均为整型数据, 数值取余,符号与被除数一 ...
- FFmpeg 的sws_getContext函数 、sws_scale函数
FFmpeg里面的sws_scale库可以在一个函数里面同时实现:1.图像色彩空间转换:2.分辨率缩放:3.前后图像滤波处理. 其核心函数主要有三个: // 初始化sws_scalestruct Sw ...
- BZOJ4976: [Lydsy1708月赛]宝石镶嵌
BZOJ4976: [Lydsy1708月赛]宝石镶嵌 https://lydsy.com/JudgeOnline/problem.php?id=4976 分析: 本来是从\(k\le 100\)这里 ...
- Tensorflow 数据导入
导入数据 借助 tf.data API,您可以根据简单的可重用片段构建复杂的输入管道.例如,图片模型的管道可能会汇聚分布式文件系统中的文件中的数据.对每个图片应用随机扰动,并将随机选择的图片合并成用于 ...