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) 树上直径+平衡树的更多相关文章

  1. [BZOJ 2500] 幸福的道路

    照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 145[Submit][Sta ...

  2. bzoj 2500 幸福的道路 树上直径+set

    首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...

  3. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  4. ●BZOJ 2500 幸福的道路

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2500 题解: DFS,单调队列 首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个 ...

  5. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  6. 【BZOJ】【2500】幸福的道路

    树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...

  7. BZOJ2500: 幸福的道路

    题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...

  8. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  9. 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法

    [BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...

随机推荐

  1. Hadoop(9)-HDFS的NameNode和SecondaryNameNode详解

    1.NN和2NN工作机制 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低.因此,元数据需要存放在内存中.但如果只存在内存中,一旦 ...

  2. java中方法的参数传递机制_一个对象被当作参数传递到一个方法后

    一个例子: 在Boy.java类中 在Girl.java类中      在marry方法中的this指的是这个方法所属的对象的引用,在这里指的是girl这个对象 在BoyGirlTest.java测试 ...

  3. python的初体验

    最近由于毕业答辩,导致一些博客没有更新,见谅,今天我们开始一些新的内容 1.python的注释 单行注释:# 多行注释: ''' 这是多行注释 我们可以在里面写很多很多的行 ''' 2.编码风格 #c ...

  4. mysql 导入CSV数据 [转]

    转自: http://blog.chinaunix.net/uid-23284114-id-3196638.html MYSQL   LOAD DATA INFILE命令可以把csv平面文件中的数据导 ...

  5. 玩转Vim-札记(一)

    玩转Vim-札记(一) 简介 在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神.一些人勇敢地拾起了Vim或Emacs,却发现学习曲线陡峭而漫长,还是有一些人 ...

  6. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  7. 【page.js】配置及Page函数说明

    页面.js中的Page函数用来注册一个页面,指定页面的初始数据.生命周期回调.事件处理函数等. 语法:Page(Object)参数: Object json对象 Page({ /** * data * ...

  8. Struts2(七.删除和修改用户功能的实现)

    一.删除功能 之前跳转用户列表的时候把用户id,用户名,用户密码存入了ActionContext 1.userlist.jsp <%@ page language="java" ...

  9. 《Deep Learning》第二章 线性代数 笔记

    第二章 线性代数 2.1 名词 标量(scalar).向量(vector).矩阵(matrix).张量(tensor) 2.2 矩阵和向量相乘 1. 正常矩阵乘法: 2. 向量点积: 3. Hadam ...

  10. 对 vscode 自动格式化的结果不太满意,我们该如何自己调整直至自己满意为止

    前提概述 采用vue-cli 3.0自动生成vue项目,选了ESlint+Prettier,在写request.js的时候,顺手用vscode右击格式化文件(Alt+Shift+F),一下子报了8个问 ...