当前位置: 首页 > news >正文

省选集训 16 - 杂题

[CF1442D] Sum

由于序列单增,所以最后至多有一个数组不被选满。

证明简单,假设有两个数组 \(x\)\(y\) 分别选到第 \(i\)\(j\) 项并没有选满。

如果 \(x_{i+1}\leq y_{j+1}\),那么有 \(x_{i}\leq y_{j+1}\),将 \(x_{i}\) 替换为 \(y_{j+1}\) 显然不劣。

然后只需要知道去掉每个位置后的背包,枚举当前位置选多少个就行了。

套路地进行分治,即将 \([l,mid]\) 丢进背包后递归 \((mid,r]\),另一边同理。

这样递归到叶子就是去掉当前位置的背包了,在叶子统计答案即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3005,INF=0x3f3f3f3f3f3f3f3f;
vector<int> v[N];
int n,k,ans=-INF,t[N],dp[N],sum[N];
void solve(int l,int r){int mid=(l+r)>>1,now=0;if(l==r){for(int i=1;i<=min(k,t[l]);i++)ans=max(ans,(now+=v[l][i])+dp[k-i]);return ans=max(ans,dp[k]),void();}vector<int> tmp(dp,dp+k+1);for(int i=l;i<=mid;i++)for(int j=k;j>=t[i];j--)dp[j]=max(dp[j],dp[j-t[i]]+sum[i]);solve(mid+1,r),copy(tmp.begin(),tmp.end(),dp);for(int i=mid+1;i<=r;i++)for(int j=k;j>=t[i];j--)dp[j]=max(dp[j],dp[j-t[i]]+sum[i]);solve(l,mid),copy(tmp.begin(),tmp.end(),dp);
}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>n>>k,fill(dp+1,dp+k+1,-INF);for(int i=1;i<=n;i++){cin>>t[i],v[i].resize(t[i]+1,0);for(int j=1;j<=t[i];j++)cin>>v[i][j],sum[i]+=v[i][j];}solve(1,n),cout<<ans<<"\n";
}

[Luogu P13552] 鱼类考古学

先观察数据范围,\(10^6\) 还是位运算题目,大致得出复杂度在 \(O(n\log V)\) 左右。

但是拆位后,如果先加后按位与,答案会受进位影响,那有没有办法先与后加呢?

惊奇地发现 \((a\&b)+c\geq c \geq (a+b)\&c\),所以遇到 \((a+b)\&c\) 的情况一定能进行替换。

那题目就被简化为:将 \(n\) 个数划分为 \(k\) 个不交集合,使得各集合按位与后的求和最大。

于是我们就可以进行拆位,每次让当前位的答案最大就可以了,设有 \(cnt\) 个数当前位为 \(1\)

\(cnt<k\) 时,显然应当让当前位为 \(1\) 的全部独立划分为一个集合。

所以可以直接让答案加上这些数,并把这些数删去,变成集合和 \(k\) 都更小的子问题。

\(cnt\geq k\) 时,如果当前位全为 \(1\),那不管怎么划分这一位答案都相同,直接加上就行了。

否则,我们一定要将这一位的所有 \(0\) 并在一起才最优,这一位就只能贡献 \(k-1\)\(1\)

然后用 vector 模拟实现上述过程即可。

注意在 \(cnt\geq k\) 的时候要将当前位的 \(1\) 抹去,否则会在后续 \(cnt<k\) 时重复统计贡献。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
long long t,n,k,ans;
void solve(){cin>>n>>k,ans=0;vector<int> v(n,0);for(auto &x:v)  cin>>x;for(int i=29;i>=0;i--){vector<int> tmp(0,0);int cnt=0,now=(1<<30)-1;for(auto x:v)  cnt+=(x>>i&1);if(cnt<k){for(auto x:v){if(x>>i&1)  ans+=x,k--;else  tmp.push_back(x);}v=tmp;}else{for(auto x:v){if(!(x>>i&1))  now&=x;else  tmp.push_back(x^(1<<i));}v=tmp,ans+=(1<<i)*(k-1);if(now==(1<<30)-1)  ans+=(1<<i);else  v.push_back(now);}}return cout<<ans<<"\n",void();
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>t;while(t--)  solve();
}
http://www.jsqmd.com/news/318501/

相关文章:

  • 基于springboot的星之语明星周边产品销售网的设计与实现项目源码 java毕设 免费分享
  • 基于kmeans的集群划分,ieee33节点,包括集群划分指标等结果信息,部分如图所示
  • 大数据领域如何利用HDFS实现高效的数据共享
  • 2025-2026 学年度上期期末考试游记
  • AI Agent 框架探秘:拆解 OpenHands(4)--- 服务
  • 小程序公司按综合实力来排名:2026年谁是你数字化转型的最佳伙伴?
  • 【硬核】HR大模型开发实战:构建智能Agent,解放打工人从招聘开始
  • 丰宝斋上门回收民国书老医书,针对性回收,小众珍品不被埋没
  • 使用三个线程按顺序打印ABC,循环打印10次
  • 【C语言】学习
  • 【AI已死?】中国大模型下载破百亿,技术路线从“聊天“到“做事“,程序员:我的代码还有价值吗?
  • 北京上门回收古书老书,丰宝斋三重鉴定,精准估价不被压价
  • 气动人工肌肉的控制-EXP-自动控制-气动肌肉
  • 需求其实并非在谈需求
  • 如果我们必须构建软件,那么它必须为拥有它的人提供最理想的价值。
  • 2026最新18k金镶嵌/18k金微硬金加工工厂推荐广州市金优选珠宝有限公司:工艺与设计双优,实力领跑
  • 在杭州的小程序公司深度对比:哪家才是你的技术专家?
  • 在北京做小程序开发的公司哪家好?打造数字化转型利器
  • 2026小程序公司十大排名:选对服务商,抢占数字市场先机
  • 2026小程序公司前十大排名:哪家才是更深入民心?
  • 2026广东最新18k金微硬金加工工厂top5推荐!广州优质工厂助力行业升级
  • 基于变分模态分解与麻雀优化最小二乘支持向量机的短期电力负荷预测(VMD - SSA - LSSVM)
  • 提示工程架构师指南:Agentic AI上下文工程情境感知能力的多语言支持设计
  • 2026年小程序开发公司深度评选榜单:靠谱合作伙伴一览
  • 基于深度学习YOLOv12的食物检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 从0到1搭建AI战略规划系统:架构师的实战 checklist
  • 洛谷 P2895 [USACO08FEB] Meteor Shower S 题解
  • 基于最小二乘支持向量机(LSSVM)的手写字母识别Matlab代码之旅
  • 【MySQL筑基篇】Schema设计避坑指南:INT/BIGINT、CHAR/VARCHAR选型不再纠结
  • 3.7 kW 无线电能传输系统-EXP-汽车-无线充电