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][2];
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=0,int y=0):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 -1;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][1]]+sz[ch[x][0]];
}
void push_down(int x){if(!d1[x]&&!d2[x]||!x)return;if(ch[x][0])mark_down(ch[x][0],d1[x],d2[x]);if(ch[x][1])mark_down(ch[x][1],d1[x],d2[x]);d1[x]=d2[x]=0;
}
void rot(int &x,int d){int k=ch[x][d^1];ch[x][d^1]=ch[k][d];ch[k][d]=x;push_up(x);push_up(k);x=k;
}
void insert(int &x,int val){if(x==0){tot++;ch[tot][0]=ch[tot][1]=0;key[tot]=val;rnd[tot]=rand();sz[tot]=cnt[tot]=1;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^1);push_up(x);
}
int get_max(int x){if(!x)return -1;push_down(x);if(ch[x][1])return get_max(ch[x][1]);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],0);}insert(rt[id],i);mark_down(rt[id],0,sz[rt[id]]-1);
}
int haxi(point v){return lower_bound(san+1,san+1+sum,v)-san;
}
void del(int &x,int val){if(x==0)return;push_down(x);int d=cmp(x,val);if(key[x]==val)d=-1; if(d==-1){if(ch[x][0]*ch[x][1]==0)x=ch[x][0]+ch[x][1];else{int d2=rnd[ch[x][0]]>rnd[ch[x][1]];push_down(ch[x][d2^1]);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=1;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=0;i<t;i++){q[i].input();san[++sum]=point(q[i].x,q[i].y);}sort(san+1,san+sum+1);sum=unique(san+1,san+sum+1)-san-1;for(int i=1;i<=n;i++){//枚举每只鸟 z[i]=haxi(p[i]);//z[i]是初始时的位置
        gao(z[i],i);}for(int i=0;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=1;i<=n;i++)del(rt[z[i]],i);for(int i=1;i<=n;i++)printf("%lld\n",1LL*mx[i]*tog[i]);return 0;
}

转载于:https://www.cnblogs.com/thmyl/p/8278008.html

bzoj 2827: 千山鸟飞绝相关推荐

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

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

  2. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  3. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  4. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  5. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  6. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  7. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  8. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

  9. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

  10. BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://hydro.ac/d/bzoj/p/1589 Problem 每年万圣 ...

最新文章

  1. 包子和饺子之扫地机器人_扫地机器人和体重秤在一起,能生出什么宝宝? | 爆笑囧图...
  2. Linux C编程--网络编程2--面向连接的网络编程
  3. 【剑指offer】题目二
  4. C# 功能完整的单表增删改查程序
  5. 【技术综述】视频分类/行为识别研究综述,从数据集到方法
  6. 【co】ES6-20/21 iterator与generator
  7. C++之文件操作探究(一):写文件——文本文件
  8. 图片底下配的文字叫什么_PPT排版狂想篇 | 如何用一张图片搞定30种排版
  9. Vijos 1303
  10. codeforces 463A Caisa and Sugar 解题报告
  11. 为什么勒索软件的预防如此重要?
  12. 深入浅出Python机器学习3——K最近邻算法
  13. 无线路由器的DNS服务器怎么设置,无线路由器DNS的设置方法
  14. 后盾网php 百度盘,后盾网PHP操作exce视频教程
  15. 真正免费的证件照小程序,在线一键生成标准免冠证件照,证件照底色更换,证件照尺寸修改
  16. [BZOJ4340][BJOI2015]隐身术(后缀数组)
  17. 如何用最少的老鼠试出有毒的牛奶?
  18. ZOHO 免费小型企业邮箱和个人邮箱
  19. android_Android游戏开发–基本游戏架构
  20. c++头文件中的防卫式声明

热门文章

  1. 那些一味顺从领导,不与领导顶嘴的人最后结局都怎么样了?
  2. 高级计算机网络(习题一加解析)
  3. 用java编写人民币转化为美元_js实现数字转人民币、美元的大写汉字
  4. 软文广告的写作技巧分析!
  5. processing软件使用python_Python processing学习
  6. number1(python)
  7. winsxs目录清理工具
  8. 停课集训 11.27
  9. win7配置FTP服务器
  10. 完成有顺序约束的任务指派问题--应用模拟退火算法求解