补题链接:Here

A.新比赛,在眼前。

对于每次猜数和裁判的判断,可以确定一个区间内所有的数都有可能,比如对于样例中(8 +)来说,[ -INT_MIN, 7] 中所有的数都有可能,那么对于每次猜数,我们可以将一个区间内所有的数都加上1,这就用到差分了,由于区间端点在这里的作用与区间内的数相同,所以我们不需要开那么大的数组(实际上也开不了),用一个map就行了。

const int N = 1e5 + 10, inf = INT_MAX;
int n;
map<int, int>mp;
void solve() {
cin >> n;
int x; char ch;
while (n--) {
cin >> x >> ch;
if (ch == '.')mp[x]++, mp[x + 1]--;
else if (ch == '+')mp[-inf]++, mp[x]--;
else mp[x + 1]++;
}
int ans = 0, cnt = 0;
for (auto p : mp) {
cnt += p.second;
ans = max(ans, cnt);
}
cout << ans << "\n";
}

B.有人说,上周题还没做完……

虽然写出了状态转移方程,但不太会证明,这里引用一下 RingweEH 的证明过程

有一个很显然的想法:答案中的系统方案一定是由原先的系统方案去掉若干种货币得到

事实上这就是正确的。

Proof

令给出的系统中的货币面值为 A 集合,需要得到的货币面值为 B 集合。

引理:A 集合中不能被其他数组成的数一定会在 B 集合中出现。

引理的证明:设有一个数 x∈A 且不能被 A 集合中其他数凑出来。 根据等价,如果 x∉B ,那么 B 中的其他数一定能组成 x .这就说明 B 中至少存在一个不属于 A 集合且不能被 A 组合出来的数(不然 A 集合就一定能合成 x ),那么这个数本身不属于 A 能组成的范畴,却属于 B 能组成的范畴,就不符合题意了。所以 x∈B ,引理正确性证毕。

那么现在我们需要证明:B⊆A .

仍然采用反证法。设存在一个数 x 满足 x∈B 且 x∉A.

根据题意,显然 x 能被 A 中若干个 a1,a2,…,ak 组成(假定这些数不能被拆分成 A 中其他的数,如果能拆分就直接拿拆分方案替换即可)。根据引理,这些数都属于 B ,也就是说,B 完全可以通过这些数组成 x ,那么 B 中再存在一个 x 显然就是多余的,和 B 集合最小的要求不符。

Q.E.D.

接下来的事情就非常简单了。我们只需要考虑 A 集合中哪些数是多余的就好了。

题目暗示:现在网友们打算 简化 一下货币系统。这说明就是在原基础上去掉某些数(

这个事情可以一次 DP 解决。观察到 \(a[i]\) 的范围只有 \(25000\) ,那么可以直接设 \(f[i]\) 表示 \(i\) 这个数能否被前面已经出现过的 \(a[j]\) 组成。

  • 如果枚举到 \(a[i]\) 时,\(f[a[i]] = 1\) ,那么直接计入答案并跳过即可;
  • 如果没有,那么枚举所有的 \(j = a[i] ~ m\) ,\(f[j]\ |= f[j - a[i]]\) (就是用 \(j−a[i]\) 和 \(a[i]\) 组成 \(j\) ,枚举范围中的 \(mx\) 表示所有 \(a[i]\) 中的最大值)
const int N = 110, M = 25010;
int a[N], f[M];
int n;
void solve() {
cin >> n;
for (int i = 1; i <= n; ++i)cin >> a[i];
sort(a + 1, a + 1 + n);
int mx = a[n];
memset(f, 0, sizeof(f)), f[0] = 1;
int ans = n;
for (int i = 1; i <= n; ++i) {
if (f[a[i]]) {ans--; continue;}
for (int j = a[i]; j <= mx; ++j)
f[j] |= f[j - a[i]];
}
cout << ans << "\n";
}

C.要变强,不空喊,ak题目,继续向前。

这个问题的难点在于如何统计出所有和可能出现的情况,并且不能重复。

很容易想到用桶去存储每一个数,即某个和能够组合出来则为1,否则为0

不妨令 \(dp[i][j]\) 表示为第 \(i\) 次选择时,和为 \(j\) 的情况是否出现过

但是内存方面需要 \(1e8\) 的 \(int\) 内存,显然是不可接受的

那么我们考虑用 \(bitset\) 优化内存,由递推方程:\(dp_i = dp_{i}|=(dp_{i-1}<<(j*j))\)

代表第 \(i\) 次选择的时候是否能从当前状态转移到和为\(j\) 的状态

写完状态转移方程发现 \(dp_i\) 仅与 \(dp_{i - 1}\) 有关系,所以由滚动数组来节省空间

bitset<1000010>now, nxt;
void solve() {
int n;
cin >> n;
now[0] = 1;
for (int i = 1; i <= n; ++i) {
int l , r; cin >> l >> r;
for (int j = l; j <= r; ++j)
if (j == l) nxt = (now << (j * j));
else nxt |= (now << (j * j));
now = nxt;
}
cout << now.count() << "\n";
}

D.kuangbin巨巨曾言:人一我百,人十我万。

这个图必须要连通的,其次要有个奇环

对于不连通的图,只需要加上 连通块数量-1 的边即可将它变成连通

对于不存在奇环的,可以在连通的图上加一条边生成一个奇环

所以 \(DFS\) 每个连通块,在 \(DFS\) 过程中顺便用染色法判定下这是不是个二分图

因为二分图不含奇环,如果它是二分图就说明它有奇环

最后答案就是 连通快的数量 - (有无奇环)

const int N = 1e5 + 10;
int n, m, odd, x, y, res, vis[N], color[N];
vector<int> g[N];
void dfs(int u) {
for (auto v : g[u]) {
if (!vis[v]) {
vis[v] = 1;
color[v] = !color[u];
dfs(v);
} else if (color[u] == color[v])
odd = 1;
}
}
void solve() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
res++;
vis[i] = color[i] = 1;
dfs(i);
}
}
cout << res - odd << '\n';
}

