Portal

Description

有\(n(n\leq10^5)\)只鸟分布在二维平面的整点上。每只鸟有威武值、士气值和团结值:威武值是固定的;士气值等于与其在同一位置的其他鸟的威武值的最大值;团结值等于与其在同一位置的其他鸟的只数。接下来\(t(t\leq2.5\times10^5)\)秒,第\(i\)秒会有一只鸟\(b_i\)由原位置飞向\((x_i,y_i)\)。求每只鸟在这\(t\)秒中,最大士气值与最大团结值的乘积。

Solution

用平衡树搞。
对于每个整点维护一棵splay,因为最多出现\(n+t\)个不同的坐标所以可以将每个坐标对应成一个数值,map或者离散化均可。splay维护子树大小\(siz\),子树最大武力值\(maxV\),每个点的目前最大士气值\(ans_1\)和最大团结值\(ans_2\)。第\(i\)秒时按以下顺序进行操作:

  • 将\(b_i\)从原树中删除。\(b_i\)的离开不会使原位置上的鸟的答案变优,所以不用管它们的\(ans\)。
  • 将\((x_i,y_i)\)对应的splay中所有点的\(ans_1\)与\(i\)的武力值取max,\(ans_2\)与该树的大小取max。可以打标记。
  • 将\(b_i\)的\(ans_1\)与\((x_i,y_i)\)对应的splay的\(maxV\)取max,\(asn_2\)与该树的大小取max。
  • 将\(b_i\)插入该树中。直接将\(b_i\)设置为该树的根的父亲就好,因为我们的splay不需要按什么关键字来维护。

\(t\)秒后,将所有标记下放,输出\(ans_1[i]\times ans_2[i]\)。

时间复杂度\(O(tlogn)\)。

Code

