首页 > 其他分享 >World Tour Finals 2019 D Distinct Boxes

World Tour Finals 2019 D Distinct Boxes

时间:2023-10-30 21:44:06浏览次数:41  
标签:node typedef le const Distinct ll Tour Boxes sum

洛谷传送门

AtCoder 传送门

神题。

设第 \(i\) 个箱子有 \(x_i\) 个红球,\(y_i\) 个蓝球,那么要求找到最大的 \(K\) 使得 \(\sum\limits_{i = 1}^K x_i \le R, \sum\limits_{i = 1}^K y_i \le B\),且 \((x_i, y_i)\) 两两不等。

显然我们都希望 \(x_i, y_i\) 尽量小。但是当 \(R, B\) 有一定差距时,我们希望贡献一些 \(x_i\) 让一些 \(y_i\) 相等,不好考虑。

人类智慧地,考虑类似 wqs 二分地给每一维赋一个权值 \((p, q)\),那么当 \(\sum x_i \le R \land \sum y_i \le B\) 时就有 \(p \sum x_i + q \sum y_i \le pR + qB\),所以某种程度我们希望 \(p \sum x_i + q \sum y_i\) 尽量小。

先二分一个 \(K\),把对于每个 \((p, q)\),\(p x_i + q y_i\) 最小的 \(K\) 个点的 \((\sum x_i, \sum y_i)\) 扔到平面上,发现它们会形成一个下凸包,我们需要判断 \((R, B)\) 是不是在这个凸包的右上方。

无法直接求出这个凸包,考虑直接钦定 \(p + q\) 等于一个大常数(比如 \(10^9 + 7\)),感性理解一下因为 \(p + q\) 足够大所以有用的情况都能考虑到。然后我们二分 \(p\),用这组 \((p, q)\) 去搞出凸包上的点。

现在要求使得 \(p x_i + q y_i\) 最小的一组 \((x_i, y_i)\) 的 \((\sum x_i, \sum y_i)\),考虑二分一个 \(z\),求出 \(px + qy \le z\) 的点数和对应方案的 \((\sum x_i, \sum y_i)\)。注意到如果选了一组 \((x, y)\),它左下角的点一定都被选了,所以 \(\min(x, y)\) 是 \(O(V^{\frac{1}{3}})\) 级别的。可以直接枚举其中一维计算答案。

求出来这组 \((\sum x_i, \sum y_i)\) 后,如果已经满足 \(\sum x_i \le R \land \sum y_i \le B\) 了就直接知道这个 \(K\) 可行了;否则若 \(\sum x_i > R \land \sum y_i > B\) 就一定不可行;否则根据 \(\sum x_i\) 与 \(R\) 的大小判断增大 \(p\) 还是减小即可。

同时我们还要记录左边界和右边界的凸包上的点,方便最后判断 \((R, B)\) 是否在这个凸包的右上方,这个用叉积判一下即可。

总共需要三层二分。时间复杂度 \(O(V^{\frac{1}{3}} \log^3 V)\)。

code
// Problem: D - Distinct Boxes
// Contest: AtCoder - World Tour Finals 2019
// URL: https://atcoder.jp/contests/wtf19/tasks/wtf19_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const ll M = 1000000007;

ll n, m;

struct node {
	ll x, y;
	node(ll a = 0, ll b = 0) : x(a), y(b) {}
};

inline node operator + (const node &a, const node &b) {
	return node(a.x + b.x, a.y + b.y);
}

inline node operator - (const node &a, const node &b) {
	return node(a.x - b.x, a.y - b.y);
}

inline ll operator * (const node &a, const node &b) {
	return a.x * b.y - a.y * b.x;
}

inline node calc(ll p, ll q, ll k) {
	bool flag = 0;
	if (p < q) {
		swap(p, q);
		flag = 1;
	}
	ll l = 0, r = 1e18, z = 0;
	while (l <= r) {
		ll mid = (l + r) >> 1, t = 0;
		for (ll i = 0; i * p <= mid; ++i) {
			t += (mid - i * p) / q + 1;
			if (t > k) {
				break;
			}
		}
		if (t <= k) {
			z = mid;
			l = mid + 1;
		} else {
			r = mid - 1;
		}
	}
	ll sx = 0, sy = 0;
	for (ll i = 0; i * p <= z; ++i) {
		ll t = (z - i * p) / q;
		sx += (t + 1) * i;
		sy += t * (t + 1) / 2;
	}
	if (flag) {
		swap(sx, sy);
	}
	return node(sx, sy);
}

