首页 > 其他分享 >JOISC 2020 题解

JOISC 2020 题解

时间:2023-05-31 19:24:20浏览次数:92  
标签:ac submission 题解 复杂度 JOISC2020 JOISC 2020 https qoj

JOISC2020 Day1 建筑装饰4 Building4

我们发现 \(A\) 的个数是连续的,所以我们只需要 DP 出最大的 \(A\) 的个数和最大的 \(B\) 的个数,若两者都 \(\ge n\) 那么就有解。然后再从后往前推出方案即可。

https://qoj.ac/submission/109314

* JOISC2020 Day1 汉堡肉 Hamburg Steak

我们有一些边界,最小的 \(r\),最大的 \(l\),最小的 \(u\),最大的 \(d\),那么我们一定可以用一种方法,使得每一个边界都被覆盖到。对于 \(K\le 3\),则必然存在一个点位于两个边界的交点处,于是可以直接暴力枚举,复杂度 \(O(4^kN)\)。

现在考虑 \(K=4\) 如何做。上面的方法不再适用,但是我们可以考虑每个边界上选择的点的位置。先把这四个边界围成一个大矩形。对于一个矩形,若它和大矩形的交点数量 \(>2\),那么可以发现它无论怎样都会被覆盖到。若数量 \(=1\),那么相当于就是限定一条边上的选点的位置位于一个区间。若 \(=2\),那么就是限定两条边中至少有一条边,上面的点位于某个区间内。这个限制可以用前缀优化建图的方式。由于离散化复杂度 \(O(n\log n)\)。

https://qoj.ac/submission/110040

* JOISC2020 Day1 扫除 Sweeping

考虑没有插入点的情况:每个操作都可以变成这样的形式,举往右扫为例:\(x\in[p_l,n-l]\),\(y\in [0,l]\),\(x\leftarrow n-l\)。这个 \(p\) 是往上扫覆盖到的最大的 \(l+1\)。于是考虑动态维护向右扫需要用的 \(p_i\),以及向上扫需要用的 \(q_i\),每次横着扫会对 \([p_l+1,n-l-1]\) 的 \(q\) 进行对 \(l+1\) checkmax 的影响。求出这些 \(p,q\) 后这些操作就分开了,横竖扫各不影响。对于一批向右扫的操作,我们对它进行排序,然后把这些询问也排序后一起处理。

考虑有插入点的情况:每个问询相当于可以变成,对于初始 \((x,y)\),经历了一个区间的操作后,会变成什么坐标。考虑线段树分治,线段树每个节点都暴力处理出真实问询,把挂在上面的节点给处理掉。复杂度两只 log。

https://qoj.ac/submission/109633

* JOISC2020 Day2 变色龙之恋 Chameleon's Love

对于 \(i,j\),若 \(\{i,j\}\) 的答案为 \(1\),那么要么它们是单相思关系,要么是同色。考虑把这两种关系一起建边。那么一个点的出度为 \(1\) 或 \(3\),如果是 \(1\) 那么必然为同色,如果是 \(3\) 那么必然有两个单向关系,可以通过 \(2\) 次问询确定 \(u\) 喜欢的对象,然后所有单向确定了就可以确定其它所有的同色关系了。

如果原图是二分图那么是简单的,可以直接对另一边的集合二分。但是现在并不是如此,但是实际上我们考虑从小往大考虑,每次我们其实需要只考虑前 \(i-1\) 个点形成的二分图关系就可以问出 \(i\) 和 \([1,i-1]\) 的边了。然后就结束了。

https://qoj.ac/submission/110133

JOISC2020 Day2 有趣的 Joitter 交友 Making Friend on Joitter is Fun

对于互相关注的两个点,我们把它合并起来,最终形成一些块,令 \(F_x\) 表示块 \(x\) 的前驱的点集合,\(S_x\) 表示块 \(x\) 的点集合那么答案就是块内任意连边的边数,加上 \(\sum |F_x||S_x|\)。我们每次按 \(|S_x|\) 合并,根据启发式合并的那一套理论,无论什么集合只要遍历更新 \(|S_x|\) 小的那个复杂度就是对的,所以 \(F_x\) 也可以直接合并。但是现在问题是我们要判断两个块之间有没有边,所以还需要维护 \(G_x\) 表示块 \(x\) 的前驱块集合,\(H_x\) 表示块 \(x\) 的后继块集合,这两个也是好合并的。最后一个问题是可能合并 \(x,y\) 时会有一些新的可合并的集合对,具体而言,满足 \(z\in H_x\cap G_y\) 或 \(z\in G_x\cap H_y\) 的 \((z,x)\) 也应该被合并。所以每次暴力找 \(z\),然后加入更新队列即可。复杂度不会严谨证明,但是就是对的,\(O(n\log^2 n)\)。

