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. [转]DDR内存条rank的概念和区分

    1:什么是RANK? 答:CPU与内存之间的接口位宽是64bit,也就意味着CPU在一个时钟周期内会向内存发送或从内存读取64bit的数据.可是,单个内存颗粒的位宽仅有4bit.8bit或16bit, ...

  2. linux切换shell

    1. $SHELL这一环境变量用于保存当前用户使用的shell,所以我们可以输出$SHELL来查看当前使用的shell是什么: 2. 查看/etc/shells文件,可以看到当前系统中安装的有效的sh ...

  3. Luogu P1023 [NOIp2000提高组]税收与补贴问题 | 数学

    题目链接 思路:列不等式组,然后解出不等式,得出答案的取值范围,最后取一个绝对值最小的答案就行了. #include<iostream> #include<cstdio> #i ...

  4. Java线程的三种实现方法

    Java多线程详解 线程简介 多任务,多线程 多任务情况中,虽然可以完成,但是实际上,多任务的完成是由一个一个小任务的完成来实现的,也就是说在执行多任务时,不是同时执行多个任务,而是一个时间段内只完成 ...

  5. Get value from agent failed: cannot connect to [[192.168.8.102]:10050]: [113] No route to host

    192.168.8.102主机down掉,开机就可以

  6. Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  7. 力扣 - 剑指 Offer 30. 包含min函数的栈

    题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...

  8. Java多线程 | 02 | 线程同步机制

    同步机制简介 ​ 线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ...

  9. vscode 导入第三方jar包(添加外部JAR)

    添加 jar包 至根目录下lib文件夹,在 .classpath 文件内添加 jar 路径. 注意:新添加的 jar路径 在"src"和"bin"之间,否则无法 ...

  10. 个人网站迁移之旅:从博客到知识库,从 Hexo 到 Docusaurus

    或是出于跟风,或是为了简历能好看点,2020 年 2 月,在翻看了中文互联网大量的「免费个人网页搭建教程」后,我选择了 Hexo + Github Pages 的方案,找了一款看上去还不错的主题,搭建 ...