首页 > 其他分享 >「Luogu P5441」【XR-2】伤痕

「Luogu P5441」【XR-2】伤痕

时间:2024-11-26 14:46:34浏览次数:6  
标签:结点 frac Luogu 城市 修建 道路 choose XR P5441

人类智慧题, 然而我是蒟蒻 qwq.

题目

X 国经历了一场前所未有的大地震,人们伤痕累累,整个国家破碎不堪。

为了帮助人们痊愈,也为了让 X 国能够生存下去,X 国国王决定重建 X 国。

国王决定先建造 \(n\) 座城市,由于国王喜欢奇数,所以 \(n\) 为奇数。

城市建造完后,需要给每两座城市之间都修建一条道路,即一共需要修建 \(\frac{n(n-1)}{2}\) 条道路。

不过,修建双向道路的成本太高了,建造完 \(n\) 座城市后剩下的经费最多只够修建 \(n\) 条双向道路,而其余的道路只能修建成单向的。好在方向并不会影响修建单向道路所需的费用,因此所有单向道路的方向可以任意决定。

另外,等到重建完成后,国王决定将 \(4\) 座城市钦定为 X 国的核心城市。为促进 X 国的发展,这 \(4\) 座核心城市中的任意两座城市,必须能够在不经过非核心城市的情况下相互到达。

国王希望,你能够给他一种道路修建方案,使重建完成后选择 \(4\) 座核心城市的方案数最大化。

Luogu

分析

首先应该要想到 4 个点且两两之间有一条边是很容易形成强联通分量的, 因此我们要考虑最小化不形成强连通分量的方案数.

先找到 4 个点不形成强连通分量的情况. 直接枚举连边需要枚举 \(2^4 = 16\) 种情况, 而点只有 \(4\) 个, 因此我们应该考虑枚举被孤立的点数:

  • 1 个结点被孤立: 该结点出度/入度为 \(3\)
  • 2 个结点被孤立: 4 个结点分为两组, 每组 2 个结点, 两组之间只存在单向连边

注意上面列出的 3 种情况的任意组合都可能同时出现.

不妨先考虑减少第 1 种情况: 一个结点向其它 3 个结点各连一条有向边.

假设结点 \(i\) 的出度为 \(d_{i}\), 那么结点 \(i\) 能形成的方案数为 \({d_{i}\choose{3}} = \frac{d_{i}(d_{i} - 1)(d_{i} - 2)}{6}\), 我们希望 \(\sum_{i=1}^{n}{d_{i}\choose 3}\) 尽可能小, 而根据题意, 所有结点的出度之和为 \(\sum_{i=1}^{n}d_{i}=\frac{n(n-1)}{2}-n = \frac{n(n-3)}{2}\), 相当于我们找一个 \(d\) 的分配方案使得 \(\sum_{i=1}^{n}{d_{i}\choose 3}\) 最小.

令 \(f(x) = \frac{x (x - 1)(x - 2)}{6}\), 求导得 \(f^{\prime}(x) = \frac{3x^{2} - 6x + 2}{6} = \frac{3(x-1)^{2} - 1}{6}\), 当 \(x \geq 2\) 时 \(f^{\prime}(x)>0\) 为下凸函数, 因此每个结点的出度相等时 \(\sum_{i=1}^{n}{d_{i}\choose 3}\) 最小, 为 \(n \cdot {\frac{n-3}{2} \choose 3} = \frac{n(n-3)(n-5)(n-7)}{48}\).

由于第 1 种情况可以包含后面 2 种情况, 我们不妨思考能否通过构造使得后面 2 种情况不会单独出现. 事实上, 答案是可以的 (反正我想不到就是了 /dk).

对于这种 \(n\) 个点没有什么不同的情形, 一般情况下每个点 treat the same 就会得到最优解. 因此, 我们先试着把 \(n\) 条无向边给每个结点 2 条 (每个结点连出一条, 然后被连入一条, 但都是无向边), 将 \(n\) 个结点看作分布在圆上的正 \(n\) 边形的顶点, \(n\) 为奇数所以每个结点分别与它所在直径左右两侧最近的结点连一条无向边, 此时 2 条无向边将其余 \(n-3\) 个结点平均分为了两边, 我们将当前结点的出边连向右边的 \(\frac{n-3}{2}\) 个结点, \(n\) 个结点都这样连完之后会发现所有连入这个结点的边只会从左边的 \(\frac{n-3}{2}\) 个结点出发.

[1]

可以发现这种构造满足了只有第 1 种情况才会单独出现, 同时第 1 种情况的方案数最少, 从而我们得到了最终答案: \({n\choose 4} - \frac{n(n-3)(n-5)(n-7)}{48} = \frac{n(n-3)(n^{2} + 6n - 31)}{48}\).

