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..替罪 ...
随机推荐
- TP3.2.3 接入阿里sms 短信接口
阿里云短信接口 配置文件 config.php //阿里大鱼 'Ali_SMS' =>array( 'sms_temp' =>'短信模板', 'sms_sign' =>'签名', ' ...
- 分享一个根据具体的日期判断星座的PHP函数
其实原理很简单,也就是把所有的星座月份日期范围存储到一个数组中,然后根据日期判断属于哪个范围,这样就得到是哪个星座了. 下面的这个函数写的比较精炼,可以参考一下 function constellat ...
- 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象
类与对象 public是类的对外访问接口: 类内初始值 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员: class Clock { public: void show ...
- (数据科学学习手札29)KNN分类的原理详解&Python与R实现
一.简介 KNN(k-nearst neighbors,KNN)作为机器学习算法中的一种非常基本的算法,也正是因为其原理简单,被广泛应用于电影/音乐推荐等方面,即有些时候我们很难去建立确切的模型来描述 ...
- Eclipse_安装SAP_HANA数据库插件
1.对于Eclipse Oxygen,请添加URL https://tools.hana.ondemand.com/oxygen 2.对于Eclipse luna,请添加URL https:/ ...
- python2.7练习小例子(七)
7):题目:将一个列表的数据复制到另一个列表中. 程序分析:使用列表[:]. 程序源代码: #!/usr/bin/python # -*- coding: UTF-8 -*- ...
- Delphi中Templates代码模板添加注意事项
今天用Delphi中的代码模板添加一段代码,结果就是有问题,多次测试后,发现是编码需要注意. <?xml version="1.0" encoding="GB231 ...
- Returning Values from Bash Functions
转自:https://www.linuxjournal.com/content/return-values-bash-functions Bash functions, unlike function ...
- 【功能笔记】Ubuntu查看系统资源占用(内存,cpu和进程) {转载}
转载自http://bluexp29.blog.163.com/blog/static/33858148201071534450856/ linux真是太强大了. 查看ubuntu的资源占用的命令为$ ...
- (干货分享)mac python+appium环境搭建
因为mac本自带python2.x(不建议卸载,因为本本本身有很多依赖与此),所以装python3的过程极其坎坷,勉强装好后也总是各种报错.这次装appium环境,直接把原来的python3卸了,用h ...