首页 > 其他分享 >Codeforces Round 924 (Div. 2)

Codeforces Round 924 (Div. 2)

时间:2024-02-12 22:12:34浏览次数:23  
标签:le int bmod Codeforces long Div include 924 mx

1928D - Lonely Mountain Dungeons

题意:

有 \(n\) 个种族,第 \(i\) 个种族 \(c_i\) 个生物,现在要将这些生物分成若干组,每一对不在同一组但是同一种族的生物会对这种分组的价值贡献 \(b\),如果分了 \(k\) 组,则价值要减去 \((k-1)x\),求最大价值。

\(n \le 10^5,\sum c_i \le 10^5\)

思路:

对每种生物单独考虑。

假设已知分了 \(k\) 组,显然对于 \(c_i\),分成若干个 \(\frac{c_i}{k}\) 最优。

具体的,设 \(d = \lfloor\frac{c_i}{k}\rfloor,r = c_i \bmod k\),则我们分 \(r\) 组 \(d + 1\) 个,分 \(k-r\) 组 \(d\) 个,总共有 \(\binom{c_i}{2}-r\binom{d+1}{2}-(k-r)\binom{d}{2}\)。

总贡献应该是个是个单峰函数。

于是我们可以三分,当然二分会更好些一点,每次判断 \(f(mid)\) 与 \(f(mid+1)\) 的关系判断最大值在哪个区间即可。

时间复杂度 \(O(n \log \max c_i)\)。

考虑到生物总数比较少,我们也可以直接对每个生物枚举 \(k = 1 \sim c_i\),这样做就不用管他单不单峰了。

点击查看代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5 + 5;

int n, b, x;
int c[N] = {0};

long long cmb(int m) {
	return 1ll * m * (m - 1) / 2;
}

long long chk(int k) {
	long long ans = 0ll;
	for (int i = 1; i <= n; i++) {
		long long d = c[i] / k;
		long long m = c[i] % k;
		ans += cmb(c[i]);
		if (c[i] >= k)
			ans -= m * cmb(d + 1) + (k - m) * cmb(d);
	}
	return ans * b - 1ll * (k - 1) * x;
}

void slv() {
	cin >> n >> b >> x;
	int mx = 0;
	for (int i = 1; i <= n; i++)
		cin >> c[i], mx = max(mx, c[i]);
	int l = 1, r = mx + 1;
	while (l + 1 < r) {
		int mid = (l + r) / 2;
		if (chk(mid - 1) <= chk(mid))
			l = mid;
		else
			r = mid;
	}
	//cout << l << endl;
	cout << chk(l) << endl;
}

int main() {
	int T;
	cin >> T;
	while (T--)
		slv();
	return 0;
}

1928E - Modular Sequence

题意:

\(n\) 长度序列 \(a\) 满足: \(a_i = a_{i - 1} \bmod y\) 或 \(a_i = a_{i-1} + y\),\(1 < i \le n\)。现在给定 \(x, y, S\),求出一个序列 \(a\) 满足上述性质,第一个数为 \(x\) 且所有数之和为 \(S\)。

\(n \le 2 \times 10^5, S \le 2 \times 10^5\)

思路:

显然最终答案是 \(x, x + 1, \dots, x + k_1\) 和若干个 \(x \bmod y, x \bmod y + 1, \dots, x \bmod y + k_i\) 的形式。

先将所有 \(x \bmod y\) 减去,再将所有数除以 \(y\),记 \(b = \frac{x - x \bmod y}{y}\)。

现在答案就是 \(b * k_1\) 加上若干个 \(0, 1, 2, \dots, k_i\)。

可以枚举 \(k_1\),现在判断能否有若干个等差序列和为 \(sum\)。

值域不大,考虑 \(dp\)。设 \(dp[i]\) 表示和为 \(i\),所有等差序列至少几个元素。假设最少 \(k\) 个,则比 \(k\) 大的都可以通过补 \(0\) 实现。

直接正着转移,等差序列的和是平方级别的,所有总时间复杂度是 \(O(s\sqrt s)\)。

于是就完事儿了,输出方案倒着推一遍即可。

标签:le,int,bmod,Codeforces,long,Div,include,924,mx
From: https://www.cnblogs.com/rlc202204/p/18014179

相关文章

  • Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)
    @目录题面链接题意题解代码总结题面链接C.KefaandPark题意求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m题解这道题目主要是实现,当不满足条件时直接返回。到达叶节点后统计答案,用vector存图的话,无向图时,叶节点的边只有一条,也就是\(g[i].size()......
  • Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)
    目录题面链接题意题解代码题面链接B.Equalize题意给一个数组\(a\),然后让你给这个数组加上一个排列,求出现最多的次数题解赛时没过不应该。最开始很容易想到要去重,因为重复的元素对于答案是没有贡献的。去重后排序。,然后维护一个极差小于n-1的区间,,区间长度就是可能的答案......
  • div 除法指令
    DIV(unsigneddivide)无符号数除法被除数的位数取决于除数格式:DIVSRC操作:SRC为字节时,商=(AL)←(AX)/(SRC),余数=(AH)←(AX)/(SRC)SRC为字时,商=(AX)←(DX,AX)/(SRC),余数=(DX)←(DX,AX)/(SRC)—————......
  • Codeforces Round 924 (Div. 2)
    E-ModularSequence题意给定\(n,x,y,s\),求是否有长为\(n\)的一个数列\(\{a\}\)满足\(a_1=x\)且\(\foralli>1:a_i=a_{i-1}+y\lora_i=a_{i-1}\bmody\)且\(\sum\limits_{i=1}^{n}a_i=s\)。\(\sumn,\sums\le2\times10......
  • Codeforces Round 924 (Div. 2)
    不会F的场。ACode#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ inta,b; cin>>a>>b; intf=0; if(a%2==0&&am......
  • Codeforces Round 924 (Div. 2)
    CodeforcesRound924(Div.2)A-RectangleCutting解题思路:初始矩形长宽为\((a,b)\),如果我们切\(a\),那么一定不能再拼接\(a\),否则一定一样。所以我们拼接\(b\),即将\(a\)对半分开得到两个\((\frac{a}{2},b)\)矩形拼接。此时,如果\(\frac{a}{2}=b\)那么拼接出来的矩形和初......
  • Codeforces Round 905 (Div. 3)
    题目链接A.先算距离,特判0的位置,最后加4#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){strings;cin>>s;s=""+s;intlast=1,now,ans=0;for(inti=1;i<s.si......
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......
  • CodeForces 1286C2 Madhouse (Hard version)
    洛谷传送门CF传送门可以把限制看成\(0.75n^2\)。发现\(0.75n^2=0.5n^2+2\times0.5(\frac{n}{2})^2\)。这启发我们询问一次\([1,n]\)和两次长度为\(\frac{n}{2}\)的区间。不妨问\([1,n],[1,\frac{n}{2}],[1,\frac{n}{2}+1]\)试试。注意到把\([1,\frac......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......