首页 > 其他分享 >CF888E题解

CF888E题解

时间:2023-10-26 15:38:04浏览次数:34  
标签:fr CF888E int 题解 sum 模数 void mod

  • 分析

    看到 \(n \leq 35\) 的数据范围就想到了 meet-in-middle。
    先爆搜出对于 \(1 \sim \frac{n}{2}\) 和 \(\frac{n}{2} \sim n\) 两个下标范围内在模意义下所有的和。
    然后用一个常见 trick,就是枚举第二个部分的和,然后匹配第一个部分的和的最优解。

    显然匹配有两种情况,一种是小于模数,一种是比模数大。
    比模数大的情况还要取模,但是我们发现对于 \(\forall a,b < m, a + b >= m\),有 \(a + b < 2m\),所以最多只需要减一个模数,那么模后的式子变成了 \(a + b - m\),但是因为 \(b < m\),所以 \(a + b - m < a\),然后我们发现这种情况还没有第一个部分什么都不取,只取第二个部分优,所以排除掉这个情况。

    那么只剩下和小于模数的情况,即 \(a + b < m\) 的情况。\(b\) 一定,\(a\) 越大,和越大,所以要找到使得 \(a + b < m\),即满足 \(a < m - b\) 的最大 \(a\)。
    小于 \(m - b\) 的最大值,想到二分,但是二分需要单调性,于是先将 \(a\) 数组排序后再二分,这样问题就就解决了。
    总时间复杂度 \(\mathcal{O(2^{\frac{n}{2}} \log 2^{\frac{n}{2}})}\),可以通过本题。

  • 代码

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
constexpr int MAXN(1000007);
int fr[MAXN], a[MAXN];
int n, mod, cnt, ans;
inline void read(int &temp) { cin >> temp; }
void dfs1(int x, int sum) {
	if (x == n / 2 + 1)  return fr[++cnt] = sum, void();
	dfs1(x + 1, sum);
	dfs1(x + 1, (sum + a[x]) % mod);
}
void dfs2(int x, int sum) {
	if (x == n + 1)  return ans = max(ans, fr[lower_bound(fr + 1, fr + cnt + 1, mod - sum) - fr - 1] + sum), void();
	dfs2(x + 1, sum);
	dfs2(x + 1, (sum + a[x]) % mod);
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	read(n), read(mod);
	for (int i(1); i <= n; ++i)  read(a[i]);
	dfs1(1, 0);
	sort(fr + 1, fr + cnt + 1);
	dfs2(n / 2 + 1, 0);
	cout << ans << endl;
	return 0;
}

标签:fr,CF888E,int,题解,sum,模数,void,mod
From: https://www.cnblogs.com/Kazdale/p/17789494.html

相关文章

  • chrome新版本http自动跳转https问题解决
    虽然是个好功能,但是部分内网业务还没做好https兼容,有的时候手工访问,还是变成https 解决办法:chrome://flags/找到:HTTPSUpgrades,修改disabled,重启解决,当然这个需要需要用户去调整,真正还需要服务去兼容https  ......
  • 在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问
    一般表现是打包最后一步会等待超长时间,最后报错,错误信息:PickedupJAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8FAILURE:Buildfailedwithanexception.*Whatwentwrong:Aproblemoccurredconfiguringrootproject'Gradle'.>Couldnotresolveallartifactsfor......
  • CCC 2023 题解 和 思考过程
    Trianglane水题,只要分情况判断中间和两侧有边叠牢的情况,每次减2#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;typedeflonglongll;constintN=200010......
  • 「题解」Codeforces Round 905 (Div. 3)
    before终于有一篇题解是一次性更所有题的了。A.MorningProblemA.MorningSol&Code根据题意模拟即可。#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT;int......
  • CF888C题解
    分析容易想到可以枚举每个字母,分别求其最小\(k\)取\(\min\)。思考对于一个\(k\),如何判其不合法。容易想到如果存在一个没有这个字符的长度大于等于\(k\)的子段,那么这个\(k\)就不合法。那么我们就知道如何求最小合法\(k\)了。找到最长的没有这个字符的子段,其长度加......
  • CF888A题解
    分析因为一个数不可能同时大于并小于它两边的数,所以两种数的集合不存在交集。所以分别扫一遍两种数的个数加在一起即可。代码#include<iostream>usingnamespacestd;constexprintMAXN(1000007);inta[MAXN];intn,ans;inlinevoidread(int&temp){cin>>t......
  • Redisson分布式锁主从一致性问题解决
    Redis联锁联锁(RedissonMultiLock)对象可以将多个RLock对象关联为一个联锁,实现加锁和解锁功能。每个RLock对象实例可以来自于不同的Redisson实例。如果负责储存分布式锁的某些Redis节点宕机以后,而且这些锁正好处于锁住状态,就会出现死锁问题。为了避免这种情况的发生,Redisson内部提供......
  • AGC304Ex Constrained Topological Sort 题解
    AT一个直接的想法是拓扑排序时从小到大标号:每次在入度为\(0\)的点中找到\(l_{u}\lei\)且\(r_{u}\)最小的\(u\),令\(p_{u}=i\)问题是如果\(r_{u}\)很大,那么\(u\)被标号的优先级很低,会连累\(u\)的后继中\(r\)较小的点做法是倒着拓扑一遍,令\(r_{u}\leftarrow\m......
  • [ARC164D]1D Coulomb 题解
    [ARC164D]1DCoulomb题解题意在长为\(2N\)的数轴上放有\(2N\)个小球,第\(i\)个小球在坐标\(i\)的位置。\(2N\)个小球中有\(N\)个小球带正电,有\(N\)个小球带负点。记第\(i\)个小球带\(a_i\)单位电荷(\(a_i\in\{1,-1\}\)),小球之间受到力的作用,第\(i\)个小球受到......
  • P3214 [HNOI2011] 卡农 题解
    感觉不是很麻烦,可能就组合排列转化绕一点。。。抽象化题意给定\(n\)个元素,从中选出\(m\)个集合,要求:集合不为空,集合里不能有相同的元素\(m\)个集合都互不相同所有元素被选出的次数为偶数求方案数,并对\(100000007\)取模凭感觉是DP+组合数设\(dp[i][0/1]\)......