每日一题:不相交线段的最小最大值
题意
在一维数轴上给出 $m$ 个线段,每个线段都都有 $l,r,w$ 三个数据代表这个线段的左右端点和这个区间权值。 从中取出若干个不相交的线段(区间端点可以共用),在覆盖满 $[1,n]$ 的情况下,取出的线段中 $权重的最大值]$ 最小能为多少?
Solution
$dp[i]$ 代表覆盖满 $[1,i]$ 最大权值最小为多少,然后按左端点从小到大枚举线段,就有 $dp[r_i]=min(dp[r_i],max(dp[l_i],w_i))$。
在一维数轴上给出 $m$ 个线段,每个线段都都有 $l,r,w$ 三个数据代表这个线段的左右端点和这个区间权值。 从中取出若干个不相交的线段(区间端点可以共用),在覆盖满 $[1,n]$ 的情况下,取出的线段中 $权重的最大值]$ 最小能为多少?
$dp[i]$ 代表覆盖满 $[1,i]$ 最大权值最小为多少,然后按左端点从小到大枚举线段,就有 $dp[r_i]=min(dp[r_i],max(dp[l_i],w_i))$。
给你两组点,其中第一组中有 $size1$ 个点,第二组中有 $size2$ 个点,且 $size1 >= size2$。
任意两点间的连接成本 $cost$ 由大小为 size1 x size2 矩阵给出,其中 $cost[i][j]$ 是第一组中的点 $i$ 和第二组中的点 $j$ 的连接成本。如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点是连通的。换言之,第一组中的每个点必须至少与第二组中的一个点连接,且第二组中的每个点必须至少与第一组中的一个点连接。
返回连通两组点所需的最小成本。
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
先举例说明并发操作数据库可能出现的问题:
产生并发不一致性问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
隔离级别:
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。MySQL的默认隔离级别就是Repeatable read。
数据库的隔离级别可以解决大多数问题,但是灵活度较差,为此又提出了悲观锁和乐观锁的概念。
悲观锁:对外界修改数据持保守态度。认为外界会修改数据。具有强烈的独占和排他特性。悲观锁的实现往往依靠数据库提供的锁机制。
适合于写操作多的情况,为数据安全提供保障,但因为加锁也降低了效率,增加了产生死锁的机会,降低了并发性。
乐观锁:假设认为数据一般情况下不会造成冲突,在提交的时候才去判断是不是存在冲突。如果发现冲突了,则返回用户错误的信息,让用户决定如何去做。适合于读操作多的情况,较好的实现了并发性。
乐观锁的实现一般有两种方式:
数据库索引是为了增加查询速度而对表字段附加的一种标识,可以认为是数据库的目录。
优点在于查询速度快,但增删改慢,因为要去同步维护索引文件。
B树和B+树的区别:
索引使用的数据结构还有哈希索引,底层就是哈希表,只包含哈希值和指针,只支持等值比较查询,不能用于范围查询,因为哈希值是无序的。
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行。
表级锁:粒度最大的锁,对整张表加锁,实现简单,资源消耗少,触发锁冲突概率最高,并发度最低。
行级锁:粒度最小的锁,只针对当前操作的行进行加锁,大大减少数据库操作的冲突,并发度高,但加锁的开销也很大。
数据库语句执行很慢,可能迟迟拿不到锁,或者是没有使用索引或者选错索引。
是一种实现并发控制的方法,用更好的方式去处理读写冲突。
当前读:想select lock in share mode,select for update;这些操作都是一种当前读,因为它读取的是记录的最新版本,还要保证其它并发事务不能修改当前记录,会对读取的记录进行加锁。
快照读:
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。
CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码。与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来解决此问题。
首先检查是否安装CMake,在终端输入cmake —version来检查,若显示未安装,可以使用sudo apt-get install camke ( ubuntu),或者brew install cmake (macos),windows直接去官网下载,来安装CMake。
给定一个 $m$ 个元素的集合,问 $1-n$ 中有多少个数能被集合中至少一个元素整除。$(n <= 1e9, m <= 20)$
容斥原理,二进制枚举集合的所有子集,求子集的 $lcm$,如果子集大小是奇数,则 $res += n / lcm$,否则 $res-= n / lcm$。
体积和价值可能为负数的01背包。
逆向思维,对于体积为负的物品,我们可以一开始就装进去,背包对应的进行扩容,物品的体积和价值也对应取反。这样在进行背包dp 的时候就代表移除这个物品,答案取最大值即可。
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。
前面提到过,语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。说到编译,大家肯定都知道,Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的实现的。Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。
从Java 7 开始,switch 开始支持 String。其实Java中的switch自身原本就支持基本类型。比如int、char等。对于int类型,直接进行数值的比较。对于char类型则是比较其 ascii 码。
Update your browser to view this website correctly.&npsb;Update my browser now