[J组模拟赛 #002 T4]分组选数
分组选数
题目大意:
给 \(n\) 个数,第 \(i\) 个数是 \(a_i\),属于第 \(b_i\) 个集合中。对于每个集合,若从中选出若干个数,则价值为这些数的异或和,总共的价值就是所有集合的价值的和。现在最多可以选 \(m\) 个数,问可以获得的最大价值是多少。
数据范围:
对于 \(100\%\) 的数据:
- \(n, m \leq 2000\)
- \(a_i \leq 2000\)
- \(b_i \leq 2000\)
解题分析:
朴素做法:
假设 \(a_{i,j}\) 为第 \(i\) 个集合中的第 \(j\) 个数。
首先,最质朴的想法就是设 \(f_{i,j,k,l}\) 为第 \(i\) 个集合里,前 \(j\) 个数中选择 \(k\) 个数能否凑成 \(l\)。由于异或运算符是可逆的,所以转移方程就是:
\]
然后再进行一个背包,这里 \(g_{i,j}\) 为前 \(i\) 个集合中选 \(j\) 个数的最大答案:
\]
PS:这里 \(k\) 是任意一个数
正解:
但很明显,朴素做法时间复杂度是 \(O(n^3)\),会超时,所以我们不妨观察一下状态。由于异或并不满足最优子结构,所以我们把目光转移到了这个:选择 k 个数。
在尝试将状态变成 f[i][j][l] 表示第 i 个集合中,前 j 个数异或和为 l 最少要选择多少个数 后,我们发现这是可以计算的:
\]
然后对于第 \(i\) 个集合中选择 \(k\) 个数的异或和,我们不妨把它设为 \(c_{i,k}\),然后很明显:
\]
注意:由于答案一定是最优的,所以只更新 最少要取多少个数 是没有问题的,因为大一点的更新后要用的数量更多反而会不好。
然后 \(g\) 的更新还是没有区别:
\]
然后这道题就做完了,时间复杂度 \(O(n^2)\) (大概吧,反正是这个量级的)
AC Code:
# include <bits/stdc++.h>
using namespace std;
# define ll long long
# define lf double
# define int ll
# define GO(i,a,b) for(int i = a; i <= b; i ++)
# define RO(i,b,a) for(int i = b; i >= a; i --)
# define FO(i,u,head,e) for(int i = head[u]; i; i = e[i].next)
# define CI const int
# define pii pair<int,int>
# define F first
# define S second
# define PB(x) push_back(x)
# define mem(a,x) memset(a, x, sizeof a)
CI maxn = 2007;
int n, m;
map <int, vector <int> > p;
int x, y;
int f[3007][3007]; // 一个集合中前 i 个元素异或和为 j 所用的最少个数
int s[3007]; // 用 i 个数最大的异或和
int g[3007][3007]; // 前 i 个集合选 j 个数最大和
signed main(){
cin >> n >> m;
GO (i, 1, n){
scanf("%lld %lld", &x, &y);
p[y].PB(x);
}
GO (i, 0, 3000)
GO (j, 0, 3000)
g[i][j] = -2e18;
g[0][0] = 0;
int ii = 0;
int ans = -2e18;
for (auto i : p){
ii ++;
auto x = (i.S);
GO (j, 0, (int) (x.size()))
GO (k, 0, 3000)
f[j][k] = 2e18, s[k] = 0;
f[0][0] = 0;
GO (j, 1, (int) (x.size()))
GO (k, 0, 2000)
f[j][k] = min <int> (f[j - 1][k ^ x[j - 1]] + 1, f[j - 1][k]);
GO (k, 0, 2000) if (f[(int)(x.size())][k] != 2e18) s[f[(int)(x.size())][k]] = max <int> (s[f[(int)(x.size())][k]], k);
GO (j, 0, 2000)
GO (k, 0, min <int> (j, (int) (x.size())))
g[ii][j] = max <int> (g[ii][j], g[ii - 1][j - k] + s[k]);
}
GO (j, 0, m) ans = max <int> (ans, g[ii][j]);
printf("%lld", ans);
return 0;
}
[J组模拟赛 #002 T4]分组选数的更多相关文章
- SX【2020.01.09】NOIP提高组模拟赛(day1)
[2020.01.09]NOIP提高组模拟赛(day1) 这次考得不理想,只做了前两题,后两题没时间做,说明做题速度偏慢. source : 100 + 20 + 0 + 0 = 120 rank7 ...
- 52-2018 蓝桥杯省赛 B 组模拟赛(一)java
最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- ZROI 普及组模拟赛02总结
ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
- NOIP2017提高组模拟赛 9 (总结)
NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...
随机推荐
- 信息资源管理综合题之“LJ集团的知识库和员工离职客户流失问题”
一.集团是北京的一家规模巨大的房地产投资公司,早在15年前,该公司出现了如下几个问题:每个业务员手上的客户资料,其他人无法得知,从而导致员工离职时会流失大量潜在客户:业务员繁忙的时候,无法满足客户用户 ...
- SQL 强化练习 (十)
这一周都被客户搞得很惨.... 项目主流程不推进, 尽搞一些无关紧要的事情, 什么界面 ui 美化, 增加什么按钮进度条, 模糊查询...各种乱七八糟的需求, 挡都挡不住呀... 真的是把我当全栈使了 ...
- 图解Spring源码4-Spring Bean的作用域
>>>点击去看B站配套视频<<< 系列文章目录和关于我 1. 从一个例子开始 小陈经过开店标准化审计流程后,终于拥有了一家自己的咖啡店,在营业前它向总部的咖啡杯生产 ...
- Java泛型<T> T与T的用法
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...
- maven pom.xml文件中properties标签介绍
在properties标签内可以把版本号作为变量进行声明,方便maven依赖标签用${变量名}的形式动态获取版本号.这样做的优点是当版本号发生改变时,仅仅需要更新properties标签中的变量值就行 ...
- 深入理解Nginx-模块开发与架构解析(第2版)第一章
为什么选择Nginx 更快 高扩展性 高可靠性 低内存消耗 单机支持10万以上的并发连接 热部署 最自由的BSD许可协议 Nginx先天的事件驱动型设计.全异步的网络I/O处理机制.极少的进程间切换以 ...
- 「Log」CSP-S 2023 游记
Day 0 什么题也没写,稍微复习了一下,晚上打了些板子. 整个人处于放空状态. Day 1 早上睡了懒觉,老爹早就给我点了肯德基早餐. 边吃早餐边看番,吃完了去群里水了一水,讨论了点杂七杂八的东西, ...
- python之PypI打包whl文件
一.简单介绍 python中我们经常会用到第三方的包作为工具,比如爬虫解析工具,网络请求工具等.之所以要把它封装成包,意识为了技术与业务分离,二是为了能多 项目多平台共用.python里面用到的第三方 ...
- 安装Docker Desktop时出现报错,WSL2 升级更新失败(退出代码: 1603,错误代码: Wsl/CallMsi/Install/ERROR_INSTALL_FAILURE)解决办法
安装Docker Desktop时出现报错,WSL2 升级更新失败 一.问题 首先遇到的问题是安装docker desktop后,启动引擎时报错 wsl update failed: update ...
- h5 移动端适配方案
h5 移动端适配方案 设定viewport 打开public\index.html,在html\head结点下加入<meta name="viewport" content= ...