标签:
5 5 1 2 3 2 3 4 4 5 3 3 4 2 1 2 3 4 5 0 0
1 3 3 3 5
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
//#define max(a,b) (a>b?a:b)
//#define min(a,b) (a>b?b:a)
__int64 maxv[50050][30],minv[50050][30],d[50050],maxn,d1[50050],d2[50050],dis[50050],lg[50050];
int n,m,cnt,s,head[50050],vis[50050];
struct s
{
int u,v,w,next;
}edge[50050*2];
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
__int64 max(__int64 a,__int64 b)
{
if(a>b)
return a;
return b;
}
__int64 min(__int64 a,__int64 b)
{
if(a>b)
return b;
return a;
}
void bfs(int u)
{
int i;
queue<int>q;
memset(vis,0,sizeof(vis));
vis[u]=1;
dis[u]=0;
s=u;
maxn=1;
q.push(u);
while(!q.empty())
{
int u=q.front();
q.pop();
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
{
vis[v]=1;
dis[v]=dis[u]+edge[i].w;
q.push(v);
if(dis[v]>maxn)
{
maxn=dis[v];
s=v;
}
}
}
}
}
void init()
{
int i,j,k;
lg[1]=0;
for(i=2;i<=50000;i++)
{
lg[i]=lg[i>>1]+1;
}
for(i=1;i<=n;i++)
{
minv[i][0]=maxv[i][0]=d[i];
}
for(j=1;(1<<j)<=n;j++)
{
for(k=0;k+(1<<j)-1<=n;k++)
{
minv[k][j]=min(minv[k][j-1],minv[k+(1<<(j-1))][j-1]);
maxv[k][j]=max(maxv[k][j-1],maxv[k+(1<<(j-1))][j-1]);
}
}
}
__int64 q_max(int l,int r)
{
//int k=(int)(log((double)(r-l+1))/log(2.0));
int k=lg[r-l+1];
return max(maxv[l][k],maxv[r-(1<<k)+1][k]);
}
__int64 q_min(int l,int r)
{
//int k=(int)(log((double)(r-l+1))/log(2.0));
int k=lg[r-l+1];
return min(minv[l][k],minv[r-(1<<k)+1][k]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF,n||m)
{
int i;
memset(head,-1,sizeof(head));
cnt=0;
for(i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
bfs(1);
bfs(s);
for(i=1;i<=n;i++)
{
d1[i]=dis[i];
}
bfs(s);
for(i=1;i<=n;i++)
{
d2[i]=dis[i];
d[i]=max(d1[i],d2[i]);
}
/*for(i=1;i<=n;i++)
{
printf("+++++%d\n",d[i]);
}*/
init();
while(m--)
{
__int64 q;
scanf("%I64d",&q);
int p=1,len=0;
for(i=1;i<=n;i++)
{
if(q_max(p,i)-q_min(p,i)>q&&p<i)
{
p++;
}
if((i-p+1)>len)
len=i-p+1;
}
printf("%d\n",len);
}
}
}#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 50005
#define MAXN 100005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
int n,m,ans,cnt,tot,flag;
int len,st,ed; // 直徑 起點 終點
bool vis[maxn];
int head[maxn],val[maxn],dist[maxn][2];
int f[maxn][20],g[maxn][20],lg[maxn]; //第二維為二進位
struct Node
{
int v,w,next;
} edge[MAXN];
void addedge(int u,int v,int w)
{
cnt++;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int u,int fa,int sum)
{
if(sum>len){ len=sum;st=u; }
int i,j,v;
for(i=head[u];i;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa)
{
dfs(v,u,sum+edge[i].w);
}
}
}
void dfs1(int u,int fa,int k,int sum)
{
dist[u][k]=sum;
int i,j,v;
for(i=head[u];i;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa) dfs1(v,u,k,sum+edge[i].w);
}
}
void init_rmq() // 預處理 O(n*log(n))
{
int i,j;
for(i=1;i<=n;i++)
{
f[i][0]=g[i][0]=val[i];
}
for(j=1;(1<<j)<=n;j++)
{
for(i=1;i+j-1<=n;i++)
{
if((i+(1<<(j-1))<=n))
{
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); //避免越界
g[i][j]=min(g[i][j-1],g[i+(1<<(j-1))][j-1]);
}
else
{
f[i][j]=f[i][j-1];
g[i][j]=g[i][j-1];
}
}
}
}
int query_rmq(int l,int r)
{
int k=lg[r-l+1];
return max(f[l][k],f[r-(1<<k)+1][k])-min(g[l][k],g[r-(1<<k)+1][k]);
}
int main()
{
int i,j,t;
lg[1]=0;
for(i=2;i<=50000;i++)
{
lg[i]=lg[i>>1]+1;
}
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break ;
cnt=0;
memset(head,0,sizeof(head));
int u,v,w;
for(i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
len=0;
dfs(1,0,0);
ed=st;
len=0;
dfs(st,0,0);
dfs1(st,0,0,0);
dfs1(ed,0,1,0);
for(i=1;i<=n;i++)
{
val[i]=max(dist[i][0],dist[i][1]);
// printf("i:%d val:%d\n",i,val[i]);
}
init_rmq();
int q,le,ri,mid,res,id;
while(m--)
{
scanf("%d",&q);
ans=id=1;
for(i=1;i<=n;i++)
{
while(id<=i)
{
res=query_rmq(id,i);
if(res>q) id++;
else break ;
}
ans=max(ans,i-id+1);
}
printf("%d\n",ans);
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 题目4123 Bob’s Race(树的直径+RMQ优化)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47109447