JOI Open 2017(口胡)
T1 Amusement Park
题意:通信题。给定一张 \(n\) 个点 \(m\) 条边的无向连通图。Alice 会得到一个 \([0, 2^{60})\) 中的数 \(x\),并且她需要给这张图上每一个结点标一个数字 \(a_i = 0/1\)。
然后 Bob 也会拿到这张图(编号和 Alice 的一样),但是他不知道 \(x\),也不知道所有点上的数字。他当前在结点 \(p\),并且他知道这个结点上的数字为 \(a_p\)。
Bob 可以进行若干次移动,每次移动可以到达一个相邻的结点,并获取这个结点上的数字。Bob 需要用不超过 \(120\) 次移动知道 \(x\)。
\(60 \le n \le 10^4, m \le 2 \times 10^4\)。
首先注意到边越多越好做,并且输入可以决定你有多少条边,所以最难的情况显然是树。不妨强化一下,对于任意连通图,拉出一棵生成树,将其他边全部丢掉。于是我们只需考虑树的情况。
考虑 \(n = 60\) 怎么做,并且这种情况是可以存在的(原问题比这个强)。此时我们发现 Alice 能给 Bob 提供的信息只有 \(60\) 个 Bit,那么对于 Bob 来说什么都不能丢失,所以 Bob 必须走完这张图上的所有点。
可以给所有点规定一个顺序,表示它在最后的二进制数中位于哪一位。然后从一个结点出发时考虑树的欧拉序,可以用 \(2(n - 1)\) 次移动访问所有结点。
接下来考虑 \(n \neq 60\),首先可以拉出一个包含根的大小为 \(60\) 的连通块,在这个连通块内的所有结点做法和 \(n = 60\) 一样。
考虑连通块外的部分,我们可以对于每个结点,从他的父亲转移过来。可以考虑在父亲所属连通块内删除一个结点并加入自己,得到一个新连通块。删的这个点可以是父亲的连通块上的任意非父亲的叶子(考虑一棵大小为 \(60\) 的无根树至少有 \(2\) 个叶子)。对于该节点丢失的一个 Bit 的信息,可以在当前结点记录。得到这个连通块的过程还是欧拉序遍历即可。
时间复杂度 \(O(n\omega)\),其中 \(\omega = 60\)。移动次数 \(2(60 - 1) = 118\)。
T2 Bulldozer
二维平面上有 \(n\) 个点,每个点有一个坐标 \((x_i, y_i)\) 和一个权值 \(v_i\)。
选两条平行的直线,最大化夹在两条直线中间的点的权值和。输出这个权值和。
\(n \le 2 \times 10^3\)。
假设我们枚举斜率 \(k\)。那么考虑对于每个点,求出一条斜率为 \(k\),且经过该点的直线,对于所有点,我们按照对应直线的纵截距排序。考虑在排序后,任意一段区间可以取到,所以答案就是权值数组的最大子段和。
显然 \(k\) 一定为某两点连接得到直线的斜率,否则旋转一下一定不劣。那么一种做法就是每次 \(O(n^2)\) 枚举两个点求出 \(k\),然后排序一下求个最大子段和,时间复杂度 \(O(n^3)\) 或 \(O(n^3 \log n)\)。
注意到每个 \(k\) 的贡献是独立的,所以我们类似旋转扫描线的,将所有 \(k\) 从小到大排序后计算。
考虑对于两个点 \(u\) 和 \(v\),它们的相对位置一定是在 \(k \le k_0\) 时 \(u\) 靠前,\(k > k_0\) 时 \(v\) 靠前,并且一定存在某一时刻,使得 \(u\) 和 \(v\) 相邻。
所以对于所有可能对答案有贡献的 \(k\) 排序,对于两个点会产生相对位置变化的 \(k_0\) 排序,扫描线即可。每一相对位置变化可以看作交换两个树,我们可以用线段树维护,那么交换两个数在线段树上的体现其实就是单点修改,这个显然时可以做的。
时间复杂度 \(O(n^2 \log n)\)。
T3 Golf
二维平面上有一个高尔夫球,起始坐标为 \((X_s, Y_s)\),你要将它打到 \((X_t, Y_t)\)。
有 \(n\) 个障碍,每个障碍形如一个矩形,在任意时刻求不能穿过障碍,也不能在内部,但可以在边界上。
每次击球选择一个和坐标轴平行的方向,将球打出去任意距离,求最少需要多少次击球才能完成任务。
\(n \le 10^5\)。
将最优方案刻画为一条路径 \((X_s, Y_s), (X_1, Y_1), (X_2, Y_2), \ldots, (X_t, Y_t)\),最小化的就是路径的长度,容易发现每次球的横坐标一定是起点、终点、或某一个障碍的顶点的横坐标中的一个,否则平移一下一定不劣,所以可以先离散化一下。
一个较为暴力的做法是对 \(O(n)\) 条直线两两求交,对于交点 \(\text{bfs}\),时间复杂度 \(O(n^2)\) 或 \(O(n^3)\)。
注意到这样做状态数就是 \(O(n^2)\) 的,不好优化。考虑我们不将一个格点看作一个状态,而是将真正有用的线段看成一个状态。对于每个矩形的四条边延长,直到碰到边界或者另一个状态(要求极长),对于起点和终点分别向四个方向做射线,类似处理即可。这样可以得到有用的线段只有 \(O(n)\) 条,题意可以转化为每次切换一条线段的代价为 \(1\)。
考虑对于这些线段 \(\text{bfs}\),暴力做还是 \(O(n^2)\) 的,但此时状态只有 \(O(n)\) 个,这给我们提供了优化的空间。
具体的刻画出转移的形式:假设这条线段是竖向的(于 \(y\) 轴平行),显然它只能转移到横向线段。由于它的横坐标 \(x\) 是定值,能覆盖纵坐标的范围是 \([l, r]\),假设另一条横向线段的满足 \(y = y_0, x \in [l_0, r_0]\),前者能转移到后者当且仅当 \(y_0 \in [l, r], x \in [l_0, r_0]\)。
这个东西考虑用线段树套平衡树维护,对于上面的情况而言,在 \([l_0, r_0]\) 范围内插入 \(y\),在 \(x\) 的单点处查询纵坐标在 \([l, r]\) 内的所有状态。对于这些状态更新后就从线段树上删掉(因为是 \(\text{bfs}\),之后的转移肯定不优),那么每个状态至多被转移一次,被加入和删除一次。
时间复杂度 \(O(n \log^2 n)\),空间复杂度 \(O(n \log n)\)。
JOI Open 2017(口胡)的更多相关文章
- Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...
- 口胡FFT现场(没准就听懂了)&&FFT学习笔记
前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...
- BZOJ 口胡记录
最近实在是懒的不想打代码...好像口胡也算一种训练,那就口胡把. BZOJ 2243 染色(树链剖分) 首先树链剖分,然后记录下每个区间的左右端点颜色和当前区间的颜色段.再对每个节点维护一个tag标记 ...
- Atcoder/Topcoder 口胡记录
Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...
- NOIP2016考前做题(口胡)记录
NOIP以前可能会持续更新 写在前面 NOIP好像马上就要到了,感觉在校内训练里面经常被虐有一种要滚粗的感觉(雾.不管是普及组还是提高组,我都参加了好几年了,结果一个省一都没有,今年如果还没有的话感觉 ...
- 关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图
关于有向图走"无限次"后求概率/期望的口胡/[题解]HNCPC2019H 有向图 全是口胡 假了不管 讨论的都是图\(G=(V,E),|V|=n,|E|=m\)上的情况 " ...
- 「口胡题解」「CF965D」Single-use Stones
目录 题目 口胡题解 题目 有许多的青蛙要过河,可惜的是,青蛙根本跳不过河,他们最远只能跳 \(L\) 单位长度,而河宽 \(W\) 单位长度. 在河面上有一些石头,距离 \(i\) 远的地方有 \( ...
- PKUSC 2022 口胡题解
\(PKUSC\ 2022\)口胡题解 为了更好的在考试中拿分,我准备学习基础日麻知识(为什么每年都考麻将 啊啊啊) 首先\(STO\)吉老师\(ORZ,\)真的学到了好多 观察标签发现,这套题覆盖知 ...
- NOIP 口胡
因为没准备啥东西 这两天口胡一下近年 NOIP 的题 大概会一道不落?没什么很寄的考点主要是 2021 T1 报数 打一个 \(O(\log n)\) 查询 \(n\) 中是否有 \(7\),打一个类 ...
- 「线性基」学习笔记and乱口胡总结
还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...
随机推荐
- 【Vue】Re12 Webpack 第三部分(插件、热部署、配置分离)
一.HtmlWebpackPlugin webpack插件安装: npm install html-webpack-plugin --save-dev // 版本太高构建报错原因换这个 npm ins ...
- Audio2Gesture:NVIDIA 黄仁勋的3D虚拟人技术 —— 元宇宙
相关: https://www.nvidia.com/en-us/on-demand/session/omniverse2020-om1573/ https://www.nvidia.com/zh-t ...
- 【转载】Typora 的 Markdown 语法
原文地址: Typora 的 Markdown 语法 详细见原文: https://support.typoraio.cn/zh/Markdown-Reference/
- python进程绑定CPU的一些Demo
从https://www.cnblogs.com/devilmaycry812839668/p/17066212.html中知道如何对python进程设置CPU绑定,本文对此进行一些延伸,给出一些例子 ...
- baselines算法库baselines/common/input.py模块分析
baselines算法库baselines/common/input.py模块代码: import numpy as np import tensorflow as tf from gym.space ...
- 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验
title: 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验 date: 2024/8/14 updated: 2024/8/14 author: cmdragon exce ...
- 执行maven时报内存溢出OutOfMemory
解决的方法是调整java的堆大小的值. Windows环境中 找到文件%M2_HOME%\bin\mvn.bat ,这就是启动Maven的脚本文件,在该文件中你能看到有一行注释为: @REM set ...
- 代码随想录Day21
669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保留在树 ...
- 【GitHub】上传代码通用操作等(附下载单个文件夹或文件)
一.创建GitHub账号以及配置 参考我的另一篇文章:<[Mac系统 + Git]之上传项目代码到github上以及删除某个文件夹> 二.创建新的个人知识库 前面配置完之后,下面讲的再新建 ...
- Docker学习系列3:常用命令之容器命令
本文是Docker学习系列教程中的第三篇.前几篇教程如下: 「图文教程」Windows11下安装Docker Desktop 「填坑」在windows系统下安装Docker Desktop后迁移镜像位 ...