2827: 千山鸟飞绝

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 802  Solved: 228
[Submit][Status][Discuss]

Description

 
话说有一天doyouloveme和vfleaking到山里玩。谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了。vfleaking顿时膜拜不已。
这时鸟王用鸟语说道:“!@#$%……?”安抚了一下众鸟的情绪。鸟王生性好斗,作出了一个决定——要排鸟布阵把刚才吓到它们的人类赶出山去。
每只鸟都有一个编号,都有一个威武值。每秒钟鸟王都会发一个命令,编号为v的鸟飞到(x,y)去(坐标系原点是山顶,坐标单位为鸟爪)。鸟飞得很快,一秒之内就飞到了,可以看作是瞬间移动。如果编号为v的鸟和编号为u的鸟某一时刻处在同一位置,它们就会互相鼓励,增加各自的士气值和团结值。一只鸟的士气值等于此刻与它处在同一位置的鸟中的威武值的最大值,团结值等于此刻与它处在同一位置的鸟的只数。如果每一时刻都没有鸟与它处在同一位置,则士气值和团结值都为0。要注意自己不能鼓励自己,计算士气值和团结值时不能算上自己。
t秒钟后,doyouloveme目测出了现在每只鸟的战斗力,于是感叹了一句:“不妙,我们得走了。”
正所谓团结的鸟儿一个顶俩,所以doyouloveme这样描述战斗力:一只鸟战斗力值等于它在0到t秒中士气值的最大值与团结值的最大值的乘积。注意不是乘积的最大值,而是最大值的乘积。
vfleaking很想知道现在每只鸟的战斗力,但是他当然不会啦,于是他把这个任务交给了你来完成。
 
 

Input

 
第一行一个数n,代表鸟的只数。(鸟王那家伙你可以完全忽视掉)
接下来n行,每行三个整数w,x,y描述每只鸟的威武值和初始坐标。第i+1行描述编号为i的鸟。
接下来一行有一个数t,代表经过时间ts。
接下来t行,每行三个整数v,x,y描述鸟王每秒的命令。
 

Output

一共n行,每行一个数,代表每只鸟的战斗力。
 
 

Sample Input

5
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

3
4
6
8
8

HINT

对于样例的解释:
首先5只鸟的位置为(1,1),(1,2),(4,4),(0,1),(2,3),士气和团结值都是0。
鸟1飞到了(1,2),于是鸟1和鸟2互相鼓励,鸟1士气变为3,鸟2士气变为1。鸟1鸟2的团结值变为1。
然后鸟2飞到(4,4),与鸟3互相鼓励,鸟2士气变为4,鸟3士气变为3。鸟2与鸟3的团结值变为1。
鸟2然后飞到了(4,3),一个没有鸟的地方。于是士气和团结值都变为了0。
接下来鸟3和鸟5都飞到了鸟4的位置,于是三只鸟互相鼓励,鸟4、鸟5士气变为4,鸟3士气仍为3。鸟3、鸟4、鸟5的团结值都变为2。
于是大家的战斗力:
鸟1:3 * 1 = 3
鸟2:4 * 1 = 4
鸟3:3 * 2 = 6
鸟4:4 * 2 = 8
鸟5:4 * 2 = 8
 
1≤n≤30000   0≤t≤300000   坐标范围为整数,且不超过INT_MIN~INT_MAX
威武值为不超过INT_MAX的非负整数。
#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: 千山鸟飞绝的更多相关文章

  1. 2827: 千山鸟飞绝 非旋treap

    国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...

  2. 「算法笔记」Splay

    一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. Selenium-js弹窗浮层

    学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性 ...

  2. nodejs stream基础知识

    分类 nodejs 的 stream 有四种: Readable:可读流 Writable: 可写流 Duplex:双工流 Transform:转换流 Readable // _read方法是从底层系 ...

  3. MFC动态创建

    每个继承自CObject的对象并不会有与之对应的CRuntimeClass与之对应,除非使用了宏DECLARE_DYNAMIC\DECLARE_DYNCREATE\DECLARE_SERIAL. 这三 ...

  4. 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 ...

  5. Android中高效的显示图片之二——在非UI线程中处理图片

    在“加载大图”文章中提到的BitmapFactory.decode*方法,如果源数据是在磁盘.网络或其它任何不是在内存中的位置,那么它都不应该在UI线程中执行.因为它的加载时间不可预测且依赖于一系列因 ...

  6. 数据交换格式XML和JSON对比

    1.简介: XML:extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组 ...

  7. TYVJ P1728 普通平衡树

    P1728 普通平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第一道:普通平衡树 描述 您需要写一种数据结构(可参考题目标题),来维护 ...

  8. uoj problem 12 猜数

    题目大意 每次询问给出g,l,有\(a*b = g*l = n\),且\(a,b\)均为\(g\)的倍数.求\(a+b\)的最小值和\(a-b\)的最大值. 题解 因为\(a,b\)均为\(g\)的倍 ...

  9. bzoj 3752: Hack 预处理+暴力dfs

    题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...

  10. bean validator - Hibernate validator

    在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质 ...