题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(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…
首先突破口肯定在三角形不交,考虑寻找一些性质. 引理一:两个三角形不交当且仅当存在一个三角形的一条边所在直线将两个三角形分为异侧 证明可以参考:三角形相离充要条件,大致思路是取两个三角形重心连线,将其中一个三角形延重心连线平移两三角形总会相交,同时也能根据相交情况找到一条这样的直线. 引理二:若三角形任意三点不共线,则两个三角形不交当且仅当存在两条内公切线 根据引理一,将所得到的直线平移并旋转一定能得到两条内公切线. 直接借助引理一不好将问题分割,考虑利用引理二. 注意到一对不相交的三角形公切线…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个生日蛋糕.虽然他计划买一整个蛋糕,但是他不小心订成了 N 块蛋糕.这 N 块蛋糕编号为 1\ldots N ,每块蛋糕都有价值和颜色.第 i 块蛋糕的价值为 V_i ,颜色深度为 C_i . 为了做成一整块蛋糕,他决定选择 M 块互不相同的蛋糕,然后将它们按一定顺序排成一个环.整块蛋糕的美观程度定义…
这种图论问题都挺考验小思维的. 首先,我们把从 $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…
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没有匹配. 转移时注意一个车站可以有多个左括号和右括号,如果选多个类似无限背包顺着倒着递推一遍即可. 复杂度 \(O(n^2)\) 代码 代码链接…
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…