BZOJ 2500 幸福的道路(race) 树上直径+平衡树
structHeal
{
priority_queue<int> real;
priority_queue<int> stack;
void push(int x){
real.push(x);
}
void pop(int x){
stack.push(x);
}
int top(){
while(real.empty()==&&stack.empty()==&&real.top()==stack.top())
real.pop(),stack.pop();
if(real.empty())return0;
return real.top();
}
}
这样打堆虽然方便但是top到最后大约有6,7的常数。
今天考试卡常卡的怀疑人生……..这个故事告诉我们千万不要忘了常数分析..........
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<ctime>
#include<iostream>
#define MAXN 1000010
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct ScapeGoat_Tree
{
struct node
{
node *ch[];
int key,size,cover,ex;
void update()
{
size=ch[]->size+ch[]->size+ex;
cover=ch[]->cover+ch[]->cover+;
}
bool bad()
{
return ch[]->cover>=cover*0.756+||ch[]->cover>=cover*0.756+;
}
}Mem[MAXN],*null,*root,*stack[MAXN],*lst[MAXN];
int len,top;
void Init()
{
root=null=Mem;
null->size=null->cover=null->ex=;
null->ch[]=null->ch[]=Mem;
for(int i=;i<MAXN;i++)stack[++top]=Mem+i;
}
node *New(int key)
{
node *t=stack[top--];
t->ch[]=t->ch[]=null;
t->size=t->cover=t->ex=;
t->key=key;
return t;
}
void travel(node *p)
{
if(p==null)return;
travel(p->ch[]);
if(p->ex)lst[++len]=p;
else stack[++top]=p;
travel(p->ch[]);
}
node *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]->update();
return lst[mid];
}
void rebuild(node *&p)
{
len=;
travel(p);
p=divide(,len);
}
node **insert(node *&p,int key)
{
if(p==null)
{
p=New(key);
return &null;
}
p->size++;
p->cover++;
node **ret=insert(p->ch[p->key<=key],key);
if(p->bad())ret=&p;
return ret;
}
void erace(node *p,int k)
{
p->size--;
if(p->ex&&k==p->ch[]->size+)
{
p->ex=;
return;
}
if(k<=p->ch[]->size)erace(p->ch[],k);
else erace(p->ch[],k-p->ch[]->size-p->ex);
}
int Kth(int k)
{
node *p=root;
while(p!=null)
{
if(p->ex&&k==p->ch[]->size+)return p->key;
else if(p->ch[]->size>=k)p=p->ch[];
else k-=p->ch[]->size+p->ex,p=p->ch[];
}
}
int Rank(int x)
{
node *p=root;
int ret=;
while(p!=null)
if(p->key>=x)
p=p->ch[];
else
ret+=p->ch[]->size+p->ex,p=p->ch[];
return ret;
}
void Insert(int x)
{
node **p=insert(root,x);
if(*p!=null)rebuild(*p);
}
void Erace_kth(int k)
{
erace(root,k);
if(root->size<root->cover*0.756)rebuild(root);
}
void Erace(int x)
{
Erace_kth(Rank(x));
}
}YY;
inline int Max(int x,int y)
{
return x>y?x:y;
}
inline int Abs(int x)
{
return x<?-x:x;
}
int n,m;
struct Tr
{
int to,next,w;
}c[MAXN<<];
int head[MAXN],t;
int f[MAXN];
inline void add(int x,int y,int z)
{
c[++t].to=y;
c[t].w=z;
c[t].next=head[x];
head[x]=t;
}
int A[MAXN];
bool mark[MAXN];
int q[MAXN],top,tail,one,two;
inline void bfs1()
{
memset(mark,,sizeof(mark));
memset(A,,sizeof(A));
q[]=;
top=tail=;
int now=;
one=;
mark[]=;
while(top<=tail)
{
int x=q[top++];
if(A[x]>now)
{
one=x;
now=A[x];
}
for(int i=head[x];i;i=c[i].next)
if(mark[c[i].to]==)
{
mark[c[i].to]=;
q[++tail]=c[i].to;
A[c[i].to]=A[x]+c[i].w;
}
}
}
inline void bfs2()
{
memset(mark,,sizeof(mark));
memset(A,,sizeof(A));
q[]=one;
top=tail=;
int now=;
two=one;
mark[one]=;
while(top<=tail)
{
int x=q[top++];
if(A[x]>now)
{
two=x;
now=A[x];
}
for(int i=head[x];i;i=c[i].next)
if(mark[c[i].to]==)
{
mark[c[i].to]=;
q[++tail]=c[i].to;
A[c[i].to]=A[x]+c[i].w;
}
}
}
inline void bfs3()
{
memset(mark,,sizeof(mark));
memset(A,,sizeof(A));
q[]=one;
top=tail=;
mark[one]=;
while(top<=tail)
{
int x=q[top++];
for(int i=head[x];i;i=c[i].next)
if(mark[c[i].to]==)
{
mark[c[i].to]=;
q[++tail]=c[i].to;
A[c[i].to]=A[x]+c[i].w;
}
}
}
int B[MAXN];
inline void bfs4()
{
memset(mark,,sizeof(mark));
q[]=two;
top=tail=;
mark[two]=;
while(top<=tail)
{
int x=q[top++];
for(int i=head[x];i;i=c[i].next)
if(mark[c[i].to]==)
{
mark[c[i].to]=;
q[++tail]=c[i].to;
B[c[i].to]=B[x]+c[i].w;
}
}
}
inline void Init()
{
n=read(),m=read();
m=Abs(m);
YY.Init();
for(int i=;i<=n;i++)
{
int x=read(),y=read();
add(x,i,y);
add(i,x,y);
}
bfs1(),bfs2(),bfs3(),bfs4();
for(int i=;i<=n;i++)A[i]=Max(A[i],B[i]);
}
inline bool jud(int p)
{
int x=YY.Kth(),y=YY.Kth(YY.root->size);
if(Abs(x-p)>m||Abs(y-p)>m)return ;
return ;
}
inline void work()
{
top=;
int ans=;
YY.Insert(A[]);
for(int i=;i<=n;i++)
{
while(top!=i&&!jud(A[i]))
YY.Erace(A[top]),top++;
YY.Insert(A[i]);
ans=Max(ans,YY.root->size);
}
printf("%d",ans);
}
int main()
{
//freopen("race.in","r",stdin);
//freopen("race.out","w",stdout);
Init();
work();
return ;
}
BZOJ 2500 幸福的道路(race) 树上直径+平衡树的更多相关文章
- [BZOJ 2500] 幸福的道路
照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 368 Solved: 145[Submit][Sta ...
- bzoj 2500 幸福的道路 树上直径+set
首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- ●BZOJ 2500 幸福的道路
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2500 题解: DFS,单调队列 首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个 ...
- [Bzoj2500]幸福的道路(树上最远点)
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 474 Solved: 194[Submit][Status][Discuss ...
- 【BZOJ】【2500】幸福的道路
树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
随机推荐
- 响应式布局--设置rem自适应
//designWidth:设计稿的实际宽度值,需要根据实际设置 //maxWidth:制作稿的最大宽度值,需要根据实际设置 //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作 ...
- python3 练习题100例 (二十八)打印一定范围内的素数
题目内容: 给定一个大于2的正整数n,打印出小于n(不包括n且n不大于100)的所有素数. 要求将符合条件的输出填入一个列表中,打印的结果为该列表. 输入格式: 共一行,为一个大于2的正整数 输出格式 ...
- ccpc 2018 final G - Pastoral Life in Stardew Valley
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using ...
- 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介
数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...
- Spark 实践
1.1 避免使用 GroupByKey 让我们看一下使用两种不同的方式去计算单词的个数,第一种方式使用 reduceByKey, 另外一种方式使用 groupByKey: val words = ...
- RHEL-7.1 Server.x86_64 yum源设置为光盘
1.挂载光盘 首先在media目录下创建文件夹CentOS mkdir CentOS 然后将光盘挂载在CentOS下 mount -t iso9660 -o loop /dev/cdrom /medi ...
- PowerPC为什么会没落,我自己的反思学习总结
PowerPC为什么会没落? Intel通过酷睿,拉大优势,使得苹果抛弃PowerPC PowerPC当年异常强大,曾经是Xbox的处理器,是Mac的处理器,占据了服务器的半壁江山:当时刚刚接触C ...
- Log4net的一个小例子
最近想学习下log4net,写了个很简短的使用例子.用少的代码,可以保证程序运行起来. 配置文件: <configSections> <section name="log4 ...
- Qt 在Label上面绘制罗盘
自己写的一个小小的电子罗盘的一个小程序,不过是项目的一部分,只可以贴绘制部分代码 效果如下图 首先开始自己写的时候,虽然知道Qt 的坐标系是从左上角开始的,所以,使用了算法,在绘制后,在移动回来,但是 ...
- Docker安装Zabbix全记录
零.Zabbix架构设计 一.docker安装mysql 查找Docker Hub上的mysql镜像: [root@10e131e69e15 ~]# docker search mysql INDEX ...