「小奇模拟赛2」小奇的危机(from hzwer.com)

「题目背景」

小奇驾驶飞船来到了一个奇怪的星球,这个星球的所以城市都在地下,而且由于环境不断恶化,星球上发生了可怕的生化危机。

「问题描述」

星球上有n个城市,标号为1-n,用n-1条双向通道连接,保证任意两个城市能互相到达。

生化危机爆发了!但由于政府安全能力有限,安全区只包括在标号l到r的城市,小奇现在在城市x,它想知道最近的安全城市的距离。

「输入格式」

第一行有1个整数n。

接下来n-1行,每行3个整数u,v,l,表示u,v之间有一条长度为l的双向通道。

接下来1个整数q,表示q次生化危机。

接下来q行,每行3个整数l,r,x,描述一次生化危机。

「输出格式」

输出q行,对于每次生化危机输出1个整数,表示最近安全城市的距离。

对于100%的数据, n,q<=100000,li<=ri,任意两个城市的距离小于10^9。

「题解」

1.分块

预处理每个点要走多远能到达某个块内的点,对于询问整块调用预处理答案,剩下暴力。

区间RMQ求lca,树形dp预处理,(留坑)调整块大小

O(n*sqrt(n))

2.线段树(留坑未写,听起来好慢)

每一个线段树结点维护一棵区间内的标号的点形成的虚树,对于每次询问,拆分成logn段区间,然后分别询问。

将询问离线处理,不妨将询问点都插入区间虚树中,然后对每个线段树的结点一次树形dp来计算答案。

线段树结点中虚树总点数为(n+q)logn,加上构建虚树的复杂度,总复杂度(n+q)log^2n

