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. JS多项选择删除

    $(document).ready(function(){ $("#batdel").click(function(){ var checkedLen = 0; var check ...

  2. tomcat报错:Wrapper cannot find servlet class ...

    tomcat发布工程时,在浏览器输入正确的地址,遇到如下问题: HTTP Status 500 - javax.servlet.ServletException: Wrapper cannot fin ...

  3. 【leetcode刷题笔记】Pow(x, n)

    Implement pow(x, n). 题解:注意两点: 普通的递归把n降为n-1会超时,要用二分的方法,每次把xn = x[n/2] * x[n/2] * xn-[n/2]*2, [n/2]表示n ...

  4. redis学习--Hashes数据类型

    本文转自:http://www.cnblogs.com/stephen-liu74/archive/2012/03/19/2352932.html 一.概述: 我们可以将Redis中的Hashes类型 ...

  5. Bootstrap日期/日历插件Datepicker 时间加标记

    由于工作需要,项目中使用了Bootstrap日期/日历插件Datepicker,根据需求需要在其中添加日期标记,实现效果图如下: 特此记录此次解决方案: 1.首先分析了功能的DOM元素(如下图),可以 ...

  6. Poj 1552 Doubles(水题)

    一.Description As part of an arithmetic competency program, your students will be given randomly gene ...

  7. Ubuntu中Could not get lock /var/lib/dpkg/lock

    找出所有的 apt 以及 apt-get 进程: ps -A | grep apt-get 杀死进程: processnumbe 删除锁定文件: rm /var/lib/dpkg/loc 之后像下面这 ...

  8. numpy.mean和numpy.random.multivariate_normal(依据均值和协方差生成数据,提醒:计算协方差别忘了转置)

    >> import numpy as np >>> A1_mean = [1, 1] >>> A1_cov = [[2, .99], [1, 1]]&g ...

  9. javadoc 工具生成开发API文档

    =====================先来一点成就感===================== package com.springMybatis.dao; import com.springMy ...

  10. SharePoint 2013上传AI格式文件,再次下载后变成了PS格式文件

    问题: SharePoint 2013上传AI格式文件,再次下载后变成了PS格式文件 需要下载副本才能显示AI格式 解决办法有两个: 第一种,在客户端机器1. Click Start, click R ...