https://qoj.ac/submission/109344

* JOISC2020 Day2 遗迹 Ruins 3

考虑改变题目描述的过程,从按值域从大到小变成从后往前考虑。那么我们相当于每次维护一个 bool 数组,然后每次找到 \(\le h_i\) 的最小的零位置 \(p\),将数组的 \(p\) 位置设为一。但是实际上,影响一个柱子最后是否存活只依赖于这个 bool 数组的极长前缀一的长度。考虑进行 DP,\(f_{i,j}\) 表示对于后缀 \([i,2n]\),数组的极长前缀一的长度为 \(j\)。令 \(c_i\) 表示 \([i+1,2n]\) 的没存活的个数,\(d_i\) 表示存活的个数。

考虑转移。如果这个位置最终没有存活,那么只能填 \([1,j]\) 中的数。但是这 \(2j\) 个数中一定有 \(j+c_i\) 个数已经被用掉了。剩下的数中有的数是重复出现的,我们不想处理这些东西,于是就考虑把每个数的两次出现区分开来,最后再乘上 \(2^{-n}\) 即可。所以没有存活的转移就是 \(f_{i,j}=f_{i+1,j}\times (j-c_i)\)。然后如果这个位置最终存活了,如果连续段没有变长就直接 \(f_{i+1,j}\),把这个贡献交给之后统计。

如果变长成为了 \(j'\),那么我们首先考虑第 \(i\) 个位置能填 \([j+1,j']\) 的数,且这些数一定有 \(j'-j-1\) 个数已经被用了,所以有 \(j'-j+1\) 种填法。然后我们从剩下的还没填的 \(d_i-j\) 个位置中选出 \(j'-j-1\) 个数,让这些数形成长度为 \(j'-j-1\) 的连通块。考虑设这个为 \(g_{i,j}\) 表示 \(i\) 个位置填出 \(j\) 个数的连续段,这个需要每时每刻保证 \(i\ge j\),转移枚举 \(j\) 填了几个即可。复杂度 \(O(n^3)\)。

https://qoj.ac/submission/110098

JOISC2020 Day3 星座 3 Constellation 3

把整张图反过来,\(a_i=n-a_i+1\),\(y=y-n+1\) 这样,那么我们就每次找到区间 \(a_i\) 最小的地方,于是区间中 \(\le a_i\) 的只能有一颗星星。递归左右部分,然后假设左边保留的星的纵坐标 \(\ge a_i\) 的最大总和为 \(S_l\),右边的为 \(S_r\),那么就用左侧的 DP 值 \(+S_r\) ,和右侧的 DP 值 \(+S_l\),以及选择第 \(i\) 列上的星星 \(+S_l+S_r\) 来更新。线段树合并就可以维护了。

https://qoj.ac/submission/109499

JOISC2020 Day3 收获 Harvest

考虑人不懂,苹果动。令第 \(i\) 个人逆时针走 \(C\) 后遇到的人为 \(to_i\),那么苹果一定是走到后面的一个人然后不断跳 \(to_i\)。\(to\) 会形成一个基环树,于是树上的点就可以用线段树合并来处理。然后处理环,令人 \(i\) 在环上的位置为 \(x_i\),环上边权和为 \(L\)。然后对于苹果 \(i\),令它第一个走到的环上点为 \(u_i\),时间为 \(t_i\),那么问询 \((v,T)\) 的答案为 \(\sum_j [t_j\le T](\lfloor\frac{T-x_v-t_i+x_i}{L}\rfloor+[x_v\le x_{u_i}])\)。把这个下取整拆开,拆成两个下取整相加,加上一个关于模 \(L\) 余数的二维数点,就可以单 log 做完了。代码较为复杂。

https://qoj.ac/submission/109571

JOISC2020 Day4 首都城市 Capital City

考虑点分治,每次考虑分治连通块内的,经过分治中心的首都长什么样。如果遇到了需要跑到连通块外的颜色,那么就直接不合法。否则直接暴力进行 BFS,于是每个点在一次分治中只会被访问一次,复杂度 \(O(n\log n)\)。

https://qoj.ac/submission/109728

JOISC2020 Day4 治疗计划 Treatment Plan

考虑做如下的转化:对于计划 \(i,j\) 满足 \(t_i\le t_j\), 若 \(r_i-(t_j-t_i)\ge l_j-1\),那么连边 \(i\to j\);同样的,若 \(l_i+(t_j-t_i)\le r_j+1\),那么连边 \(j\to i\)。然后 \(l=1\) 的和源相连,\(r=n\) 的和汇相连,那么我们就转化成了一个最短路的模型。然后上述的条件都可以用主席树优化建图,然后再 dijkstra 最短路。