分块
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define maxn 100020
#define inf 0x3f3f3f3f3f3f3flltypedef long long ll;
struct node{int next,to,l;
}e[maxn * 2];
int head[maxn],cnt;
ll f[maxn],mnd[400][maxn],mn[20][maxn * 2],dth[maxn],a[maxn * 2];
int n,q,sz,num[maxn * 2],id[maxn],fa[maxn],len[maxn],tot;inline void adde(int x,int y,int w){e[++cnt].to = y;e[cnt].next = head[x];e[cnt].l = w;head[x] = cnt;
}
void dfs(int x){a[++tot] = dth[x] , id[x] = tot;for (int i = head[x] ; i ; i = e[i].next){if ( e[i].to == fa[x] ) continue;fa[e[i].to] = x , len[e[i].to] = e[i].l , dth[e[i].to] = dth[x] + e[i].l;dfs(e[i].to);a[++tot] = dth[x];}
}
void dfs1(int x){for (int i = head[x] ; i ; i = e[i].next){if ( e[i].to == fa[x] ) continue;dfs1(e[i].to);f[x] = min(f[x],f[e[i].to] + e[i].l);}
}
void dfs2(int x){f[x] = min(f[x],f[fa[x]] + len[x]);for (int i = head[x] ; i ; i = e[i].next){if ( e[i].to == fa[x] ) continue;dfs2(e[i].to);}
}
void init(){dfs(1);int cnt = 0;for (int i = 1 ; i <= tot ; i++){if ( (1 << (cnt + 1)) < i ) cnt++;num[i] = cnt;}for (int i = 1 ; i <= tot ; i++) mn[0][i] = a[i];for (int i = 1 ; i <= 18 ; i++)for (int j = 1 ; j <= tot ; j++){ mn[i][j] = mn[i - 1][j];if ( j + (1 << (i - 1)) <= tot ) mn[i][j] = min(mn[i][j],mn[i - 1][j + (1 << (i - 1))]);}for (int i = 1 ; i <= n / sz + 1 ; i++){memset(f,0x3f,sizeof(f));for (register int j = (i - 1) * sz + 1 ; j <= min(i * sz,n) ; j++) f[j] = 0;dfs1(1) , dfs2(1); //子树内外都统计memcpy(mnd[i],f,sizeof(f));}
}
int getl(int x){if ( x % sz == 1 ) return x / sz + 1;if ( x % sz == 0 ) return x / sz + 1;return x / sz + 2;
}
int getr(int x){return x / sz;
}
inline ll rmq(int l,int r){if ( l > r ) swap(l,r);int t = num[r - l + 1];return min(mn[t][l],mn[t][r - (1 << t) + 1]); //标准区间RMQ,注意l,r大小
}
inline ll getd(int x,int y){ll d = rmq(id[x],id[y]);return dth[x] + dth[y] - d * 2;
}
int main(){freopen("input.txt","r",stdin);scanf("%d",&n) , sz = (int)sqrt(n) + 50;for (int i = 1 ; i < n ; i++){int x,y,w;scanf("%d %d %d",&x,&y,&w);adde(x,y,w) , adde(y,x,w);}init();scanf("%d",&q);while ( q-- ){int l,r,x,ls,rs; ll ans = inf;scanf("%d %d %d",&l,&r,&x);ls = getl(l) , rs = getr(r);for (int i = ls ; i <= rs ; i++){ans = min(ans,mnd[i][x]);}//注意整块和零散块的处理for (int i = l ; i <= min(r,sz * (ls - 1)) ; i++) ans = min(ans,getd(x,i));for (int i = max(l,rs * sz + 1) ; i <= r ; i++) ans = min(ans,getd(x,i));printf("%lld\n",ans);}return 0;
}

「小奇模拟赛2」小奇的危机(from hzwer.com)相关推荐

  1. 【(高职专科组)第十一届蓝桥杯省模拟赛答案】小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2,小明将它称为洁净数。

    目录 题目:洁净数 要点 代码 题目:洁净数 问题描述 小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数.如果一个数的数位不包含数字 2,小明将它称为洁净数. 请问在整数 1 至 n 中,洁净 ...

  2. 【(高职专科组)第十一届蓝桥杯省模拟赛答案】小明每天都要练功,练功中的重要一项是梅花桩。

    题目:梅花桩 问题描述 小明每天都要练功,练功中的重要一项是梅花桩. 小明练功的梅花桩排列成 n 行 m 列,相邻两行的距离为 1,相邻两列的距离也为 1. 小明站在第 1 行第 1 列上,他要走到第 ...

  3. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  4. NOIP2016 “西湖边超萌小松鼠” 模拟赛

    总的来说,这套题的难度比较接近近些年来Day1的真实难度,认为非常值得一打 GotoAndPlay 题目大意 询问这个图上是否存在一种跳法,能跳到这个图上的每一个点 题目解析 犯了个低级错误,双向边忘 ...

  5. 「模拟赛20180307」三元组 exclaim 枚举+树状数组

    题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...

  6. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  7. 「雅礼集训 2018 Day2」农民

    传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却发 ...

  8. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  9. 纯前端实现「羊了个羊」小游戏

    点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 作者:QCY https://juejin.cn/post/7143897892531486727 背景 最近简单的「羊了个羊」小游戏火到 ...

最新文章

  1. 深度学习(3)基础3 -- 前向传播与反向传播
  2. 驭势科技引入国家队战略注资,完成超10亿元人民币融资
  3. 厉害!苏炳添即将在暨南大学成立短跑实验室
  4. nginx+tomcat动静分离结构
  5. oracle数据库 名词,Oracle数据库名词解释
  6. 【渝粤教育】21秋期末考试建设工程法规10221k1
  7. 慕了!网传腾讯《英雄联盟》项目组年终奖每人120万!
  8. 输入一个字符串,删除汉字字符或者西文字符(C语言)
  9. 【codeforces 340B】Maximal Area Quadrilateral
  10. 如何控制Asp.net Login控件的重定向地址
  11. Mac OS X上安装 Ruby运行环境
  12. vue通过识别字符串中的分号进行换行
  13. 树规? bzoj4007 战争调度
  14. 宝宝培养 IOS APP 上线
  15. c1报考驾驶证网站php删除,c1驾驶证有违章,c1驾驶证免三种违章
  16. 预算三万配一台电脑,要全套,包括显示器,音箱,耳机,键盘鼠标这些,怎么搭配才好?
  17. 经典算法题——最长公共子序列
  18. Dynamodb基础操作
  19. 常用的协议端口号(TCP and UDP)
  20. Python的traceback

热门文章

  1. 领域模型?充血模型?是头脑充血后的模型吧
  2. c# hid usb 卡死_C# 访问USB(HID)设备
  3. HC 小区管理系统工单微信模板消息配置说明
  4. 慎用ThreadLocal
  5. C4D多边形建模笔记
  6. ubuntu系统中将U盘格式化为exFAT格式
  7. 2022-4-2 Leetcode 563.二叉树的坡度
  8. 招生信息网服务器错误,中考报名网登录说密码错误怎么办
  9. ant-design-vue切换主题+换肤+自定义换肤+less动态换肤
  10. 手写vue的v-if和v-show