「小奇模拟赛2」小奇的危机(from hzwer.com)
「小奇模拟赛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)相关推荐
- 【(高职专科组)第十一届蓝桥杯省模拟赛答案】小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2,小明将它称为洁净数。
目录 题目:洁净数 要点 代码 题目:洁净数 问题描述 小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数.如果一个数的数位不包含数字 2,小明将它称为洁净数. 请问在整数 1 至 n 中,洁净 ...
- 【(高职专科组)第十一届蓝桥杯省模拟赛答案】小明每天都要练功,练功中的重要一项是梅花桩。
题目:梅花桩 问题描述 小明每天都要练功,练功中的重要一项是梅花桩. 小明练功的梅花桩排列成 n 行 m 列,相邻两行的距离为 1,相邻两列的距离也为 1. 小明站在第 1 行第 1 列上,他要走到第 ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- NOIP2016 “西湖边超萌小松鼠” 模拟赛
总的来说,这套题的难度比较接近近些年来Day1的真实难度,认为非常值得一打 GotoAndPlay 题目大意 询问这个图上是否存在一种跳法,能跳到这个图上的每一个点 题目解析 犯了个低级错误,双向边忘 ...
- 「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却发 ...
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- 纯前端实现「羊了个羊」小游戏
点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 作者:QCY https://juejin.cn/post/7143897892531486727 背景 最近简单的「羊了个羊」小游戏火到 ...
最新文章
- 深度学习(3)基础3 -- 前向传播与反向传播
- 驭势科技引入国家队战略注资,完成超10亿元人民币融资
- 厉害!苏炳添即将在暨南大学成立短跑实验室
- nginx+tomcat动静分离结构
- oracle数据库 名词,Oracle数据库名词解释
- 【渝粤教育】21秋期末考试建设工程法规10221k1
- 慕了!网传腾讯《英雄联盟》项目组年终奖每人120万!
- 输入一个字符串,删除汉字字符或者西文字符(C语言)
- 【codeforces 340B】Maximal Area Quadrilateral
- 如何控制Asp.net Login控件的重定向地址
- Mac OS X上安装 Ruby运行环境
- vue通过识别字符串中的分号进行换行
- 树规? bzoj4007 战争调度
- 宝宝培养 IOS APP 上线
- c1报考驾驶证网站php删除,c1驾驶证有违章,c1驾驶证免三种违章
- 预算三万配一台电脑,要全套,包括显示器,音箱,耳机,键盘鼠标这些,怎么搭配才好?
- 经典算法题——最长公共子序列
- Dynamodb基础操作
- 常用的协议端口号(TCP and UDP)
- Python的traceback