时间限制1秒 内存限制64M

题目描述:

「我们大部分的烦恼,是来自于梦想另一种有可能的人生。把希望寄托于自己的可能性这种不能指望的东西,正是万恶的根源。」

时间突然停止。

我获得了可以在平行世界中穿梭的能力。

宇宙中存在着无数的平行世界,这些世界组成了一个树形的结构,每个世界有一个编号和一个幸福度。

每当我做出选择时,世界会分裂成若干个新的世界。选择会导致幸福度的变化。根据选择的不同,在新的世界里,我可能会变的更加幸福,或者更加不幸。

出于某些原因,我只能在处于相同时间的世界内穿梭,而且只能在由若干个时间单位前的世界分裂来的世界中穿梭。

我要在平行世界中找到一个最幸福的世界,在那里继续生活下去。然而真的存在这样的世界吗?

输入格式:

第一行,一个整数,表示一共有个世界。

接下来行,每行三个整数,. 表示号世界下一个时间单位内会走向号世界,幸福度会变化。()

接下来一行,一个整数,表示接下来有Q个询问。

接下来行,每行两个整数。表示现在身处号世界,允许穿梭到从个时间单位前分裂的所有世界。 ,  。

数据保证,1号世界是根节点,且1号节点的幸福度是

输出格式:

行,每行一个整数。第的整数表示第个询问中,能获得的最大幸福度。

样例输入:

8

1 2 1

2 3 3

1 4 2

1 5 -2

5 6 3

5 7 4

5 8 -2

3

6 1

6 2

5 1

样例输出:

2

4

2

样例解释:



对于第二个询问(6, 2),6号世界2个时间单位前的世界是1号世界,1号世界分裂的所有世界中,与6号世界处在相同时间的是3号、6号、7号、8号世界,其中幸福度最高的是3号世界(0 + 1 + 3 = 4)。

题目大意:

一棵有根树,每个节点有一个权值,现在有若干个询问,对于每一个询问(x,y),求与x节点有相同深度且具有相同第y级祖先的所有节点中,权值的最大值。

解题思路:

用类似在线倍增lca的思路,nlogn预处理,可以在logn内求出他的y级祖先。

相同深度而且有某个公共y级祖先的节点的bfs序是连续的,如果获得了bfs序的区间,可以用rmq求出这个区间节点中的最大权值。

