HNOI 2018 题解

2024-01-30 01:38
文章标签 2018 题解 hnoi

本文主要是介绍HNOI 2018 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[HNOI2018]转盘
把环复制一遍, a n s = m i n ( m a x ( a j − j ) + i ) ( n + 1 ≤ i ≤ n ∗ 2 , i − n + 1 ≤ j ≤ i ) ans=min(max(a_j-j)+i)(n+1\le i \le n*2,i-n+1\le j \le i) ans=min(max(ajj)+i)(n+1in2,in+1ji)
不妨令 t i = a i − i t_i = a_i-i ti=aii,则 a n s = m i n ( m a x ( t j ) + i ) + n − 1 ( 1 ≤ i ≤ n , i ≤ j ≤ i + n − 1 ) ans = min(max(t_j)+i)+n-1(1\le i \le n, i \le j \le i+n-1) ans=min(max(tj)+i)+n1(1in,iji+n1)
发现 t j > t j − n t_j > t_{j-n} tj>tjn,于是 a n s = m i n ( m a x ( t j ) + i ) + n − 1 ( 1 ≤ i ≤ n , i ≤ j ≤ n ∗ 2 ) ans = min(max(t_j)+i)+n-1(1\le i \le n, i \le j \le n*2) ans=min(max(tj)+i)+n1(1in,ijn2)
考虑每一个 j 能取到的最小的 i i i, 左边第一个大于 t j t_j tj 的为 i 的话,j 的答案就是 t j + i + 1 t_j+i+1 tj+i+1
于是可以用线段树来维护一个单调递减的单调栈,右子树的答案可以直接取,然后用右子树的最高点在左子树二分即可
[HNOI2018]游戏
玄学,不会正解,暴力的做法就是先预处理每个点往左走能走到哪儿,往右走能走到哪儿
然后预处理每个点往右往左一起能走到哪儿,可以用第一个预处理出来的跳?
应为如果直接只往左或往右走通的很少,处理第一个的时间会变少,第二个就跳得慢
但如果打通的多,第一个会变多,第二个就跳得快,于是就玄学卡过
[HNOI2018]道路
发现深度 ≤ 40 \le 40 40 所以可以直接把到根剩几条没有翻修的铁路公路压到状态里,但是空间要凉
发现每一次从左右儿子得到了 a n s ans ans 后,左右儿子的状态就没有用了,可以回收掉动态分配空间
[HNOI2018]毒瘤
一棵树的情况
f u , 0 = ∏ ( f v , 0 + f v , 1 ) , f u , 1 = ∏ f v , 0 f_{u,0} = \prod (f_{v,0}+f_{v,1}),f_{u,1}=\prod f_{v,0} fu,0=(fv,0+fv,1),fu,1=fv,0
然后发现非树边只有 3 种可能 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) (0,0), (0,1), (1,0) (0,0),(0,1),(1,0),前两种可以看做强制 u u u 不选,后一种可以看做强制 u u u选, v v v不选,于是枚举所有非树边的状态再做一遍 dp 就可以了
发现每次都会做大量重复运算,于是我们想到建一棵虚数
在这里插入图片描述
然后需要预处理系数(雾)
[HNOI2018]排列
题意:给一棵树,父亲先于儿子选,一个点的贡献是 t i m e ∗ w i time*w_i timewi,问最大贡献
考虑先按权值从小到大排序,如果 i 有父亲,那么选了它的父亲就选 i 最优,如果没有父亲,选 i 最优
选了 fa 就选 i 最优,我们考虑把它们合并,一个点合并多次后就是一个序列
考虑序列 a 和 序列 b 怎么接起来最大
a + b = ∑ i ∗ w a i + ∑ ( i + s i z a ) ∗ w b i a+b=\sum i*w_{a_i}+\sum (i+siz_a)*w_{b_i} a+b=iwai+(i+siza)wbi
b + a = ∑ i ∗ w b i + ∑ ( i + s i z b ) ∗ w a , i b+a=\sum i*w_{b_i}+\sum (i+siz_b)*w_{a,i} b+a=iwbi+(i+sizb)wa,i
f a + b − f b + a = s i z a ∗ ∑ w b i − s i z b ∑ w a i f_{a+b}-f_{b+a}=siz_a*\sum w_{b_i}-siz_b\sum w_{a_i} fa+bfb+a=sizawbisizbwai
如果 > 0 >0 >0 说明 s i z a ∗ ∑ w b i > s i z b ∑ w a i , ∑ w a i s i z a < ∑ w b i s i z b siz_a*\sum w_{b_i}>siz_b\sum w_{a_i}, \frac{\sum w_{a_i}}{siz_a}<\frac{\sum w_{b_i}}{siz_b} sizawbi>sizbwai,sizawai<sizbwbi
于是用堆按平均值排序合并就可以了
[HNOI2018]寻宝游戏
一道很妙的思维题…
按位考虑,假设当前位的序列为 x
我们将操作op抽象成一个 0/1 序列,0表示或,1表示与
如果最后一个 |1, 在最后一个 &0 之前,则为1,反之为 0
也就是说,从后往前枚举,第一个不同的地方,如果(x,op)=(0,1), 那么答案为0,否则为1
于是我们把x,op从后到前作为一个二进制数,如果 x > op 那么最高为的不同很明显是 (1,0),答案自然是1
于是就变成了比大小了,如果当前位结果为0,那么把下限改到 x,否则把上限改到 x-1
读入的时候顺便基数排序,就可以 O ( n m + m q ) O(nm+mq) O(nm+mq)做了

这篇关于HNOI 2018 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658737

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

P2858 [USACO06FEB] Treats for the Cows G/S 题解

P2858 题意 给一个数组。每天把最左或者最右的东西卖掉,第 i i i个东西,第 d a y day day天卖出的价格是 a [ i ] ∗ d a y a[i]*day a[i]∗day。 记忆化搜索 void dfs(int l,int r,int day,ll sum){if(v[l][r]>=sum)return;v[l][r]=sum;if(l>r)//这就是dp答案{