二元结构

HNOI2019 简要题解

谁都会走 提交于 2019-12-17 10:20:30
HNOI 2019 简要题解 没想到自己竟也能有机会写下这篇题解呢。 LOJ Luogu Day1T1 鱼 枚举 \(AD\) 两点后发现 \(BC\) 与 \(EF\) 相对独立,因此只需要计算合法的 \(BC\) 对数与 \(EF\) 对数,相乘即可。 先考虑计算 \(EF\) 的对数。确定 \(AD\) 后,满足条件的 \(EF\) 对数即为在某个半平面内与 \(D\) 点距离相等的点对数目。枚举 \(D\) 后若乱序枚举 \(A\) ,则需要再 \(O(n)\) 地处理 \(A\) 确定的半平面内的合法点对数目。可以按照极角序枚举 \(A\) ,并用单点指针确定半平面的范围,即可在总计 \(O(n^2)\) 的时间复杂度内解决这部分问题。 再考虑计算 \(BC\) 的对数。发现 \(AD\) 对 \(BC\) 的限制很强,直接限定了 \(BC\) 的斜率(或言之方向向量,因为有可能斜率不存在)以及中点坐标,因此可以考虑直接 \(O(n^2)\) 预处理出所有 \(BC\) 点对,每次查询时只需要在对应的值上二分找出范围限制即可。总时间复杂度 \(O(n^2\log n)\) 。 具体实现上,根据“与向量 \((a,b)\) 点积相同的点在一条垂直向量 \((a,b)\) 的直线上,与向量 \((a,b)\) 叉积相同的点在一条平行向量 \((a,b)\) 的直线上”

10.1代数结构

天涯浪子 提交于 2019-12-04 13:40:40
代数结构(Mathematical Structures) 定义:具有在对象上定义操作的对象集合及其附带属性构成代数结构或代数系统。(Note:这里我们只处理离散的代数结构) 如:[sets, ∩, ∪, -]; [ 3 × 3的矩阵, +, *, T]等 二元运算(Binary operation) 定义:对两个对象进行操作的运算称为二元运算 封闭律(Closure) \(设集合S有二元运算 * ,若对S中的任意两个元素a_1、a_2,都有:a_1 * a_2 ∈ S,则称运算 * 对集合S封闭\) 交换律(Commutative) \(交换律也称为阿贝尔律(Abel律),设有代数(S, *),若对任意a_1,a_2∈S,都符合等式:a_1 * a_2 = a_2 * a_1, 那么称代数(S, *)运算符合交换律\) \(容易得到:若(S, *)运算符合交换律,那么对于运算序列a_1*a_2*...*a_n,设θ(12...n)为任意重排列,那么有:\) \(a_{θ(1)}*a_{θ(2)}*...*a_{θ(n)} = a_1*a_2*...*a_n\) 结合律(Associative) \(结合律也称为卡特兰律(Catalan律),设有代数(S, *)对任意a_1,a_2,a_3∈S,都符合等式:(a_1*a_2)*a_3=a_1*(a_2*a_3)\) , 则称代数(S

10.1代数结构

风格不统一 提交于 2019-12-04 04:36:53
代数结构(Mathematical Structures) 定义:具有在对象上定义操作的对象集合及其附带属性构成代数结构或代数系统。(Note:这里我们只处理离散的代数结构) 如:[sets, ∩, ∪, -]; [ 3 × 3的矩阵, +, *, T]等 二元运算(Binary operation) 定义:对两个对象进行操作的运算称为二元运算 封闭性(Closure) \(设集合S有二元运算 * ,若对S中的任意两个元素a_1、a_2,都有:a_1 * a_2 ∈ S,则称运算 * 对集合S封闭\) 来源: https://www.cnblogs.com/SpicyArticle/p/11831524.html

同步之sync.Mutex互斥锁

北战南征 提交于 2019-11-30 17:48:03
同步之sync.Mutex互斥锁 sync包中定义了Locker结构来代表锁。 type Locker interface { Lock() Unlock() } 并且定义了两个结构来实现Locker接口:Mutex 和 RWMutex。 我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量。一个只能为1和0的信号量叫做二元信号量(binary semaphore)。使用二元信号量实现互斥锁,示例如下, var ( // 一个二元信号量 // 缓存为 1 的channel sema = make(chan struct{}, 1) // a binary semaphore guarding balance balance int ) func Deposit(amount int) { // 存钱的时候需要获取一个信号量,以此来保护变量 balance sema <- struct{}{} // acquire token balance = balance + amount <-sema // release token } func Balance() int { sema <- struct{}{} // acquire token b := balance <-sema // release token return b