Codeforces 题面传送门 & 洛谷题面传送门

智商掉线/ll

本来以为是个奇怪的反悔贪心,然后便一直往反悔贪心的方向想就没想出来,看了题解才发现是个 nb 结论题。

Conclusion. 在最优方案中,至多只有一个数组只有部分被选,其余数组要么全选要么全都不选。

证明:考虑调整。假设存在两个数组 \(x,y\) 分别选了前 \(p,q\) 个元素,这里不妨假设 \(a_{x,p+1}\ge a_{y,q+1}\),那么考虑从 \(y\) 数组中拎 \(l=\min(len_x-p,q)\) 个元素到 \(x\) 中,那么答案的增量

\[\Delta=\sum\limits_{i=1}^la_{x,p+i}-\sum\limits_{i=1}^la_{y,q-i+1}
\]

由于 \(a_x,a_y\) 均为单调数组并且 \(a_{x,p+1}\ge a_{y,q+1}\),故 \(a_{x,p+i}\ge a_{y,q-i+1}\),因此 \(\Delta\ge 0\) 必然成立。如此调整下去即可得证。

有了这个性质之后如何求解答案呢?一个很自然的想法是对前后缀分别跑一遍背包,然后枚举那个选了一部分的数组及其选择的长度,然后用背包合并的技巧合并。但这样复杂度是三方的,如果将 \(n,k\) 视作同阶。一脸过不去的样子。考虑优化,注意到对于背包而言,其合并的复杂度可能很高,达到平方,但插入的复杂度并不算高,因此考虑分治,具体来说当分治一个区间时,我们记 \(mid=\lfloor\dfrac{l+r}{2}\rfloor\),然后将 \([l,mid]\) 中数组插入背包,分治 \([mid+1,r]\),然后将背包还原成原来的样子,插入 \([mid+1,r]\) 中的数组,分治 \([l,mid]\),再复原即可实现 \(nk\log n\) 的复杂度。

感觉我博客里有 114514191981019260817998244353 个“找性质”啊,为啥我这类找性质的题目还是做不出来呢?zibile,zabanna/dk

const int MAXN=3000;
int n,k,len[MAXN+5];
ll sum[MAXN+5],res=0;
vector<int> a[MAXN+5];
struct knap{
ll dp[MAXN+5];
void clear(){memset(dp,0,sizeof(dp));}
knap(){clear();}
void insert(int v,ll w){for(int i=k;i>=v;i--) chkmax(dp[i],dp[i-v]+w);}
};
knap cur;
void solve(int l,int r){
if(l==r){
ll s=0;
for(int i=0;i<=a[l].size();i++){
if(k>=i) chkmax(res,s+cur.dp[k-i]);
if(i!=a[l].size()) s+=a[l][i];
} return;
} int mid=l+r>>1;knap tmp=cur;
for(int i=l;i<=mid;i++) cur.insert(len[i],sum[i]);
solve(mid+1,r);cur=tmp;
for(int i=mid+1;i<=r;i++) cur.insert(len[i],sum[i]);
solve(l,mid);cur=tmp;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&len[i]);
for(int j=1,x;j<=len[i];j++){
scanf("%d",&x);sum[i]+=x;
a[i].pb(x);
}
} solve(1,n);
printf("%lld\n",res);
return 0;
}

Codeforces 1442D - Sum(找性质+分治+背包)的更多相关文章

  1. Codeforces 360A(找性质)

    反思 写一写可以发现上限不断更新 一直在想怎么判断NO,刻板拘泥于错误的模型,想要像往常一样贪心地.读入当前值就能判断会不会NO,实际上只要构造完以后,最后把所有操作重新跑一遍看会不会冲突即可判断NO ...

  2. CodeChef Sum of distances(分治)

    CodeChef Sum of distances(分治) 题目大意 有一排点,每个点 i 向 \(i + 1, i + 2, i + 3\) 分别连价值为 \(a_i,b_i,c_i\) 的有向边, ...

  3. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  4. Codeforces 85D Sum of Medians(线段树)

    题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...

  5. Codeforces 526G - Spiders Evil Plan(长链剖分+直径+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 %%%%% 这题也太神了吧 storz 57072 %%%%% 首先容易注意到我们选择的这 \(y\) 条路径的端点一定是叶子节点,否则我 ...

  6. Codeforces 1188E - Problem from Red Panda(找性质+组合数学)

    Codeforces 题面传送门 & 洛谷题面传送门 咦,题解搬运人竟是我? 一道很毒的计数题. 先转化下题意,每一次操作我们可以视作选择一种颜色并将其出现次数 \(+k\),之后将所有颜色的 ...

  7. Codeforces 698F - Coprime Permutation(找性质)

    Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...

  8. Codeforces 1067E - Random Forest Rank(找性质+树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不知道能不能算上自己 AC 的 D1E(?) 挺有意思的结论题,结论倒是自己猜出来了,可根本不会证( 开始搬运题解 ing: 碰到这样 ...

  9. Codeforces 1225G - To Make 1(bitset+状压 dp+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 还是做题做太少了啊--碰到这种题一点感觉都没有-- 首先我们来证明一件事情,那就是存在一种合并方式 \(\Leftrightarrow\) ...

随机推荐

  1. pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?

    那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...

  2. netty中使用protobuf实现多协议的消息

    在我们使用 netty 的过程中,有时候为了高效的传输数据,经常使用 protobuf 进行数据的传输,netty默认情况下为我们实现的 protobuf 的编解码,但是默认的只能实现单个对象的编解码 ...

  3. time_formatter攻防世界学习

    time_formatter 前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(), ...

  4. 基于Vue的工作流项目模块中,使用动态组件的方式统一呈现不同表单数据的处理方式

    在基于Vue的工作流项目模块中,我们在查看表单明细的时候,需要包含公用表单信息,特定表单信息两部分内容.前者表单数据可以统一呈现,而后者则是不同业务的表单数据不同.为了实现更好的维护性,把它们分开作为 ...

  5. Flutter应用在夜神模拟器启动白屏问题

    Flutter应用在夜神模拟器启动白屏问题 flutter run  出现如下错误 [ERROR:flutter/shell/gpu/gpu_surface_gl.cc(39)] Failed to ...

  6. 21.10.9 test

    T1 购票方案 \(\color{green}{100}\) 对于每个时间节点维护它作为每种票所能包含的最后一个点时,这种票的起始点位置,由于这个位置是单调的,所以类似双指针维护,\(O(KN)\) ...

  7. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

  8. 关于axios 的responseType类型的设置

    responseType值的类型可为如下 axios请求下载导出一个文件,请求成功时返回的是一个流形式的文件,需要设置responseType: 'arraybuffer',但是请求失败的需要返回的是 ...

  9. 释放 cached 内存

    巡检服务器发现内存可用很少了 top 命令查看是没有占用大内存的进程,cached特别大,释放cached就可以了 可用内存= free + buffers + cached 以下方法可以释放cach ...

  10. SpringBoot整合reids之JSON序列化文件夹操作

    前言 最近在开发项目,用到了redis作为缓存,来提高系统访问速度和缓解系统压力,提高用户响应和访问速度,这里遇到几个问题做一下总结和整理 快速配置 SpringBoot整合redis有专门的场景启动 ...