Jzoj4756 幻象

最近phantom得到了森の妖精的真传。

在他练功的时候, 每秒他的思绪中都有一定的概率浮现出奇♂异的幻象,持续x秒的幻象将产生x^2 的幻象值。

phantom练功发自真心,他想知道,在N秒内他期望产生的幻象值是多少。

比较裸的期望dp

设f[i]表示第i秒的期望幻象值

那么,f[i]=f[i-1]+a[i]*((l[i-1]+1)^2-l[i-1]^2)

其中l[i]是第i秒连续幻象秒数的期望

显然,l[i]=(l[i-1]+1)*a[i]

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1000010
using namespace std;
double a[N],f[N],g[N];
int main(){
	int n,x; scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		a[i]=x/100.;
		f[i]=(f[i-1]+1)*a[i];
		g[i]=g[i-1]+((f[i-1]+1)*(f[i-1]+1)-f[i-1]*f[i-1])*a[i];
	}
	printf("%.1lf\n",g[n]);
}

### 幻象读的定义与现象 在数据库事务中,**幻象读**(Phantom Read)指的是一个事务在执行期间对同一查询语句多次执行时,发现结果集的数量发生了变化。这种变化通常是由其他事务插入或删除了符合查询条件的数据行所引起的。具体来说,当一个事务首次执行查询时获取了一组数据,而在后续的相同查询中却得到了额外的行或者某些行丢失,这种现象被称为幻象读[^3]。 例如,在银行系统中,假设一个事务查询某个账户区间内的所有存款记录,并计算总金额。与此同时,另一个事务新增了一条符合条件的存款记录并提交。当第一个事务再次执行相同的查询时,会发现总金额增加了,而新增的记录就是所谓的“幻象”数据行。 ### 幻象读的影响 幻象读会对应用程序的逻辑一致性造成影响,特别是在涉及统计、报表生成等场景时。由于结果集的变化,可能导致业务逻辑的误判或错误决策。例如,在库存管理系统中,如果一个事务在两次查询之间未能检测到新添加的商品库存记录,则可能引发库存不足的误判,从而影响订单处理流程。 此外,幻象读还可能导致并发控制中的死锁问题,尤其是在使用不当的锁机制时。如果不加以控制,多个事务可能会相互等待对方释放资源,最终导致系统停滞。 ### 防止幻象读的方法 为了防止幻象读的发生,数据库提供了不同的隔离级别以及锁机制来保证数据的一致性: 1. **可串行化(Serializable)**:这是最高的隔离级别,它通过禁止事务并发执行的方式来完全避免幻象读。在这种模式下,事务按照顺序依次执行,确保每次查询的结果都是稳定的。然而,这种方式会显著降低系统的并发性能[^2]。 2. **Next-Key锁**:在MySQL等数据库中,可以通过使用Next-Key锁来解决幻象读的问题。Next-Key锁是一种组合锁,它结合了间隙锁(Gap Lock)和记录锁(Record Lock),能够锁定索引记录及其周围的间隙,从而阻止其他事务插入新的数据行。这种方法可以在不牺牲太多性能的前提下有效防止幻象读的发生。 3. **多版本并发控制(MVCC)**:虽然MVCC主要用于解决不可重复读的问题,但在某些实现中也可以辅助缓解幻象读的情况。通过维护数据的不同版本,事务可以看到一致性的快照,而不受其他事务修改的影响。 ### 示例代码 以下是一个简单的SQL示例,展示了如何通过设置事务隔离级别为`SERIALIZABLE`来防止幻象读: ```sql -- 设置事务隔离级别为 SERIALIZABLE SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 开始事务 START TRANSACTION; -- 执行查询 SELECT * FROM accounts WHERE balance > 1000; -- 提交事务 COMMIT; ``` 在这个例子中,事务在整个执行过程中都将保持严格的串行化访问,确保查询结果不会受到其他事务的影响。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值