[题目描述]

2827: 千山鸟飞绝

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 815  Solved: 231
[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的非负整数。

Source

湖北省队互测

[题解]

每个位置开一个splay,加入时先更新原树答案(打tag),在更新这个点,最后再加入

/* --------------user Vanisherproblem bzoj-2827
----------------*/
# include <bits/stdc++.h>
# define    N       400010
# define    ll      long long
using namespace std;
int read(){int tmp=0, fh=1; char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') fh=-1; ch=getchar();}while (ch>='0'&&ch<='9'){tmp=tmp*10+ch-'0'; ch=getchar();}return tmp*fh;
}
struct point{int x,y;}now;
struct node{int w,p;}p[N];
struct Tree{int pl,pr,tagi,tagj,fa;point num;
}T[N];
int ansi[N],ansj[N],rt[N],place,ti,size[N],n,m,at[N];
map <point, int> mp;
bool operator <(point x, point y){return x.x<y.x||x.x==y.x&&x.y<y.y;}
bool operator ==(point x, point y){return x.x==y.x&&x.y==y.y;}
void pushtag(int x){ansi[T[x].num.y]=max(ansi[T[x].num.y],T[x].tagi);ansj[T[x].num.y]=max(ansj[T[x].num.y],T[x].tagj);T[T[x].pl].tagi=max(T[T[x].pl].tagi,T[x].tagi);T[T[x].pl].tagj=max(T[T[x].pl].tagj,T[x].tagj);T[T[x].pr].tagi=max(T[T[x].pr].tagi,T[x].tagi);T[T[x].pr].tagj=max(T[T[x].pr].tagj,T[x].tagj);T[x].tagi=0; T[x].tagj=0;
}
void zig(int x){int y=T[x].fa;pushtag(y); pushtag(x);if (T[T[y].fa].pl==y) T[T[y].fa].pl=x; else T[T[y].fa].pr=x;T[x].fa=T[y].fa;T[y].pl=T[x].pr; T[T[x].pr].fa=y;T[x].pr=y; T[y].fa=x;
}
void zag(int x){int y=T[x].fa;pushtag(y); pushtag(x);if (T[T[y].fa].pl==y) T[T[y].fa].pl=x; else T[T[y].fa].pr=x;T[x].fa=T[y].fa;T[y].pr=T[x].pl; T[T[x].pl].fa=y;T[x].pl=y; T[y].fa=x;
}
void splay(int p, int x){int root=rt[p];if (x==root) return;while (T[x].fa!=root){int y=T[x].fa;if (T[y].fa==root)if (T[y].pl==x) zig(x); else zag(x);else if (T[T[y].fa].pl==y)if (T[y].pl==x) zig(y), zig(x);else zag(x), zig(x);else if (T[y].pl==x) zig(x), zag(x);else zag(y), zag(x);  }if (T[root].pl==x) zig(x); else zag(x);rt[p]=x;
}
void extend(int p, point x){int now=++place;at[x.y]=now;T[now].num=x;size[p]++;if (size[p]==1){rt[p]=now;return;}T[rt[p]].tagi=max(T[rt[p]].tagi,size[p]-1); int i=rt[p],las=0; point mx;while (i!=0){mx=T[i].num;i=T[i].pr;}ansj[x.y]=max(ansj[x.y],mx.x);ansi[x.y]=max(ansi[x.y],size[p]-1);T[rt[p]].tagj=max(T[rt[p]].tagj,x.x);las=0, i=rt[p];while (i!=0){pushtag(i); las=i;if (T[i].num<x) i=T[i].pr; else i=T[i].pl;}if (T[las].num<T[now].num)T[las].pr=now; else T[las].pl=now;T[now].fa=las;splay(p,now);
}
void del(int p, point x){int i=rt[p];while (i!=0){pushtag(i); if (T[i].num==x) break;if (T[i].num<x) i=T[i].pr; else i=T[i].pl;}splay(p,i);int l=T[rt[p]].pl,r=T[rt[p]].pr;T[l].fa=0; T[r].fa=0;if (l==0&&r==0) rt[p]=0;else if (l==0) rt[p]=r;else if (r==0) rt[p]=l;else {rt[p]=l;int las=0;while (l!=0){pushtag(l); las=l;l=T[l].pr;}splay(p,las);T[rt[p]].pr=r;T[r].fa=rt[p];}size[p]--;
}
int main(){n=read();for (int i=1; i<=n; i++){p[i].w=read(), now.x=read(), now.y=read();if (mp.find(now)==mp.end()) mp[now]=++ti;p[i].p=mp[now];extend(p[i].p,(point){p[i].w,i});}m=read();for (int i=1; i<=m; i++){int j=read(); now.x=read(),   now.y=read(); if (mp.find(now)==mp.end()) mp[now]=++ti;int nex=mp[now];del(p[j].p,(point){p[j].w,j});extend(nex,(point){p[j].w,j});p[j].p=nex;}for (int i=1; i<=n; i++){splay(p[i].p,at[i]);pushtag(rt[p[i].p]);printf("%lld\n",(ll)ansi[i]*ansj[i]);}return 0;
}

[bzoj2827]千山鸟飞绝【splay】相关推荐

  1. 2827: 千山鸟飞绝 splay打标记

    Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. ...

  2. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  3. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  4. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  5. bzoj1251: 序列终结者 (splay)

    splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出in ...

  6. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  7. [BZOJ1503]郁闷的出纳员(Splay)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  8. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

  9. splay + 线段树 ---- P3765总统选举 [带修改的动态区间众数 摩尔投票+n棵splay]

    题目链接 题目大意: 解题思路: 1.摩尔投票法: 题意是找n个数内出现次数大于n/2的数 保证存在这个数用的方法叫做摩尔投票法 首先我们注意到这样一个现象: 在任何数组中,出现次数大于该数组长度一半 ...

  10. Splay ---- 区间翻转 区间最大值 区间加 P4146 序列终结者

    题目链接 题目大意: 解题思路: 这是一道很入门的Splay的题目 但是第一次写有很多坑点 首先是maxmaxmax值的更新:就是因为这个点的最小值是会出现负数负数的,当你左右儿子有一个没有的话,那么 ...

最新文章

  1. C#初学——doWhile
  2. 服务信息块协议 SMB(Server Message Block protocol)
  3. FastDFS5.02安装说明
  4. LightOJ1298 One Theorem, One Year(DP + 欧拉函数性质)
  5. java try finally connectoin close_Java SocketChannel類代碼示例
  6. c# 网口相机可以通过_电脑可以跑安卓9.0了!完全免费
  7. 分支程序设计02 - 零基础入门学习C语言11
  8. php cannot bind port to socket,PHP基于socket实现客户端和服务端通讯功能
  9. Matlab代码生成任意边长等间距正六边形采样点
  10. django缓存优化(一)
  11. 19【推荐系统8】PNN模型——加强特征交叉能力
  12. java 子类型_Java – 基类和子类中的equals方法
  13. mysql将公历农历转换_SQL 日期转换(阳历转阴历)
  14. 树莓派4B 编译安装rtl8192eu usb网卡驱动
  15. PyG 中Message Passing机制详解
  16. 记录微信支付解密错误Tag mismatch
  17. 【Sensors】原始GNSS测量(6)
  18. 中国虚拟招聘工具行业深度调研与市场规模份额预测报告2022年
  19. tring_vector容器test
  20. Android 集成Crosswalk替换成X5WebView

热门文章

  1. 以“人民的名义”劝你快去读点书
  2. [论文阅读]PIXER: an automated particle-selection method based on segmentation using deep neural network
  3. 软文管家发布平台_企业软文如何做好
  4. 征服c指针_征服C指针.pdf
  5. 知识点 - 快速沃尔什变换
  6. 【Linux】自动执行Mysql常用命令脚本
  7. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
  8. 2012服务器系统 3389,windows 2012r2如何修改默认的3389远程端口
  9. android禁用状态栏5.1,Android5.1禁止状态栏下拉(SystemUI StatusBar)
  10. 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...