题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没有匹配. 转移时注意一个车站可以有多个左括号和右括号,如果选多个类似无限背包顺着倒着递推一遍即可. 复杂度 \(O(n^2)\) 代码 代码链接…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直往最短路上面想,然后怎么想发现都没有用. 然后就又开始自闭了.最后又去拜读题解了.(今天怎么读了两次题解啊,没救了没救了 一条合法的路线一定是从 \(0\) 到 \(n + 1\) 的链上套了无数个环.每一个邮戳台至少被一个环经过. 经过邮戳台的方式有 \(4\) 类: 上行 -> 邮戳台 ->…
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可. code: #include <cstdio> #include <string> #include <vector> #include <queue> #include <algorithm> #define N 100006 #define…
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话连边一定不是优秀的(一定会有一种都在管辖范围之内的连边方式来代替这种连边方式) 然后由于每一个点只属于一个城市的管辖范围,所以每个点只会扩展一次,这个 BFS 的复杂度是线性的. code: #include <bits/stdc++.h> #define N 2006 #define M 200…
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一个定点,然后把其它所有点按到这个定点的极角排序,那么就可以\(O(n^2)\)得出答案了 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define inline __inline__ __a…
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得\(sumA_{x_{j}} + sumB_{j} \leq T_{j}\) 然后我们相当于从\((0,0)\)走到\((n,m)\)一条路径,如果\(i,y_{i}\)在路径上或路径上方,那么就加上\(P_{i}\),如果\(x_{j},j\)在路径上或路径下方,就加上\(Q_{j}\) 我们加上…
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个,区间中最小的可用天线值,区间中最大的可用天线值 \(i\)可以被\(j\)用到,那么\(j\)在\([i + A_{i},i + B_{i}]\)中,我们枚举右端点的时候,假如到了\(i + A_{i}\)就把\(i\)标记为可用,如果到了\(i + B_{i} + 1\)就把\(i\)标记为不可用…
「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序,依次提高终点的时间,然后跑dijkstra(记得把访问标记回滚清空掉). 每条边被跑过了就不再跑了.可以用set,也可以vector(排序,记当前在第几条边) #include <bits/stdc++.h> #define rep(q, a, b) for (int q = a, q##_end…
「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加,删点即可. 子任务4 目前可以支持在\(o(log(n) )\)的时间里动态加,删单点了. 容易想到莫队. 直接用multiset维护复杂度\(o(n \sqrt n log(n))\).(一脸不可过) 稍微优化一下 ​ 若使用cnt记录的话,是没法很好的删点的. ​ 对于目前要处理的块\([l,r…
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高)就不做,因为如果提前做了,可能会导致后面要浪费一些步数使得移动合法.然后这个移动过程就会分成两段,先是一直移动或者下降,不用上升,然后会每次上升再移动,一直到终点 先看前一段的移动,如果移动的时候正好能移到下一棵树就直接移,如果移的时候高度过高就往下移一点直到能正好移动到下一棵树上.这里对每个点记\…