下面分析一下复杂度。首先考虑本题只有点有点权,而这样的图跑 dijkstra 复杂度是 \(O(|V|\log |V|+|E|)\) 的,因为一个点只会被松弛一次。其次,注意到实际上我们只有 \(n\) 个点,即代表原区间的点是有点权的,其他点都是零权的。对于零权的点,我们开一个 queue 维护目前松弛到的零权点,一个堆维护有权点,每次清空 queue 之后再看堆中的点,复杂度就变成了 \(O(n\log n)\)。

https://qoj.ac/submission/109856

标签:ac,submission,题解,复杂度,JOISC2020,JOISC,2020,https,qoj
From: https://www.cnblogs.com/TetrisCandy/p/17447093.html

相关文章

  • CSP-J 2020 普及组讲解
    CSP-J2020T1优秀的拆分题目的本质是求\(n\)的二进制表示。求\(n\)的二进制表示,或者每次暴力分解出小于等于\(n\)的最大的\(2\)的正整数次幂。时间复杂度\(O(\log{n})\)。T2直播获奖给定\(n\)个人的分数,对于每个\(i\),请你求出前\(i\)个人的第\(k=\max(1,......
  • 「题解」ABC292G Count Strictly Increasing Sequences
    没一眼看出来还是拉了。考虑区间dp,\(f_{i,l,r}\)表示\([l,r]\)前\((i-1)\)位都相同,看后面\([i,n]\)位填数使得递增的方案数是多少。这样已经可以做了,但是还不够,要追求一下最简单的写法。想想,发现每次dp是要分为多个儿子乘起来,内部还要搞个dp。但可以改成每次两个儿子......
  • [TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数
    做什么法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数。这个SDK探幽日志主要是对目前SDK开发中遇到的一些问题做个记录,以及对未来开发的一些指导,只是在业余时间简单写写,之后还会深入探索......
  • CF6E Exposition 题解 ST表+倍增
    题目大意:求所有极差不超过\(k\)的最长连续子序列。解题思路:先开一个ST表方便求解区间最大值和区间最小值。然后基于倍增思想(详见cal函数)求极差不超过\(k\)的最长连续子序列。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;int......
  • Codeforces Round #548 (Div. 2) 题解
    题目链接http://codeforces.com/contest/1139 A.EvenSubstrings判断个位是否是奇数即可。#include<iostream>#include<set>#include<array>#include<vector>usingnamespacestd;typedeflonglongll;constintmx=1e5+10;lldp[mx][2];charstr[......
  • 牛客想开了大赛2 题解
    题目链接:https://ac.nowcoder.com/acm/contest/907#question A.【六】平面公式:(n*n+n)/2+1,n为直线数目B.【一】n的约数枚举质因子和每个质因子的个数,显然个数肯定从多到少。#include<bits/stdc++.h>typedeflonglongll;usingnamespacestd;constintmx=1e4+10;in......
  • Codeforces Round #594 (Div. 2) 题解
    题目链接:https://codeforces.com/contest/1248 A-IntegerPoints水题#include<bits/stdc++.h>usingnamespacestd;constintmx=1e5+5;typedeflonglongll;inta[mx],b[mx];intmain(){ intt; scanf("%d",&t); while(t--){ intn,m; scan......
  • Codeforces Round #599 (Div. 2) 题解
    题目链接:https://codeforces.com/contest/1243 A-MaximumSquare水题不说了#include<bits/stdc++.h>usingnamespacestd;constintmx=1e5+50;typedeflonglongll;intn;inta[mx];intmain(){ intt; scanf("%d",&t); while(t--){ scan......
  • 题解 AT_nikkei2019ex_e【コラッツ問題】
    啥玩意,诈骗题还能这么诈骗。\(f(X)\)就是角谷猜想(冰雹猜想)所需的步数。根据角谷猜想,定义函数\(g\):\[g(X)=\begin{cases}\frac{X}{2},&2\midX\\3X+1,&2\nmidX\end{cases}\]则显然有\(f(g(X))=f(X)-1\)。样例二已经给出了\(f(X)=1000\)的解\(X=1789997546303\),而\(P......
  • P9376 题解
    首先考虑怎么暴力。考虑把每个数进行\(B\)进制分解,然后我们惊奇的发现这两个操作就是把最低位去掉和往最低位后面插入一个数。然后我们顺藤摸瓜,把每个数的分解扔到Trie树上,我们发现我们要找到一个节点,使得所有单词节点到其的距离之和最短,答案就是这个最短距离。这里直接考......