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

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

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

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

两个标记: 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>=0&&y>=0)return (ULL)(x*K+y);if(x>=0&&y<0){y=-y;return (ULL)(x*K-y);}if(x<0&&y>=0){x=-x;return (ULL)(y-x*K);}if(x<0&&y<0){x=-x;y=-y;return (ULL)(0-y-K*x);}
}
struct ScapeGoat_Tree
{ScapeGoat_Tree *ch[2];int size,key,cover,ex,num,max_army,max_one;bool bad(){return cover*a+5<ch[0]->cover||cover*a+5<ch[1]->cover;}void pushup(){size=ch[1]->size+ch[0]->size+ex;cover=ch[1]->cover+ch[0]->cover+1;}
}pool[MAXN<<2],*null,*stack[MAXN<<2],*lst[MAXN<<2],*root[MAXN<<4];
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[0]!=null)p->ch[0]->max_one=Max(p->ch[0]->max_one,p->max_one);if(p->ch[1]!=null)p->ch[1]->max_one=Max(p->ch[1]->max_one,p->max_one);p->max_one=0;}if(p->max_army){if(p->ch[0]!=null)p->ch[0]->max_army=max(p->ch[0]->max_army,p->max_army);if(p->ch[1]!=null)p->ch[1]->max_army=max(p->ch[1]->max_army,p->max_army);p->max_army=0;}
}
inline void Init()
{null=pool;null->size=null->key=null->ex=null->cover=null->num=null->max_army=null->max_one=0;null->ch[1]=null->ch[0]=null;for(int i=0;i<(MAXN<<4);i++) root[i]=null;for(int i=1;i<(MAXN<<2);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=1;p->max_army=p->max_one=0;p->key=key;p->num=i;p->ch[1]=p->ch[0]=null;return p;
}
void travel(ScapeGoat_Tree *p)
{if(p==null)return;pushdown(p);travel(p->ch[0]);if(p->ex)lst[++len]=p;else stack[++top]=p;travel(p->ch[1]);
}
ScapeGoat_Tree *divide(int l,int r)
{if(l>r)return null;int mid=(l+r)>>1;lst[mid]->ch[0]=divide(l,mid-1);lst[mid]->ch[1]=divide(mid+1,r);lst[mid]->pushup();return lst[mid];
}
inline void rebuild(ScapeGoat_Tree *&p)
{len=0;travel(p);p=divide(1,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[1]->size+1==k) return now->key;else if(now->ch[1]->size>=k) now=now->ch[1];else k-=now->ch[1]->size+now->ex,now=now->ch[0];return 0;
}
inline int Kth(ScapeGoat_Tree *Root,int key)
{ScapeGoat_Tree *now=Root;int ret=1;while(now!=null)if(now->key>=key)now=now->ch[0];elseret+=now->ch[0]->size+now->ex,now=now->ch[1];return ret;
}
inline void Insert(ScapeGoat_Tree *&Root,int key,int i)
{Max_army[i]=Max(Max_army[i],Rank(Root,1));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[0]->size+1==k) {p->ex=0;return;}if(p->ch[0]->size>=k) Delete_Kth(p->ch[0],k);else Delete_Kth(p->ch[1],k-p->ch[0]->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[0]);dfs(p->ch[1]);
}
int main()
{//freopen("bird.in","r",stdin);//freopen("bird.out","w",stdout);
    Init();scanf("%d",&n);for(int i=1;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=1;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=1;i<=sz;i++)dfs(root[i]);for(int i=1;i<=n;i++){LL ans=(LL)(Max_one[i]-1)*Max_army[i];printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/TSHugh/p/6994593.html

bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记相关推荐

  1. 替罪羊树+3369 【模板】普通平衡树

    传送门 一听是平衡树 就jio的很难很难 然而大佬说很简单 (听的时候确实jio的没有想象中的那么难<大佬讲的好orz) 然而 写代码的时候就完全不是了 足足花了我两个晚上啊 终于整的差不多明白 ...

  2. P3369-[模板]普通平衡树【替罪羊树】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=SSL_WYC_zombieeeeee&pid=P3369&status=& ...

  3. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树

    冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...

  4. BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...

  5. 【WC2014】紫荆花之恋【替罪羊思想】【动态点分树】【替罪羊树】

    传送门 题意:有一棵开始时没有结点的树,nnn次询问,每次新加一点并给定父结点.到父亲的距离.参数rir_iri​,并询问满足dist(u,v)≤ru+rvdist(u,v)\leq r_u+r_vd ...

  6. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

  7. 【替罪羊树及其应用】替罪羊树总结

    update:退役后对这篇文章进行了一些更新,主要增加了一个后缀平衡树的版块.很遗憾的,csp的350给我的OI生涯画上了句号.记得联赛前大概写了10遍平衡树模板,遗憾没有用上.不过代码经过联赛前反复 ...

  8. NKOJ 2703 (WC 2014)紫荆花之恋 (点分治+平衡树+替罪羊)

    P2703[WC2014]紫荆花之恋(强数据版) 问题描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花废物的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了 ...

  9. 【BZOJ3217】ALOEXT-暴力重构线段树-替罪羊树-Trie树-树套树-10k大代码(+数据生成器)...

    Problem ALOEXT 题目大意 给出一个数据结构维护一个数列,要求支持以下操作: 向数列中某个位置插入一个数 将数列中某个位置的数删除 将数列中某个位置的数换成另外一个数 查询一段区间内的次大 ...

  10. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

最新文章

  1. threejs画面拖动事件判断
  2. Web前端_项目实践01_萌娃摄影网页(纯HTML+CSS静态页面)
  3. VTK:填充孔用法实战
  4. OpenGL Tessellated Triangle镶嵌三角形的实例
  5. 【CF1230E】Kamil and Making a Stream【GCD性质】【暴力vector】
  6. SQL server 2008下载+安装详细
  7. Java Servlet(八):EL自定义函数
  8. 程序员面试金典——18.4 2的个数
  9. 怎么取消百度右侧栏的搜索热点
  10. VaR、CoVaR、delta CoVaR计算方法综述 案例与代码
  11. stm32h750电路_STM32H750开发板
  12. java 判断星期几_Java中如何判断某天是星期几
  13. java课程设计 计算器_Java课程设计-计算器
  14. 如何用python自动改试卷_利用python爬取软考试题之ip自动代理
  15. 思维导图告诉你怎样正确的做笔记?
  16. xcode9创建git分支
  17. 根据二叉树先序遍历和中序遍历构建二叉树
  18. 2019spring exam 7-5 校庆
  19. 机器学习笔记---从极大似然估计的角度看待Logistic回归
  20. MacOS下iterm,Dracula主题配置

热门文章

  1. 智能硬件可能成为网络安全事件新的“爆发点”
  2. Java并发教程(Oracle官方资料) 分享
  3. Processing鼠标键盘
  4. VOT目标跟踪测试中的测试效果展示
  5. /xiaolei.php|martin_经典开源PHP项目
  6. IBM Spectrum LSF Suites
  7. 渗透技巧总结、渗透技巧
  8. robots文件的作用
  9. 遇见Linux系统CPU使用率过高怎么办?
  10. python求球的表面积_python中计算体积或表面积的好算法