hdu 4123 rmq与树的直径
来源:互联网 发布:mac 装win10 鼠标右键 编辑:程序博客网 时间:2024/06/06 03:49
#include <bits/stdc++.h>using namespace std;#define ll long longconst int inf = 0x7f7f7f7f;const int maxn = 5e4 + 10;deque<int> Max, Min;struct node{ int v, w; node(){} node(int _v, int _w){ v = _v; w = _w; }};int LOG[2*maxn]; int dp1[20][2*maxn]; int dp2[20][2*maxn];int num[maxn];void rmq_init(int n) { int i,j; for(j=1;j<=n;j++) { dp1[0][j]=num[j]; dp2[0][j]=num[j]; } for(j=1;j<=LOG[n];j++) { int limit=n+1-(1<<j); for(i=1;i<=limit;i++) { int x=i+(1<<j>>1); dp1[j][i]=min(dp1[j-1][x],dp1[j-1][i]); dp2[j][i]=max(dp2[j-1][x],dp2[j-1][i]); } } } int rmq_min(int l,int r) { int m=LOG[r-l+1]; return min(dp1[m][l],dp1[m][r-(1<<m)+1]); } int rmq_max(int l,int r) { int m=LOG[r-l+1]; return max(dp2[m][l],dp2[m][r-(1<<m)+1]); } int n, m, x, y, z, q;int vis[maxn];vector<node>aa[maxn];int disf[maxn], diss[maxn], a[maxn];void bfs(int s, int &ss, int dist[]){ memset(dist, inf, sizeof( dist )); memset(vis, 0 ,sizeof( vis )); queue<int> q; int maxx = 0; q.push(s); vis[s] = 1; dist[s] = 0; while(!q.empty() ){ int now = q.front(); q.pop(); for(int i = 0 ; i < aa[now].size(); i++){ int v = aa[now][i].v; int w = aa[now][i].w; if(vis[v]) continue; vis[v] = 1; dist[v] = dist[now] + w; if(dist[v] > maxx){ maxx = dist[v]; ss = v; } q.push(v); } }}int main(){ LOG[0] = -1; for(int i = 1;i < 2 * maxn; i++) LOG[i] = LOG[i>>1] + 1; while(scanf("%d%d", &n, &q) , n || q){ for(int i = 1 ; i <= n ; i ++) aa[i].clear(); for(int i = 1 ;i < n ; i ++){ scanf("%d%d%d", &x, &y, &z); aa[x].push_back(node(y, z)); aa[y].push_back(node(x, z)); } int ss, tt; // puts("nima"); bfs(1, ss, disf);//cout<<" ss = "<<ss<<endl; bfs(ss, tt, disf);//cout<<" ff = "<<tt<<endl; bfs(tt, ss, diss); // puts("nimab"); for(int i = 1; i <= n; i++) num[i] = max(disf[i], diss[i]); // for(int i = 1; i <= n; i++) cout << " i = " <<i<<" "<< disf[i] <<endl; // while( !Max.empty() ) Max.pop_back() ; // while( !Min.empty() ) Min.pop_back() ; int i, j; int ans; //puts("nimabi "); rmq_init(n); while(q--) { scanf("%d",&m); int ans = 0; int l = 1,r = 1, mx, mi; while(r <= n) { mx = rmq_max(l, r); mi = rmq_min(l, r); if(mx - mi <= m ) { ans = max(ans, r - l + 1); r++; } else l++; } printf("%d\n",ans); } }}
0 0
- hdu 4123 rmq与树的直径
- HDU 4123(RMQ(o1)模板 , 树直径)
- hdu 4123 Bob’s Race (树的直径相关+rmq+单调队列思想)
- HDOJ 题目4123 Bob’s Race(树的直径+RMQ优化)
- hdoj 4123 Bob’s Race 【树的直径 + RMQ】 【二分查询会超时】
- hdu 3721 树的直径
- HDU 4607 树的直径
- HDU 2196 树的直径
- 树的直径 hdu 4607
- 树的直径 hdu 2196
- URAL 1752 Tree 2(树的直径+RMQ)
- hdu 4123 树的最长路+RMQ
- 树的直径与重心
- HDU 4123 Bob’s Race 树的直径+单调队列
- hdu 4607 求树的直径
- hdu 3721 Building Roads 树的直径
- hdu 4607 树的最长直径
- hdu 4607 树形dp 树的直径
- template中 class和typename的区别
- JavaScript学习笔记之循环在遍历数组的简单使用
- Fragment简介
- 向量几何在游戏编程中的使用1
- 《Java程序设计》课程实验指导书程序代码(答案)(实验七)
- hdu 4123 rmq与树的直径
- pixhawk 整体架构的认识
- 一些算法总结
- windows和linux下VTK7.0.0的配置
- 计算器 表达式求值
- Android之BLE开发(一)
- NSTimer的5种创建方法异同
- Ajax中window.location.href无法跳转的解决办法
- hdu 4122 单调队列或线段树