//千山鸟飞绝
#include <cstdio>
#include <map>
#include <queue>
using namespace std;
typedef pair<int,int> pairI;
inline char gc()
{static char now[1<<16],*S,*T;if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}return *S++;
}
inline int read()
{int x=0,f=1; char ch=gc();while(ch<'0'||'9'<ch) f=ch^'-'?f:-1,ch=gc();while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int const N=1e5+10;
int n; pairI pos[N];
int cnt; map<pairI,int> h;
int rt[N<<2],fa[N],ch[N][2],siz[N];
int maxV[N],val[N],ans1[N],ans2[N];
int tag1[N],tag2[N];
int wh(int p) {return p==ch[fa[p]][1];}
void clear(int p) {fa[p]=ch[p][0]=ch[p][1]=0,siz[p]=1; maxV[p]=val[p]; tag1[p]=tag2[p]=0;}
void update(int p)
{int ch0=ch[p][0],ch1=ch[p][1];siz[p]=siz[ch0]+1+siz[ch1];maxV[p]=max(val[p],max(maxV[ch0],maxV[ch1]));
}
void mark(int p,int t1,int t2)
{tag1[p]=max(tag1[p],t1),ans1[p]=max(ans1[p],tag1[p]);tag2[p]=max(tag2[p],t2),ans2[p]=max(ans2[p],tag2[p]);
}
void pushdw(int p)
{int ch0=ch[p][0],ch1=ch[p][1];if(tag1[p]) mark(ch0,tag1[p],0),mark(ch1,tag1[p],0),tag1[p]=0;if(tag2[p]) mark(ch0,0,tag2[p]),mark(ch1,0,tag2[p]),tag2[p]=0;
}
void rotate(int p)
{int q=fa[p],r=fa[q],w=wh(p);fa[p]=r; if(r) ch[r][wh(q)]=p;fa[ch[q][w]=ch[p][w^1]]=q;fa[ch[p][w^1]=q]=p;update(q),update(p);
}
void pushdwRt(int p) {if(fa[p]) pushdwRt(fa[p]); pushdw(p);}
void splay(int p)
{pushdwRt(p);for(int q=fa[p];q;rotate(p),q=fa[p]) if(fa[q]) rotate(wh(p)^wh(q)?p:q);rt[h[pos[p]]]=p;
}
void ins(pairI c,int p)
{pos[p]=c;if(!h[c]) {h[c]=++cnt,rt[h[c]]=p; return;}int q=rt[h[c]]; ans1[p]=max(ans1[p],maxV[q]);ans2[p]=max(ans2[p],siz[q]);mark(q,val[p],siz[q]);fa[ch[p][0]=q]=p,update(rt[h[c]]=p);
}
void del(int p)
{pairI c=pos[p];splay(p);if(!ch[p][0]) {rt[h[c]]=ch[p][1],fa[rt[h[c]]]=0; return;}int q=ch[p][0]; while(ch[q][1]) q=ch[q][1];splay(q); fa[ch[q][1]=ch[p][1]]=q; update(q);
}
void pushdwAll(int p)
{if(!p) return;pushdw(p); pushdwAll(ch[p][0]),pushdwAll(ch[p][1]);
}
int main()
{n=read();for(int i=1;i<=n;i++){siz[i]=1; maxV[i]=val[i]=read();int x=read(),y=read(); ins(pairI(x,y),i);}int t=read();for(int i=1;i<=t;i++){int p=read(),x=read(),y=read();del(p); clear(p);ins(pairI(x,y),p);}for(int i=1;i<=cnt;i++) pushdwAll(rt[i]);for(int i=1;i<=n;i++) printf("%lld\n",(long long)ans1[i]*ans2[i]);return 0;
}

P.S.

原以为码量超大,写完发现还可以嘛!
还有万径人踪灭,孤舟蓑笠翁,独钓寒江雪等你来写哦~

转载于:https://www.cnblogs.com/VisJiao/p/BZOJ2827.html

BZOJ2827 - 千山鸟飞绝相关推荐

  1. 一个还在武汉的程序员 之 千山鸟飞绝,万径人踪灭

    2.4号 晚上 我突然开始呼吸困难,近乎到睡不着的地步了. 我开始大口呼吸.轻度咳嗽.心跳有时很快. 还有最后一瓶,藿香正气水 这是我最后的希望. 我终于喝了它.好受了一些.迷迷糊糊一直到3点才睡着. ...

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

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

  3. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  4. [POI2008] Poc (原名 Trians) Treap+Hash

    这个题和千山鸟飞绝体现出了一种用平衡树解决动态集合问题,主要套路就是蜜汁标记. 这个题我一开始用替罪羊树搞了一下对了28个点,后来我换成了Treap一搞对了14个点,再后来发现被卡了Hash我竟然在自 ...

  5. OSChina 周四乱弹 —— 熊孩子毁灭世界

    2019独角兽企业重金招聘Python工程师标准>>> 小伙伴们赶快起床,开源中国要出大事啦~ 为方便大家搜索开源软件,开源中国决定整理 IT 公司开源软件.初步列表不一定完善,小伙 ...

  6. 三、Python-列表

    三.Python-列表 一.序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引:从左到右的索引从0开始依次增加的正整数:从右到左的索引为-1开始的复数 切片(分片): ...

  7. OSChina 周三乱弹——真相往往令人内牛满面

    2019独角兽企业重金招聘Python工程师标准>>> 工作累了,下班和基友一起喝点酒没啥,喝大了可就.... @李察德-泰森 刚才发生了什么 快,告诉你妈妈,因为头发没竖起来 @s ...

  8. 1024程序员节:心疼被段子手黑得最惨的你们

    今天是程序员们的节日,同样身穿着格子衫的小鱼儿也一起来凑热闹啦~ 你们有撞衫的嘛? 有一个人,姓程,名序员,今天对他来说是个伟大的日子,因为今天是10.24 问:1024是什么? 游戏?2的十次方?某 ...

  9. 小学三年级另类语文题难住大学副教授(图)

    看到这些题蔡先生也犯难 记者 阚旋 摄 小学三年级的语文卷,不仅有你想不到的,也还有你做不到的. 昨日,一套小学生三年级语文作业题,难住了长春某大学副教授蔡先生. 两天答完159个小题 "这 ...

  10. python怎么变成竖行_用python实现古诗词横板竖版显示 【二维列表的使用】

    案例展示用python实现古诗词横竖两种版本效果图 实现的代码如下: #古诗顺序倒叙读 str1="千山鸟飞绝" str2="万尽人踪灭" str3=" ...

最新文章

  1. 自动备份脚本 mysql svn
  2. 链表排序(C语言)选择排序
  3. TP的中间件:过滤处理HTTP的请求与响应
  4. struts2文件上传中,如何限制上传的文件类型
  5. 【POJ - 1511】 Invitation Cards(Dijkstra + 反向建图 多源到单源最短路的处理)
  6. C++Primer学习第四章
  7. DB2数据库常用命令
  8. linux设备驱动之 i2c设备驱动 at24c08驱动程序分析
  9. vbs教程《日期时间》
  10. python不用模块随机列表_python不用库实现随机 如何用python实现随机抽取
  11. android 日记 app推荐,有什么写日记的软件?这4个app推荐给大家!
  12. 下次面试再一上来就问我线程有哪些状态,我上去就是给他一 jio
  13. Elasticsearch - 短语匹配(match_phrase)以及slop参数
  14. mongodb-报错FailedToParse: Password must be URL Encoded for mongodb:// URL:
  15. Leecode 55跳跃游戏
  16. 用最少数量的剑引爆气球
  17. 《算法零基础100讲》(第20讲) 进制转换(二) - 进阶[C语言题解]
  18. 属性动画Android动画,Android动画(三)属性动画Animator与Interpolator
  19. 当别人对自己有意见时,怎么处理?
  20. 【计算机网络】(一)走进网络

热门文章

  1. DataGridViewCellStyle.Format 设置金额格式无作用解决方案
  2. Eat,PrayLove--结婚3周年
  3. 人人网、7K7K、178等各网站迅雷地址。最新得到的各种URL。
  4. html%2b怎么转换成加号,url 参数的加号变成空格处理
  5. 机器学习初探:(十)K均值聚类(K-means)以及KNN算法
  6. 数字视网膜图像血管分割
  7. layui标签输入框inputTags
  8. LSF - 集群概览
  9. destoon新增模块
  10. ALPS新秀登场TRON DeFi——让每个人都可参与的社会金融