11.13模拟:总结


230pts
100+100+30+0

总结

不要先入为主!如果某种算法受阻,要尝试一下别的路子!!
本次的主要问题:

  1. T2花费时间略长(指2h)
  2. T3在错误的路上走了1h越走越偏,啥都没推出来,最后只好暴力草草收尾

(在家里太久不用linux,这次用用虚拟机
来回倒腾文件忒麻烦了qwq)

好的地方是没有挂分吧
但考场上的表现还是不太满意qwq
和上次时间“绰绰有余”恰恰相反
这次由于不少题看起来都挺可做,出现了时间严重不足的情况

T1文艺平衡树板子连写带调加对拍,大概1h左右,还在可以接受的范围内

然后就是通过打表死抠T2,又加对拍花了约2h(还好抠出来了)

T3写了两个假掉的dp设计然后越改越恶心,调了一个小时后只剩半小时,感觉无望,只好用map套vector转了个暴力拿30,还好比较顺利

此时只有15min左右了,T4甚至连暴力都已经没时间了,草草写下了一个固输0…
但那个题就是写暴力也很恶心,恐怕半小时也不一定能写完

然后就是把文件倒腾到固定机上,打包提交了

题目

要增加对区间dp的敏感度!!

T1倒着想其实可以很方便的线性做出来,写平衡树有些大材小用了
T2确实是挺阴间的,这次敢不看题纯打盲表找规律也是因为之前用类似的流氓方法艹过去了CF的一道题(但这个的规律更阴间一点),虽然花的时间有些长,但还算成功吧
T3考完和大家讨论都提到区间dp,但我考场上一直想的是诡异的线性dp…虽然感觉也不容易,但应该会可做许多,又是先入为主的锅了
T4容斥的大阴间题,事实是似乎T4几乎没有阳间题,即使是暴力的30也需要很复杂的状压dp,感觉虽然爆了0,但是损失不算太大

update(solution of T3):

写一下T3的题解
思路很妙
考虑最后合法的方案
必定每个值的范围是一段连续的区间,且前后顺序和原序列相同,同时这个区间的原序列都大于这个值

设计 d p i , j dp_{i,j} dpi,j表示第 i 位与等于 a j a_j aj的方案数

那么就有:
d p i , j = ∑ k = 1 j d p i − 1 , k dp_{i,j}=\sum_{k=1}^jdp_{i-1,k} dpi,j=k=1jdpi1,k
k必须小于j,否则j的区间就和k的区间逆序了
然后,如果i与j之间的最小值不是a[j],则 d p i , j = 0 dp_{i,j}=0 dpi,j=0
上面的转移用前缀和优化一下就可做到 n 2 n^2 n2

代码

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N=2050;
const int mod=1e9+7;
double eps=1e-10;
#define ll long long
ll read(){
	ll x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};
	while(isdigit(c)){x=x*10+c-'0';c=getchar();};
	return x*f;
}

int n,m;
int a[N],mn[N];
ll dp[N][N],sum[N][N];
int main(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=n;i++){
		mn[i]=a[i];
		for(int j=i+1;j<=n;j++) mn[j]=min(mn[j-1],a[j]);
		for(int j=i-1;j>=1;j--) mn[j]=min(mn[j+1],a[j]);
		for(int j=1;j<=n;j++){
			dp[i][j]=i==1?1:sum[i-1][j];
			if(mn[j]!=a[j]) dp[i][j]=0;
		}
		for(int j=1;j<=n;j++) sum[i][j]=(sum[i][j-1]+dp[i][j])%mod;
	}
	printf("%lld\n",sum[n][n]);
	return 0;
}
/*
1
9 9
19 99 63 39 72 46 97 38 68 
0 6 4 0 7 1 0 3 6 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值