JSOI部分题解
JSOI部分题解
JSOI2018
战争
问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb S,\mathbb T'\)是否有交。
我们知道对于两个凸包\(\mathbb {A,B}\)的闵科夫斯基和为\(\mathbb C=\{\vec a\in\mathbb A,\vec b\in \mathbb B\;|\;\vec a+\vec b\}\),
而两个凸包对于一次移动向量\(\vec w\)有交,则存在\(\vec a=\vec b+\vec w\Leftrightarrow\vec w=\vec a-\vec b\)。
那么构造\(\mathbb Q=\{\vec t\in \mathbb T\;|\;-\vec t\}\),构造\(\mathbb P=\mathbb{S+Q}\),每次判断是否有\(\vec w\in\mathbb P\)即可。
列队
可以贪心地想,将\([l,r]\)内所有人的休息点从小到大排序后依次放入\(K...K+r-l\)答案是最优的。
那么现在问题主要转化为如何快速求\(\sum_{i\in [l,r]} |a_i-(K+i-l)|\)(假设\(a\)已排好序)。
这时候可以对于原序列\(\{a\}\)建主席树维护个数及\(a\)的和,考虑拆掉绝对值的话就是二分\(mid\),表示\(a\)大小前的\(mid\)名均有\(a_i\leq K+i-1\),因为\(a\)两两不同所以可以保证存在一个这样的分界点。
直接在外面二分后用等差数列求和算答案复杂度为\(O(n\log^2 n)\)可以获得\(70pts\),改为在主席树上二分复杂度\(O(n\log n)\)可获得满分。
潜入行动
有一个显然的dp是设\(f[x][i][0/1][0/1]\)表示\(x\)的子树内安装了\(i\)个监听器,他自己不选/选,他父亲不选/选的方案数。
转移较为繁琐而且容易实现,这里不再赘述。
考虑复杂度:乍一看复杂度为\(O(nk^2)\)但是仔细思考发现满足度数为\(k\)的点最多\(\frac nk\)个,那么最终复杂度为\(O(nk)\)。
防御网络
题意:求从一个仙人球中任选一个点集所构成的斯坦纳树大小的期望。
考虑每条边的贡献,如果一条边不再环内的话贡献很好算。
那么主要问题就是解决环上的边怎么算贡献,只考虑某一个环,如果一个点的子树内选择了点的话就把环上这个点给标记出来,那么最后选择的东西就一定是整个环的长度减去相邻两个被选中的点的最大距离。
设\(f_x\)表示相邻两点最大长度不超过\(x\)的方案数,那么对于一个\(x\),它的方案数就是\(f_x-f_{x-1}\)。
因为是一个环,断环为链后枚举最左被选择边的点就可以消除原来环的影响。
剩下的部分考虑dp,设\(g_i\)表示当前在第\(i\)个点且强制选第\(i\)个点的方案数,转移时强制长度差不超过\(x\)前缀和优化即可。
最终复杂度\(O(n^3)\)。
绝地反击
这里提供两种方法:
方法一:
是我自己想到的,对于圆上点的排列,假设所有点均由正方向旋转度数\(\alpha\),那么最优解函数\(f(\alpha)\)一定为一个单峰函数。
三分\(\alpha\)后再二分时间\(t\),将到达时间\(\leq mid\)的我方舰队向敌方母舰连边,跑二分图匹配看是否有完美匹配即可。
这种做法我在loj上是\(80pts\),但是经过一些常数优化后应该是可以过的。
方法二:
二分时间\(t\),那么对于每艘战舰在圆弧上的交点至多只有\(2\)个,而对于旋转,可以发现本质不同的转法一定是有一个点转到了这\(2n\)个交点中的其中一个。
我们将这\(2n\)个转角极角排序(这\(2n\)个点可用余弦定理算出),则每次改变转角最多加入或删除一组匹配,手动模拟退流即可,复杂度\(O(二分图匹配\times\log n)\)。
JSOI2016
最佳团体
考虑01分数规划,那么我们现在二分了比值\(mid\),每个点有一个新的权值\(c_i=p_i-s_i\times mid\),
现在要求在满足条件的情况下使\(\sum c\)最大,树形背包即可。
独特的树叶
因为是树的同构问题,考虑树哈希。
有一种异或的树哈希方法(\(f\)为哈希数组):
\[
f_i=\bigoplus_{j\in son_i} f_{j}\times seed+size_j
\]
通过换根可以求出以每个点为根的\(f\)值,将\(A,B\)树分别哈希并将\(A\)中的每个哈希值丢到set中,如果有\(B\)中有一个叶节点的父亲去掉(xor)对应叶节点的\(f\)值后这个哈希值不在这个set中,说明对应的叶节点就是那个多余的点。
扭动的回文串
单独存在于\(A,B\)串中间的回文串可以直接\(\text {manacher}\)求出,考虑“扭动”形成的回文串。
枚举回文中心,因为“扭动”的回文串,必然在\(A\)或\(B\)中对应有一个最长的回文串,这是\(\text{manacher}\)就已经求出来了的,再用二分+哈希把两串拼一起所形成的新串能够再拓展的最大长度弄出来即可。
灯塔
其实就是要你对于每一个\(i\)求出\(p_i=\lceil\max\limits_{j}(a_j-a_i+\sqrt{|i-j|})\rceil\)。
有一种做法就是对于每个\(i\),\(\sqrt{|i-j|}\)的取值不超过\(\sqrt n\)个,而且对于每个\(i\)和某个取值\(x\),所对应的\(j\)一定在一段或两端连续的区间中,可以用st表查询最大的\(a_j\),复杂度\(O(n\sqrt n)\)。
另外一种做法只考虑\(j<i\)的情况,之后通过\(\text{reverse}\)求出\(j>i\)的情况,而可以发现决策点具有决策单调性,用决策单调性优化可以做到\(O(n\log n)\)。
位运算
假设我们选出来的数\(A_1,A_2...A_N\)满足,\(A_0> A_1\geq A_2...\geq A_N\),其中为了方便我们令\(A_0=R\)。
考虑状压这\(N+1\)个数的大小关系,那么状态\(s\)有\(N\)位,每一位\(0/1\)表示\(A_i(>\text {or}=) A_{i+1}\),设\(f_{i,s}\)表示当前从高往低考虑到第\(i\)位大小关系为\(s\)的方案数,枚举当前位的填数情况\(t\)可以进行转移,而对于每个循环的转移时一样的,处理完一个循环的情况后可以矩阵快速幂求出方案数。
炸弹攻击
这题比较玄学,网上所查得到的大部分题解说是模拟退火实则爬山算法。
就直接按照随机化的方法\(\text{rand}\)一个移动向量看是否更优即可,温度、温度变化量、eps以及一些退火中的tricks网上都有,这里不再赘述。
飞机调度
首先可以想到\(\text{floyd}\)求出任意两点之间的最短路,因为存在维修时间所以要将\(dis_{i,j}\)设为\(g_{i,j}+p_j\)。
假设某一趟航班\(i\)从\(x_i\rightarrow y_i\),时间由\(s_i\rightarrow t_i(t_i=s_i+T_{x_i,y_i}+p_{y_i})\),那么对于航班\(j\),如果想让\(i,j\)共用一趟飞机则必须满足\(t_i+dis_{y_i,x_j}\leq s_j\)。
我们将\(i\rightarrow j\)连一条边,发现整张图一定是个DAG,直接跑最小路径覆盖即可。
无界单词
首先考虑第一问,设\(f_i\)表示长度为\(i\)的\(|border|=0\)的串的个数。
我们考虑容斥,减去\(|border|>0\)的情况,因为如果\(|border|\geq \lceil\frac i2\rceil\),那么可以减去中间公共部分变成\(<\lceil\frac i2\rceil\)的情况,所以有
\[
f_i=2^i-\sum_{j=1}^{\lfloor\frac i2\rfloor} f_j\times 2^{i-2j}
\]
对于第二问考虑二分,则问题实际上变为求前缀为\(s\)时的\(f_i\)。
显然有\(f_i=[前i个字符无border],i\leq |s|\)。
对于\(i>|s|\),则分类讨论之:
首先有
\[
f_i=2^{i-|s|}-\sum_{j=1}^{\lfloor\frac i2\rfloor}f_j\times c_{i,j}
\]
其中\(c_{i,j}\)表示系数,有:
\[
c_{i,j}=
\begin{aligned}
\begin{cases}
2^{i-2j}&j\geq |s|\\
2^{i-|s|-j}&j+|s|\leq i\\
[s有长度为j+|s|-i的border]& \text{otherwise}
\end{cases}
\end{aligned}
\]
然后按照这种方法转移就好了。
轻重路径
首先可以用树状数组单点加、区间查询维护每个点的\(size\)。
考虑这一次我们删掉了叶子\(x\),那么对于\(x\)到根\(rt\)的路径,如果要满足上面的一个点\(u\)它要改变他由重变轻的话必有\(size_u\leq \frac {size_{rt}}2\),我们可以二分这个点,那么这样的话最多二分\(O(\log n)\)次。
判定一条边是否从重边变成轻边的依据是父亲的重儿子之前指向\(u\),同时删除节点后有 \(size_u+1=size_{another\_son}\),注意特判\(u\)是父亲子树最后一个节点的情况。
复杂度\(O(n\log ^3n)\)但是树状数组以及树剖、二分的常数都比较小,还有这题的思路感觉比较类似于CSP2019树的重心。
病毒感染
题目的意思是如果往左走就要把之前左边没治愈的治愈完。
那么整个过程可以分为若干个子段,每个子段治完子段中的所有村庄然后再回到该子段的起点继续治接下来的子段。
设\(f_i\)表示目前在\(i\)且\(1...i\)均治愈完毕的最小代价,转移的话枚举这个子段的起点:
\[
f_i=\min\limits_{j<i}\{f_j+[j\ne 0](s_n-s_j)+g_{j+1,i}+[i\ne n](i-j-1)(s_n-s_i)\}
\]
其中\(s\)为前缀和\(g_{i,j}\)为\(i\)走到\(j\)再回到\(i\)所花费的最小代价。
考虑\(g_{i,j}\)由\(g_{i+1,j}\)转移过来,枚举\(i\)在不在当时治愈有:
\[
g_{i,j}=g_{i+1,j}+\min\begin{cases}3a_i(j-i)+(s_n-s_i)+2(s_n-s_j)\\2(s_n-s_i)+(s_n-s_j)\end{cases}
\]
然后就可以dp了。
反质数序列
考虑到奇数和奇数、偶数和偶数之间不可能为质数,那么所有元素就构成了一个二分图。
其中奇、偶之间如果是质数的话就连一条边,答案就是最大独立集也就是\(|\mathbb V|-\)最大匹配,注意\(1\)选的个数不能超过\(1\),所以\(1\)只要保留一个。
炸弹攻击2
考虑枚举每一个发射源,算出每个发射源的贡献。
将这个发射源作为原点,将其他除了发射源之外的点放一起极角排序,因为题目保证所有敌人都在己方单位上面,所以答案就是两个极角不超过\(\pi\)的激光塔之间所夹的敌人数,又因为这题实际上是个环的结构,所以需要断环为链+前缀和维护。
JSOI部分题解的更多相关文章
- JSOI Round 2题解
强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programme ...
- [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)
[BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...
- [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)
[BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...
- 【jsoi】第一季 [略]精简题解
UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题. 精简题解系列第四弹.(其实也不是那么精简啊= =) [JSOI2008]最大数maxnumber 单点修改,区间最大值查询,裸线段树 ...
- 2015 JSOI冬令营训练 彩色格子 题解
解析 棋盘上黑白格染色.曼哈顿距离偶数:奇偶性相同. 枚举有几种颜色分到白格,组合数计算即可. 注意预处理,时间还是比较宽裕的. 为了不重复计数,考虑枚举严格用了i种颜色,我们再枚举分配j种给白集合. ...
- 2786: [JSOI]Word Query电子字典
2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Statu ...
- JSOI2015 一轮省选 个人题解与小结
T1: 题目大意:现有一个以1为根节点的树,要求从1开始出发,经过下面的点然后最终要回到根节点.同时除了根节点之外各点均有一个权值(即受益,每个点上的收益只能拿一次,且经过的话必须拿),同时除了根节点 ...
- 1819: [JSOI]Word Query电子字典
1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 729 Solved: 238[Submit][S ...
- 贪心(qwq)习题题解
贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...
随机推荐
- Spring Cloud服务注册中心交付至kubernetes
前言 服务发现原则: 各个微服务在启动时,会将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息 服务消费者可以从服务发现组件中查询到服务提供者的网络地址,并使用该地址来远程调用服务 ...
- Docker三剑客之swarm
简介 swarm是一种docker集群管理工具,跟三剑客前两者不同的是:compose是一种统一编排的工具,machine是一种远程控制工具,swarm则是将多个docker主机映射成一个docker ...
- TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?
引 言 这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式.TLS,安全传输层协议,是用于保护网络通信的加密协议.它是目前已经弃用的安全套接层(SSL)的继任者. 你可以从本 ...
- C语言I作业1
1 你对软件工程专业或计算机科学与技术专业了解是怎样的? 软件工程顾名思义就是工程化的方法生产软件的一门学科.涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面. 2 你了解c语 ...
- Request和Session的生命周期
request的生命周期是request请求域,一个请求结束,则request结束 session的生命周期是session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当sessi ...
- shell命令之一天一见:grep
一. 简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 ...
- WeChall_Training: Get Sourced (Training)
The solution is hidden in this page Use View Sourcecode to get it 解题: 网页源码,最后一行 <!-- You are look ...
- Element ui select 同时获取value和label的值
html <el-form-item label="单位名称" prop="checkInUnitName"> <el-select v-mo ...
- Scala 学习(10)之「集合 」
数组 定长数组 Array:采用()访问,而不是[],下标从 0 开始. val array1 = new Array[String](5) //创建数组 println(array1) //返回数组 ...
- Android Spinner 下拉框简单应用 详细注解
目录 Android Spinner 代码部分 Spinner代码介绍 核心代码 说在最后 @ Android Spinner Spinner 提供下拉列表式的输入方式,该方法可以有效节省手机屏幕上的 ...