代码

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	i64 n;
	std::cin >> n;

	if (n == 1) {
		std::cout << "0\n0";
		return 0;
	}

	std::cout << n * (n - 3) * (n * n + 6 * n - 31) / 48 << "\n";
	int m = (n + 1) / 2;
	for (int i = 0; i < n; ++i) {
		std::vector<int> g(n, 0);
		for (int j = 1; j <= m; ++j) {
			g[(i + j) % n] = 1;
		}

		for (int j = 0; j < n; ++j) {
			std::cout << g[j] << " ";
		}
		std::cout << "\n";
	}
	return 0;
}

Further Reading


  1. 图片出自 题解 P5441 【XR-2】伤痕 - lsoer ↩︎

标签:结点,frac,Luogu,城市,修建,道路,choose,XR,P5441
From: https://www.cnblogs.com/huangliwen/p/18570145

相关文章

  • 「Luogu P4516」[JSOI2018] 潜入行动
    题目外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSOIer抵御外星人的进攻。在黄金舰队就位之前,JYY打算事先了解外星人的进攻计划。现在,携带了监听设备的特工已经秘密潜入了外星人的母舰,准备对外星人的通信实施监听。外星......
  • 每日一题:https://www.luogu.com.cn/problem/P1106
    题目链接:https://www.luogu.com.cn/problem/P1106#include<iostream>#include<string>usingnamespacestd;intmain(){intn,k,mu;stringnum;intt=1,wei,ti=0;;intarr[260];boolyes=0;cin>>num>>k;n=num.l......
  • [luoguP1903] 数颜色
    题意原题链接给定序列\(a\),每次查询一个区间\([l,r]\)中有多少个不同的数,或进行单点修改。sol如果不修改的话,本题就是普通莫队[luoguSP3267]D-query由于有修改,所以需要再增加一维,记录这次查询是在多少次修改以后查询的,然后在莫队代码后面添加对修改次数的处理,即暴力修改......
  • [luoguP11324] Speaker
    题意原题链接给定一个带权无根树,第\(i\)个节点上有一个数\(c_i\),每次询问给定两个点\(x,y\),在无根树上任选一点\(z\),使\(c_x+c_y+c_z-dist(x,z)-dist(z,y)\)最大,输出最大的值。sol考虑\(z\)可能有两种情况,要么是\(x\toy\)的路径上的一点\(t\),要么从路径上的一点......
  • [luoguP11323] Happy Card
    题意原题链接有\(n\)种牌,第\(i\)种牌有\(a_i\)张,每次可以出\(1\)张(单牌)、\(2\)张(对子)或\(4\)张相同的牌(四炸),或是\(3\)张相同的牌及\(1\)张不同的牌(三带一),求把牌出完最少需要多少次。sol赛时看到这道题,就想到了[luoguP2668]斗地主,由于没有顺子,因此可以直接考虑......
  • [luoguSP3267] D-query
    题意给定\(n\)个数\(a_1\cdotsa_n\)和\(q\)个查询,每次查询区间\([l,r]\)中,\(a\)的不同数的个数sol本题不强制在线,因此可以考虑离线算法,如莫队。莫队是一个非常神奇的算法,它的基本思想是:将区间进行某种排序后,通过移动\(l,r\)指针,每次移动时处理答案的增减来得到答......
  • [lnsyoj1469/luoguP4644] Cleaning Shifts
    题意原题链接给定\(n\)个区间\([a_i,b_i]\),第\(i\)个区间拥有权值\(S_i\),求使用这些区间将区间\([M,E]\)(包含所有\(n\)个区间)完全覆盖(两端点不需要重合)所需区间的权值最小值。sol一道板子题,本来是数据结构优化DP,但是被最短路薄纱了。考虑将每一个时间点视作一个节......
  • 【GESP】C++一级练习 luogu-B2060, 满足条件的数累加
    一级知识点循环和取余操作练习题,基础练习。题目题解详见:https://www.coderli.com/gesp-1-luogu-b2060/【GESP】C++一级练习luogu-B2060,满足条件的数累加|OneCoder一级知识点循环和取余操作练习题,基础练习。https://www.coderli.com/gesp-1-luogu-b2060/......
  • 【GESP】C++一级练习 luogu-B2058, 奥运奖牌计数
    一级知识点循环和求和练习。题目题解详见:https://www.coderli.com/gesp-1-luogu-b2058/https://www.coderli.com/gesp-1-luogu-b2058/https://www.coderli.com/gesp-1-luogu-b2058/2008 年北京奥运会,A国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下A国......
  • JRebel and XRebel离线安装
    近期,使用JRebelandXRebel,发现总是安装不上,可能是网络的原因吧。所以就使用离线方式进行安装。JRebel是一款用于Java开发的生产力工具。它的主要功能是加速开发周期,通过在不重启JVM的情况下即时加载代码变更。这样,开发者可以立即看到代码修改的效果,而无需重新部署应用程序,从......