黑书笔记

就从P77开始记好了.(稍微扩容)

P77

排序.

1.香农信息论

基于比较的排序不可能突破O(nlogn)的复杂度限制.
1) 比较一次可以得到一个bool量,最大信息熵为$\log_2{2}=1.0$bit
2) 全排列的个数是$n!$级别的,唯一地确定一个全排列需要$O\left(\log_2{n!}\right)=O(n\log{n})$bit的信息熵
3) 因此比较的次数不可能少于$O(n\log{n})$级别.

2.实数比较的$O(n\log{\log{n}})$时间算法.

这个的资料我没有找到,如果有谁找到了请告诉我.我只找到了两三篇整数排序的论文.

1) 时间复杂度$O(n\log{\log{n}})$,链接: http://pan.baidu.com/s/1i3vhA0P 密码: atfv
2) 期望时间复杂度$O(n\sqrt{\log{\log{n}}})$,链接: http://pan.baidu.com/s/1jGmYdSi 密码: irxb
UPD: 第三篇
3) 时间复杂度$O(n\log{\log{n}})$,$O(n)$,Parallel,...,空间复杂度$O(n)$,链接: http://pan.baidu.com/s/1qWkJVGw 密码: qmca
(神级论文)

(论文地址请不要转载,谢谢.)

整数的排序可以使用vEB树,也可以使用一种据2)中说的"简单"的算法3).

P78

1.POI

Polish Olympaid in Informatics

避免邪教污染,这里给出了地址.

P87

1.并查集删除一个元素

我们对于每个并查集节点设置一个Disabled属性即可.

当删除一个节点时,将它的Disabled属性设置为true,并重新建立一个节点,将原节点查找指针指向新节点.($O(1)$)

如果删除的是root,我们遵循Lazy updating的原则;在第一个访问到root是一个Disabled节点时将这个root的father指向这个节点,把这个节点设置为新的root即可.($O(1)$)

2. 1.4.2 & 1.4.3

1.4.2) 没试过...
1.4.3) 这个均摊时间复杂度是错误的,因为它无法保证k的大小,当n=1时,假设原数字是$2^{k-1}-1$,此时的操作时间复杂度为$O(k)=O(kn)$.均摊复杂度需要对于任意操作序列都有$T(n)=O(n)$,而显然长度为1的操作序列也是合法的,但是此时不成立,因此均摊分析是错误的.

3.穿线森林

我们可以对每一棵堆建立一个链表,然后启发式合并.这个很简单的,有一篇大学的讲稿:链接: http://pan.baidu.com/s/1sjE4jA9 密码: c8n3

4.POI窗户

因没有数据范围,仅提供思路.

我们将顶点坐标排序,用根离散化的扫描线处理.在处理前我们要先在通过窗户上下界的与上下界垂直的线段的垂足上加点,以处理边界情况.从上界往下界(或反过来),边扫描边合并矩形.到另一个界的时候查看下有几个联通块即可.

P88

1.CEOI1999 奇数偶数

这个专题是并查集,那么往并查集的方向去想.

那么这道题就是用并查集维护奇偶性数据,并动态合并.动态合并是一个难点,但也不是不可以解决.方法很简单,我们把闭区间转化为半开半闭区间就可以无压力地合并了.

A) 如果两个端点都是同一个联通块的端点,那么他们的奇偶性已经可以直接用异或运算查询出来.
B) 如果两个端点不是同一个联通块,就把小的联通块并入大的那个,并修改小的的奇偶性以吻合.

那么通过一个$O(1)$的merge操作怎么能保证A)中的性质呢?还是Lazy updating,方法是边路径压缩边以父亲节点为准更新.为什么这样做是正确的?我们的题目要求尽量处理前面的序列,中间不能断开,也就是现有的状态其实都是合法的.那么最后更新的节点肯定是根节点,那么我们只需要查询时Lazy地保持与根节点不冲突即可.

我们可以非常方便地维护奇偶性,只需要异或运算.

P90

1.CEOI2003 赛车(the race)

1) 求逆序对数可以用树状数组解决.
2) 安利一下好写的二项堆.
3) 建议大神实现Rank-pairing Heap以增长RP.

2.可怜的奶牛

1) lrj的OIBH已经不在了.
2) 这道题是按模n同余类分块牛分别处理每日产量最少牛.

P92

1) 待理解:prefixless语言.

时间: 2024-10-23 03:03:21

黑书笔记的相关文章

黑书例题 Fight Club 区间DP

题目可以在bnuoj.soj等OJ上找到. 题意: 不超过40个人站成一圈,只能和两边的人对战.给出任意两人对战的输赢,对于每一个人,输出是否可能是最后的胜者. 分析: 首先序列扩展成2倍,破环成链. dp[i][j]表示i和j能够相遇对打,那么dp[i][i+n]为真代表可以成为最后胜者. 枚举中间的k,若i和j都能和k相遇,且i和j至少一人能打赢k,那么i和j可以相遇. 复杂度o(n^3) 1 #include<cstdio> 2 #include<cstring> 3 usi

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

黑书之1.2.6:离散数学

题目描述: 有一个函数,它的定义域:1 to N(2<=N<=100000),值域f(n)为long int(in C++)(最后证明在-2^31—2^31).要求函数上的两个点a,b使得当x∈(a,b)函数f,在直线ab的下方,并且要求ab的倾角最大. 根据黑书所说,O(n^2)的算法确实是很容易相出,但是存在一种O(n)算法.想了许久都不能明白,中间确实想到过最终的解法,但是没有仔细想,故没有证明其正确性,最终没有相处此题. 根据网上的同道中人所述,写出算法: 从左到右扫描,O(n)的时间

effective java-读书笔记-第三章 对于所有对象都通用的方法

个人博客同步发布:effective java-读书笔记-第三章 对于所有对象都通用的方法 第三章 对于所有对象都通用的方法 所有非final方法(equals.hashCode.toString.clone.finalize)都有明确的通用约定,因为它们被设计成是要被覆盖的,如果不遵守,基于散列的集合(HashMap.HashSet.HashTable)可能无法结合该类一起运作. 第8条 覆盖equals时请遵守通用约定 覆盖equals规范: 自反性(reflexive).对于任何非null

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

黑书贪心例题之钓鱼 poj1042:Gone Fishing

总时间限制: 2000ms 内存限制: 65536kB 描述 John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachable along a single, one-way road. John starts at lake 1, but he can finish at a

设计模式看书笔记(5) - 三种工厂模式比较

先看三种工厂模式部分主要代码(完整代码在前三篇博客): 简单工厂模式: public class SampleFactory { public static Animal createAnimal(String animalName){ if("Tiger".equals(animalName))){ return new Triger(); }else if("Dolphin".equals(animalName)){ return new Dolphin();

黑书练习题 更新中

1.4.7 奇数偶数 POJ 1733 Parity game 2.5.26 Unix 插头 POJ 1087 A Plug for UNIX 黑书练习题 更新中

易学设计模式看书笔记(7) - 代理模式

代理模式 1.系统日志记录的例子:给系统中的业务逻辑加上日志 (1):最简单直接的做法 public class Test { private Logger logger = Loger.getLogger(this.getClass().getName()); public void doLgic(String name){ logger.log(name + "开始业务逻辑处理..."); //业务逻辑处理相关程序 System.out.println("业务逻辑处理相关