先求出所有点的bfs序,构建这些节点的st,然后二分求出区间的左端点和右端点(随着bfs序的增大他们的y级祖先的bfs序也在增大)每次求祖先logn的,因此查询的复杂度是(logn)^2的,总的复杂度o(qlognlogn)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int maxn = 100050;
const double eps = 1e-6;
int p[maxn][55], head[maxn], tot, val[maxn], vis[maxn], bfsxu, pos[maxn], spos[maxn], mm[maxn];
int maxx[maxn][55];
struct node {int from, to, next, val;
}e[maxn];
void init()
{tot = 0; bfsxu = 1; pos[1] = 1; spos[1] = 1;memset(head, -1, sizeof(head));memset(vis, 0, sizeof(vis));memset(val, 0, sizeof(val));memset(p, -1, sizeof(p));
}
void add(int u, int v, int w)
{e[tot].from = u;e[tot].to = v;e[tot].next = head[u];e[tot].val = w;head[u] = tot++;
}
void dfs(int u)
{vis[u] = 1;for (int i = head[u]; ~i; i = e[i].next){int v = e[i].to;if (!vis[v]){p[v][0] = u;dfs(v);}}
}
void rmq(int n)
{for (int j = 1; (1 << j) <= n; j++)for (int i = 1; i <= n; i++)if (~p[i][j - 1])p[i][j] = p[p[i][j - 1]][j - 1];
}
void st(int n)
{mm[0] = -1;for (int i = 1; i <= n; i++){mm[i] = ((i&(i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];maxx[i][0] = val[pos[i]];}for (int j = 1; j <= mm[n]; j++)for (int i = 1; i + (1 << j) - 1 <= n; i++)maxx[i][j] = max(maxx[i][j - 1], maxx[i + (1 << (j - 1))][j - 1]);
}
int lca(int x, int y)
{int pa = x;while (y&&pa != -1){int low = y&(-y);pa = p[pa][mm[low]];y -= low;}if (pa == -1)return 0;return pa;
}
int solve(int x, int y)
{int k = mm[y - x + 1];return max(maxx[x][k], maxx[y - (1 << k) + 1][k]);
}
int main()
{int n, x, y, z, q;while (~scanf("%d", &n)){init();for (int i = 1; i < n; i++){scanf("%d%d%d", &x, &y, &z);add(x, y, z);}dfs(1);rmq(n);queue<int>que;que.push(1);while (!que.empty()){int u = que.front(); que.pop();for (int i = head[u]; ~i; i = e[i].next){int v = e[i].to;val[v] = val[e[i].from] + e[i].val;pos[++bfsxu] = v; spos[v] = bfsxu;que.push(v);}}st(n);scanf("%d", &q);while (q--){scanf("%d%d", &x, &y);int fa = lca(x, y), ll, rr;int l = 1, r = spos[x];while (l<r){int mid = (l + r) / 2;if (spos[lca(pos[mid], y)] < spos[fa])l = mid + 1;else r = mid;}ll = l;l = spos[x], r = n;while (l<r){int mid = (l + r) / 2;if (spos[lca(pos[mid], y)]>spos[fa])r = mid - 1;else l = mid;if (r == l + 1){if (spos[lca(pos[r], y)] == spos[fa])l = r;else r = l;}}rr = l;printf("%d\n", solve(ll, rr));}}return 0;
}

四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)相关推荐

  1. 目前计算机无法显示的四叠字,四叠字列表(共19个),还能用的四叠字大全

    四叠字列表(共19个),还能用的四叠字大全,带拼音,部分注释! 之前发了一篇文章--关于三叠字的 ,很多人说有什么用?还有人直接说孔乙己,的确,这个确实没什么用,无非是可以拿出来在亲朋好友面前炫耀一下 ...

  2. 目前计算机无法显示的四叠字,四叠字列表(共19个),还能用的四叠字大全,带拼音,部分注释!...

    之前发了一篇文章--关于三叠字的 ,很多人说有什么用?还有人直接说孔乙己,的确,这个确实没什么用,无非是可以拿出来在亲朋好友面前炫耀一下!不过,不管怎么样,这也算是知识!不是吗?学到了总是好的. 除了 ...

  3. 乐视实行四天半工作制,贾跃亭羡慕的表示下周回国

    虽然老板贾跃亭跑了,但是,自从贾跃亭跑了之后,乐视却因为特立独行的行为,频频登上热搜,成为互联网行业的一朵奇葩. 就比如:前两年,互联网各大厂的 App ,在过年过节的时候,纷纷给用户补贴的时候,乐视 ...

  4. 《中国人史纲》读书笔记:第四章 半信史时代 第五章 信史时代

    第四章 半信史时代 半信史时代起自纪元前二十三世纪,终于纪元前八世纪,约一千五百年,包括夏.商.周三个王朝. 一.公元前二十三世纪 姒文命建立夏王朝,称为禹帝.禹将天下划分为九州: 冀州 河北平原与山 ...

  5. 你认识这些三叠字和四叠字吗? 犇猋骉蟲麤毳淼掱焱垚鑫卉芔鱻飍姦掱贔

    导读: 记得当年读初中刚学英语时,常说"我是中国人,不会学外文",借此来嘲笑那些学英语发狠的同学.哈哈,对头,咱们是中国人,学就应该学中国汉字.不过,既然大家都是中国人,嘿嘿,那么 ...

  6. 实探“四天半工作制”的乐视:三点只剩几个人

    燃次元(ID:chaintruth)原创 作者丨马舒叶  姜   辉 编辑丨谢中秀 1月4日,恰好是乐视实行"四天半工作制"的第一天. 当天下午三点,燃次元到达北京乐视公司楼下时, ...

  7. 【转载】三叠字和四叠字

    三叠字列表(大部分电脑可显示,共52个) 鑫 森 淼 垚 焱 靐 晶 卉 芔 轟 磊 畾 厽 馫 飍 灥 厵 犇 猋 赑 贔 蟲 麤 毳 龘 骉 驫 羴 雥 鱻 矗 姦 舙 瞐 聶 品 掱 叒 惢 譶 ...

  8. 又是别人家的公司!乐视回应四天半工作制:体感很好,工作生活兼顾

    整理 | 朱珂欣 出品 | CSDN程序人生(ID:coder_life) 前几年,乐视可谓是"绯闻"不断. 2017 年,乐视创始人贾跃亭被曝资金链断裂出走美国:2020 年 5 ...

  9. 乐视实行四天半工作制,网友:还招人吗,我有个朋友想去!

    作者 | 苏宓 出品 | CSDN(ID:CSDNnews) 新春的第一个工作日,有一个别人家的公司登上了热搜,羡煞旁人,它就是乐视. 起因是因为#乐视开始实行每周四天半工作制#,所谓话少事大,在官宣 ...

最新文章

  1. 数据流通与交易国家实验室成立 由上海牵头组建瞄准行业重大需求
  2. eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)
  3. Spring Boot----Dubbo原理分析
  4. 鉴赏交流在海报设计中的作用
  5. STM32线缆综合测试系统
  6. 微博黄v怎么认证:微博兴趣认证技巧
  7. HDU-6437 Problem L.Videos(最大费用最大流拆点)
  8. seo秘籍,seo秘籍-自学seo零基础知识入门优化教程
  9. 三星S8 隐藏Android功能键,三星S8获系统更新 新增虚拟按键隐藏功能
  10. Linux 网络排障工具 MTR --鸟枪换炮事半功倍
  11. Nature子刊 | 褚海燕组-土壤生物多样性与城市绿地生态系统功能(朱永官/韦革宏点评)...
  12. 2020线上中国国际智能产业博览会区块链高峰论坛重庆举行
  13. 电商系统,商品属性表和功能设计,可用于各种实体的属性
  14. (PTA)7-5 查询水果价格 (15分)
  15. 【转】PCB布线技巧
  16. CREO5.0.6.0基本操作与导出常用图保姆级教程
  17. 用Altium Designer打开Protel文件的方法
  18. AsyncTask——AsyncTask串行and并行
  19. 本白痴的第一个博客(就把自己的图形界面加c语言的滴滴打车信息系统传一下吧)
  20. 建立商城商品关联属性表实现单商品多规格功能

热门文章

  1. python request下载文件时、显示进度以及网速_实时网速显示_实例_python
  2. 如何创建 “抢占实例” 云服务器BCC?抢占式实例云服务器创建步骤
  3. python 爬取doc文档
  4. 用LSTM做文本情感分类(以英文为例)附github代码
  5. dnfdpl服务器维护了,2019DNF心悦DPL活动地址 DNF心悦DPL活动网址及奖励一览
  6. 阿里云对象存储oss私有桶生成链接
  7. 男朋友向女朋友打的辞职报告
  8. 多功能纺织品易燃性测试仪市场现状及未来发展趋势
  9. shader拖尾_【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发
  10. 使用 AppFuse 的七个理由之二