这道题首先可以看出坐标没有什么意义离散掉就好了。

然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述。

所以换个视角,我们要找的是某只鸟所到每个坐标时遇到的最屌的鸟和遇到最大的团体,所以我就蒙了,这怎么改,蜜汁啊!

蓝后就到了标记的神奇应用,用标记的下传重开来把每只鸟在每个坐标里所待的那段时间里遇到的收益搞到。

两个标记: 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: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记的更多相关文章

  1. 平衡树 替罪羊树(Scapegoat Tree)

    替罪羊树(Scapegoat Tree) 入门模板题 洛谷oj P3369 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同 ...

  2. bzoj 3224: Tyvj 1728 普通平衡树 替罪羊树

    题目链接 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的 ...

  3. [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树

    Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...

  4. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  5. [luogu3369]普通平衡树(替罪羊树模板)

    解题关键:由于需要根据平衡进行重建,所以不能进行去重,否则无法保证平衡性. #include<cstdio> #include<cstring> #include<alg ...

  6. Bzoj3224 / Tyvj 1728 普通替罪羊树

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 12015  Solved: 5136 Description 您需要写一种数据结构(可参考题目标题), ...

  7. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  8. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  9. 【替罪羊树】bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树

    [替罪羊树]bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树 bzoj 洛谷 cogs 先长点芝士 替罪羊树也是一种很好写的平衡树qwq..替罪 ...

随机推荐

  1. symfony 数据库使用(二)

    symfony可以根据数据用已经有表反向生成实体,以3.3.*为例: php bin/console doctrine:mapping:import --force AppBundle xml 从现有 ...

  2. python 函数 练习

    # 2.写函数,接收n个数字,求这些参数数字的和. def sum_func(*args): total = 0 for i in args: total += i return total prin ...

  3. python 装饰器 生成及原里

    # 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数 # 装饰器的作用 # 原则 :开放封闭原则 # 语法糖 :@ # 装饰器的固定模式 #不懂技术 import time # ...

  4. u-boot.bin生成过程分析

    ELF格式“u-boot”文件的生成规则如下,下面对应Makefile的执行过程分别分析各个依赖. $(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $( ...

  5. Go语言获取本地IP地址

    最近要做一个向局域网内的所有设备广播发送信息,并接受设备的回复信息,回复信息包括设备的版本号,IP地址,运行工程名等信息.发现一个局域网内是可以有不同的网段的,但UDP广播只能是同一个网段的广播.又发 ...

  6. debounce、throttle、requestAnimationFrame

    今天review同事代码,代码实现了返回顶部的功能,用到了lodash库中的throttle,我看着眼生,于是乎去看了下lodash文档,然后牵出了debounce,具体的知识点,这里不再赘述,底部的 ...

  7. python 推导式的用法

    推导式看了不少,可每次都有新发现 例子1:返回满足条件为真,否则为假 try_list = [1, 2, 3, 4, 5] # 前2种一样, [a > 3 for a in b] [True i ...

  8. 9.Mongodb与python交互

    1.与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo impo ...

  9. GreenMail邮件测试服务器

    GreenMail邮件测试服务器 http://blog.csdn.net/jackiehff/article/details/8741988 这个目前没有需求,所以暂不研究

  10. Linux环境搭建系列之sorl服务器的安装部署

    http://blog.csdn.net/upxiaofeng/article/details/51425732