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终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
随机推荐
- Ubunut18.04与Windows传输文件的方式
ubunut18.04与Windows传输文件的方式 开发环境:ubuntu18.04; 虚拟机:virtual box; 操作系统:Win10_64bits/专业版 在以前使用的ubuntu12.0 ...
- Test类实验
package PC_TEST; class CPU{ int speed; CPU(){ speed=0; } CPU(int k){ speed=k; } void setSpeed(int k) ...
- 9-C++远征之多态篇-学习笔记
C++远征之多态篇 面向对象三大特征:封装,继承,多态 多态: 发出一条命令时,不同的对象接收到同样的命令做出的动作不同 多态篇会学习到的目录: 普通虚函数 & 虚析构函数 纯虚函数:抽象类 ...
- Verilog学习笔记基本语法篇(七)········ 生成块
生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...
- JS正则表达式笔记
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 正则 描述 ...
- PHP.39-扩展-锁机制解决并发-MySQL锁、PHP文件锁
锁机制适用于高并发场景:高并发订单.秒杀…… apache压力测试 Mysql锁详解 语法 加锁:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE ......... ...
- 【Consul】Consul架构-Gossip协议
Consul使用gossip协议管理成员关系.广播消息到整个集群.详情可参考Serf library,Serf使用到的gossip协议可以参阅"SWIM: Scalable Weakly-c ...
- FRDM-KL25Z开发板上电试用
1. 硬件平台:FRDM-KL25Z开发板,先看下板子,Cortex M0+的内核,板子上自带MMA8451Q的三轴加速度传感器,触摸滑动按键,openSDA调试器.MCU主频48MHz,有16KB ...
- cf987f AND Graph
#include <iostream> #include <cstdio> using namespace std; int n, uu, m; bool a[4500005] ...
- 利用LD_PRELOAD进行hook
原文地址:http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing-hook.html 好久没玩hook这种猥琐的东西里,今天在Linux ...