bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记
这道题首先可以看出坐标没有什么意义离散掉就好了。
然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述。
所以换个视角,我们要找的是某只鸟所到每个坐标时遇到的最屌的鸟和遇到最大的团体,所以我就蒙了,这怎么改,蜜汁啊!
蓝后就到了标记的神奇应用,用标记的下传重开来把每只鸟在每个坐标里所待的那段时间里遇到的收益搞到。
两个标记: Max_army士气最大值 Max_one 团结最大值
每次来了鸟先把那只鸟的威武值更新那个坐标再放他,放完他再打团结值最大值,关键。
最后他走的时候把标记传给他,最最后输出之前先把每个点都更新。
这样就完美了~~~
我是用的替罪羊树来实现的这个蜜汁标记平衡树
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#define MAXN 30005
using namespace std;
typedef double D;
typedef unsigned long long ULL;
typedef long long LL;
const ULL K=233333333333333ULL;
const D a=0.756;
inline int Max(int x,int y)
{
return x>y?x:y;
}
int pos[MAXN];
map<ULL,int>bird;
int Max_army[MAXN],Max_one[MAXN],n,t,w[MAXN],sz;
inline ULL hash(int x,int y)
{
if(x>=&&y>=)
return (ULL)(x*K+y);
if(x>=&&y<)
{
y=-y;
return (ULL)(x*K-y);
}
if(x<&&y>=)
{
x=-x;
return (ULL)(y-x*K);
}
if(x<&&y<)
{
x=-x;
y=-y;
return (ULL)(-y-K*x);
}
}
struct ScapeGoat_Tree
{
ScapeGoat_Tree *ch[];
int size,key,cover,ex,num,max_army,max_one;
bool bad()
{
return cover*a+<ch[]->cover||cover*a+<ch[]->cover;
}
void pushup()
{
size=ch[]->size+ch[]->size+ex;
cover=ch[]->cover+ch[]->cover+;
}
}pool[MAXN<<],*null,*stack[MAXN<<],*lst[MAXN<<],*root[MAXN<<];
int top,len;
inline void pushdown(ScapeGoat_Tree *p)
{
if(p->ex)
{
Max_one[p->num]=Max(Max_one[p->num],p->max_one);
Max_army[p->num]=Max(Max_army[p->num],p->max_army);
}
if(p->max_one)
{
if(p->ch[]!=null)
p->ch[]->max_one=Max(p->ch[]->max_one,p->max_one);
if(p->ch[]!=null)
p->ch[]->max_one=Max(p->ch[]->max_one,p->max_one);
p->max_one=;
}
if(p->max_army)
{
if(p->ch[]!=null)
p->ch[]->max_army=max(p->ch[]->max_army,p->max_army);
if(p->ch[]!=null)
p->ch[]->max_army=max(p->ch[]->max_army,p->max_army);
p->max_army=;
}
}
inline void Init()
{
null=pool;
null->size=null->key=null->ex=null->cover=null->num=null->max_army=null->max_one=;
null->ch[]=null->ch[]=null;
for(int i=;i<(MAXN<<);i++) root[i]=null;
for(int i=;i<(MAXN<<);i++) stack[++top]=pool+i;
}
inline ScapeGoat_Tree *New(int key,int i)
{
ScapeGoat_Tree *p;
p=stack[top--];
p->size=p->cover=p->ex=;
p->max_army=p->max_one=;
p->key=key;
p->num=i;
p->ch[]=p->ch[]=null;
return p;
}
void travel(ScapeGoat_Tree *p)
{
if(p==null)return;
pushdown(p);
travel(p->ch[]);
if(p->ex)lst[++len]=p;
else stack[++top]=p;
travel(p->ch[]);
}
ScapeGoat_Tree *divide(int l,int r)
{
if(l>r)return null;
int mid=(l+r)>>;
lst[mid]->ch[]=divide(l,mid-);
lst[mid]->ch[]=divide(mid+,r);
lst[mid]->pushup();
return lst[mid];
}
inline void rebuild(ScapeGoat_Tree *&p)
{
len=;
travel(p);
p=divide(,len);
}
ScapeGoat_Tree **insert(ScapeGoat_Tree *&p,int key,int i)
{
if(p==null)
{
p=New(key,i);
return &null;
}
pushdown(p);
p->size++;
p->cover++;
ScapeGoat_Tree **ret=insert(p->ch[p->key<=key],key,i);
if(p->bad())ret=&p;
return ret;
}
inline int Rank(ScapeGoat_Tree *Root,int k)
{
ScapeGoat_Tree *now=Root;
while(now!=null)
if(now->ex&&now->ch[]->size+==k) return now->key;
else if(now->ch[]->size>=k) now=now->ch[];
else k-=now->ch[]->size+now->ex,now=now->ch[];
return ;
}
inline int Kth(ScapeGoat_Tree *Root,int key)
{
ScapeGoat_Tree *now=Root;
int ret=;
while(now!=null)
if(now->key>=key)
now=now->ch[];
else
ret+=now->ch[]->size+now->ex,now=now->ch[];
return ret;
}
inline void Insert(ScapeGoat_Tree *&Root,int key,int i)
{
Max_army[i]=Max(Max_army[i],Rank(Root,));
if(Root!=null)
Root->max_army=Max(Root->max_army,key);
ScapeGoat_Tree **p=insert(Root,key,i);
if(*p!=null)rebuild(*p);
Root->max_one=Max(Root->max_one,Root->size);
}
void Delete_Kth(ScapeGoat_Tree *p,int k)
{
pushdown(p);
p->size--;
if(p->ex&&p->ch[]->size+==k)
{
p->ex=;
return;
}
if(p->ch[]->size>=k) Delete_Kth(p->ch[],k);
else Delete_Kth(p->ch[],k-p->ch[]->size-p->ex);
}
inline void Delete(ScapeGoat_Tree *&Root,int key)
{
Delete_Kth(Root,Kth(Root,key));
if(Root->size<Root->cover*a)rebuild(Root);
}
void dfs(ScapeGoat_Tree *p)
{
if(p==null)return;
pushdown(p);
dfs(p->ch[]);
dfs(p->ch[]);
}
int main()
{
//freopen("bird.in","r",stdin);
//freopen("bird.out","w",stdout);
Init();
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d%d%d",&w[i],&x,&y);
int p=bird[hash(x,y)];
if(!p) p=bird[hash(x,y)]=++sz;
pos[i]=p;
Insert(root[p],w[i],i);
}
scanf("%d",&t);
for(int i=;i<=t;i++)
{
int v,x,y;
scanf("%d%d%d",&v,&x,&y);
int p=bird[hash(x,y)];
if(!p) p=bird[hash(x,y)]=++sz;
Delete(root[pos[v]],w[v]);
pos[v]=p;
Insert(root[p],w[v],v);
}
for(int i=;i<=sz;i++)
dfs(root[i]);
for(int i=;i<=n;i++)
{
LL ans=(LL)(Max_one[i]-)*Max_army[i];
printf("%lld\n",ans);
}
return ;
}
bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记的更多相关文章
- 平衡树 替罪羊树(Scapegoat Tree)
替罪羊树(Scapegoat Tree) 入门模板题 洛谷oj P3369 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同 ...
- bzoj 3224: Tyvj 1728 普通平衡树 替罪羊树
题目链接 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的 ...
- [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树
Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- [luogu3369]普通平衡树(替罪羊树模板)
解题关键:由于需要根据平衡进行重建,所以不能进行去重,否则无法保证平衡性. #include<cstdio> #include<cstring> #include<alg ...
- Bzoj3224 / Tyvj 1728 普通替罪羊树
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 12015 Solved: 5136 Description 您需要写一种数据结构(可参考题目标题), ...
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- 【替罪羊树】bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树
[替罪羊树]bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树 bzoj 洛谷 cogs 先长点芝士 替罪羊树也是一种很好写的平衡树qwq..替罪 ...
随机推荐
- mac 安装requests
首先mac上已经安装了python,我的是python2x,我自己安装了python3,python3安装requests,控制台,输入,pip3 install requests 下面就已经安装完成 ...
- Python学习手册之控制结构(二)
在上一篇文章中,我们介绍了Python的一些控制结构,现在我们继续介绍剩下的 Python 控制结构.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9972 ...
- 数据库中pymysql模块的使用
pymysql 模块 使用步骤: 核心类Connect链接用和Cursor读写用 1. 与数据库服务器建立链接 2. 获取游标对象(用于发送和接收数据) 3. 用游标执行sql语句 4. 使用fetc ...
- idea启动spring boot无法加载或找不到主类
问题产生原因:moudle名称修改,导致项目启动不了 在Terminal界面中执行以下三个命令,我在执行第一个命令的时候报了一个找不到dependency的错误,把那个报错的dependency删了就 ...
- centos 7 关闭IPtables
systemctl status iptables.service systemctl stopiptables.service
- Git中从远程的分支获取最新的版本到本地——两种命令
Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...
- 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时
在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...
- Qt 报错LINK2019:无法解析的外部符号
这里用的都是Qt 自己的东西,但是还是抱错,所以怀疑是没有包含进去,尝试了清理项目,重新编译等,还是不行 用到一个最好的办法,就是把构建的文件夹整个删除,在重新编译就可以了 如图所示,把debug和r ...
- Python3 使用 logging.basicConfig() 配置输出日志中的中文乱码解决办法
在源码中修改encoding='utf-8',因为 logging.basicConfig() 配置时实际上是用到了4大组件,只不过给了默认值而已,如果不知道怎么找到源码,告诉你们个快捷键,选中你lo ...
- python基础训练营05
任务五 时长:2天 1.file a.打开文件方式(读写两种方式) b.文件对象的操作方法 c.学习对excel及csv文件进行操作 2.os模块 3.datetime模块 4.类和对象 5.正则表达 ...