inline bool check(ll k) {
	ll l = 1, r = M - 1;
	node L(0, 0), R(0, 0);
	while (l <= r) {
		ll p = (l + r) >> 1;
		ll q = M - p;
		node t = calc(p, q, k);
		if (t.x <= n && t.y <= m) {
			return 1;
		} else if (t.x > n && t.y > m) {
			return 0;
		} else if (t.x <= n) {
			L = t;
			r = p - 1;
		} else {
			R = t;
			l = p + 1;
		}
	}
	return (R - L) * (node(n, m) - L) >= 0;
}

void solve() {
	scanf("%lld%lld", &n, &m);
	ll l = 1, r = 1e9, ans = -1;
	while (l <= r) {
		ll mid = (l + r) >> 1;
		if (check(mid)) {
			ans = mid;
			l = mid + 1;
		} else {
			r = mid - 1;
		}
	}
	printf("%lld\n", ans - 1);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:node,typedef,le,const,Distinct,ll,Tour,Boxes,sum
From: https://www.cnblogs.com/zltzlt-blog/p/17798930.html

相关文章

  • [CF283E] Cow Tennis Tournamsan
    CF283E答案即为\(\binom{n}{3}\)减去不合法环数。一个三元环中最多1个点出度为2,所以出度为x的点会造成\(\binom{x}{2}\)个不合法的环。\(\Omicron(nm)\)的做法就是枚举i,判断i与n个点连边是否反向(0,1表示)。然后可以发现对于一段区间[l,r]修改后做贡献的点是......
  • A Tour Through TREE_RCU's Data Structures (翻译)
    原文:https://www.kernel.org/doc/html/latest/RCU/Design/Data-Structures/Data-Structures.htmlDecember18,2016ThisarticlewascontributedbyPaulE.McKenneyIntroductionThisdocumentdescribesRCU'smajordatastructuresandtheirrelationshiptoea......
  • CF1220E Tourism
    拿到题就有一个很自然的想法,当存在一个大小\(\ge3\)的环时,我们可以把上面所有点都走一遍然后回到出发点然后想到更一般的,直接先来个边双缩点,这样任意两点间都有两条及以上的路径了,因此同一个边双内的点都可以任选由于经典结论一个连通图边双缩点后会得到一棵树,然后我们很容易想......
  • CF1467E Distinctive Roots in a Tree
    突然发现深究一些树上问题还是挺有意思的哈。显然对于同一种权值的任意两个结点,其两端的部分都是不合法的。维护两个标记表示子树内均不合法与子树外均不合法即可。但相同权值的点对数量是\(O(n^2)\)的,我们要优化这个过程。发现很多点对都是无用的。DFS下去,遇到一个\(x\)......
  • 去重 distinct
       计算 ......
  • 论文阅读 Generalized Focal Loss: Learning Qualified and Distributed Bounding Box
    原始题目:GeneralizedFocalLoss:LearningQualifiedandDistributedBoundingBoxesforDenseObjectDetection中文翻译:GeneralizedFocalLoss:学习用于密集目标检测的QualifiedandDistributedBoundingBoxes发表时间:2020年6月8日平台:arxiv来源:南京理工-李翔文章......
  • AT_abc134_d Preparing Boxes题解
    简述题意这什么破翻译,看了AtCoder的英文才看懂。给定一个长度为\(n\)序列\(a\),要求构造一个数列\(b\),使得对于任意\(i\),满足:\(1\lei\len\)将\(b\)序列下标为\(i\)的倍数的值相加使得这个总和模2等于\(a_i\)。求序列\(b\)中值为1的个数与值为1......
  • 无涯教程-Matplotlib - 3D轮廓图(Contour)
    ax.contour3D()函数创建三维轮廓图,它要求所有输入数据采用二维规则形式,并在每个点处判断Z数据。在这里,显示三维正弦函数的三维轮廓图。frommpl_toolkitsimportmplot3dimportnumpyasnpimportmatplotlib.pyplotaspltdeff(x,y):returnnp.sin(np.sqrt(x**2+......
  • 无涯教程-Matplotlib - 等高线图(Contour)
    等高线图(有时称为“水平图”)是一种在二维平面上显示三维表面的方法。它在y轴上绘制两个预测变量XY,并以轮廓绘制响应变量Z。如果您想查看Z随两个输入X和Y的变化,等高线图是合适的,那么Z=f(X,Y)。MatplotlibAPI包含分别绘制轮廓线和填充轮廓的Contour()和Contourf()函数。这两个......
  • [AGC009B] Tournament 题解
    思路考虑树形\(\text{dp}\)。我们将每个人与把自己淘汰的人连边。得到一颗以一为根的树。由于我们需要求出必须赢的场数最多的那位选手,至少要赢多少场。考虑最多的限制。可以使用树型动态规划。每一次两个人比赛的代价为:\[dp_i=\max(dp_i,dp_j)+1\]这样就达成了最多的限......