E.暂且莫放豪言要刷千万题,先把每场比赛好好练!

二分图左侧为属性值,右侧为N个装备

每个装备向其两个属性值连边(反向),用匈牙利从小到大枚举属性值,直到无法匹配为止

因为在二分图上每次增广时不会使得之前的匹配点变为非匹配点,所以正确性显然能保证

注意要使用时间戳优化匈牙利,不然memset的开销过大

const int N = 1e4 + 10, M = 1e6 + 10;
int n, Tim;
vector<int>e[N];;
int vis[M], mat[M];
bool find(int u) {
for (auto v : e[u]) {
if (vis[v] != Tim) {
vis[v] = Tim;
if (!mat[v] || find(mat[v])) {
mat[v] = u; return true;
}
}
}
return false;
}
void solve() {
int n; cin >> n;
for (int i = 1, u, v; i <= n; ++i) {
cin >> u >> v;
e[u].push_back(i);
e[v].push_back(i);
}
for (int i = 1; i <= N; ++i) {
++Tim;
if (!find(i)) {
cout << i - 1;
return ;
}
}
}

牛客 | 一起来做题~欢乐赛2 (AK 题解)的更多相关文章

  1. 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  2. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  3. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  4. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  5. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  6. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  7. contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve

    http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...

  8. 牛客网Java刷题知识点之为什么HashMap和HashSet区别

    不多说,直接上干货! HashMap  和  HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...

  9. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  10. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

随机推荐

  1. 🔥🔥Java开发者的Python快速进修指南:自定义模块及常用模块

    好的,按照我们平常的惯例,我先来讲一下今天这节课的内容,以及Java和Python在某些方面的相似之处.Python使用import语句来导入包,而Java也是如此.然而,两者之间的区别在于Pytho ...

  2. 海量电商数据与用友YS系统数据对接案例

    案例背景 客户是历史比较悠久的企业.企业内部用的系统多达十几套,专门成立信息化公司进行数字化转型,第一期需求系统旺店通的ERP以及旺店通的WMS并且启用京东的沧海外仓. 在选型ERP用友ERP和金蝶E ...

  3. Echarts 柱形图最全详解

    Echarts 是一款基于 JavaScript 的开源可视化图表库,被广泛应用于数据可视化领域.它提供了丰富的图表类型和交互功能,其中柱形图是最常用和重要的一种图表类型之一.下面是对 Echarts ...

  4. docker启动完美容器的过程

    这里是我用docker启动所有常见的容器完美的过程,就是一次创建,后面就可以一直使用 文档: nanshaws/docker-everything: 用docker来创建各种容器,完美文档教你按照步骤 ...

  5. serdes与PCIE的区别

    serdes和PCIE是两种非常常见的总线.因为PCIE也是差分信号传输,所以做硬件时比较难区别PCIE和serdes的具体差异点. 两者之间的区别主要表现在以下几点: 1.PCIE使用了SERDES ...

  6. [GDOI22pj2C] 教室的电子钟

    第三题 教室的电子钟 提交文件: clock.cpp 输入文件: clock.in 输出文件: clock.out 时间空间限制: 1 秒, 256 MB 为了迎接 GDOI,小蒟蒻学校所有教室的钟都 ...

  7. idea的maven

    在我学习springMvc时一直报一个错,后来发现是maven一直出错导致的 这个maven是idea系统自己的maven,用着用着发现依赖项不见了,怎么导入坐标都导不进去,导致在创建maven项目时 ...

  8. Java8新特性Stream流

    1.是什么? Stream(流)是一个来自数据源的元素队列并支持聚合操作 2.能干嘛? Stream流的元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算. 数 ...

  9. 牛客刷java记录第5天

    第一题,下列代码运行结果是? class X { Y y = new Y(); public X() { System.out.print("X"); } } class Y { ...

  10. Android中使用Gson

    Gson是一个Java库,可用于将Java对象转换为它们的JSON表示.它还可以用于将JSON字符串转换为等效的Java对象.Gson可以处理任意Java对象,包括您没有源代码的已有对象. 一.简单使 ...