题意:给你一列数,让你求上升序列,使权值最大
思路:LIS思路,(总有人骗我说是类似于RMQ问题,这有像的地方么,其他人还是强,现场过掉,第一次近距离看到fls,好强)但窝感觉这题题的数据是不是有点,为什么不会爆LL(好奇脸),其他的都是同LIS,只能说是真的用了LIS的思想,对于困难的权值,转变与有权值个困难,但并没有增加序列长度,而是在二分到位置后,向后维护权值个长度,这个思路(虽然说还是LIS的思路维护最小,但还是感觉好强)
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e5+7; int t,n,a[maxn],val[maxn]; int dp[maxn]; int main() { int t,n,x; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(dp,0x3f,sizeof(dp)); scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); for(int i=0;i<n; i++) scanf("%d",&val[i]); int len=0,sum=0; for(int i=0; i<n; i++) { int p=lower_bound(dp,dp+len,a[i])-dp; // printf("test %d == %d\n",i,p); for(int j=p; j<p+val[i]; j++) { dp[j]=a[i]; if(j==len)len++; } } printf("%d\n",len); } return 0; }