首页 > 其他分享 >T461430 「Daily OI Round 4」Mine

T461430 「Daily OI Round 4」Mine

时间:2024-06-04 20:45:45浏览次数:19  
标签:T461430 采矿点 OI int res 线段 Mine LL

T461430 「Daily OI Round 4」Mine

T461430 「Daily OI Round 4」Mine

解题思路

首先,有个简单的想法就是我们考虑选择的那个采矿点是谁,但是我们发现,如果直接算,会重复,比如采矿点 \(A\) 和 采矿点 \(B\) 所能采集的线段集合如果有交,显然会方案数会重复。

这里学到一个计数的技巧:

考虑人为钦定一些顺序或者限制,我们观察对于任意一种选择线段的方案,由于选择的线段非空,我们把所选的线段按左端点排序,那么我们考虑第一个线段,其第一个碰到的采矿点,我们以这个为标识,我们钦定这个线段被这个采矿点所唯一监管

那么任意一组方案,必然会被这样钦定的唯一采矿点所监管,这样我们就把答案拆成了若干个采矿点的贡献之和,这样一定是不重不漏的,因为任意一组方案按上面的方法钦定划分,必然只会被唯一一个采矿点监管。

故我们只要计算,被某个采矿点监管的方案即可,然后累加。

我们设被 \(i\) 这个采矿点所监管的线段(每个线段第一个碰到的采矿点)的数量为 \(b_i\),然后经过 \(i\) 这个采矿点的线段数量为 \(c_i\),我们可以得到这个点的贡献为:\((2^{b_i}-1)\times 2^{c_i-b_i}\)。

我们可以这样理解,我们要计算每个点的贡献,则必须要选择一条被其监管的线段,然后其余线段可选可不选。

故最后答案为:\(\sum_{i=1}^m(2^{b_i}-1)\times 2^{c_i-b_i}\)。

Code

#include <bits/stdc++.h>

typedef long long LL;

const int N = 1e5 + 10, mod = 998244353;
int l[N], r[N], a[N], b[N], c[N];

LL ksm(LL a, LL b) {
	LL res = 1;
	while (b) {
		if (b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res;
}

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

	int n, m;
	std::cin >> n >> m;

	for (int i = 1; i <= n; i++) {
		std::cin >> l[i] >> r[i];
	}

	for (int i = 1; i <= m; i++) {
		std::cin >> a[i];
	}

	std::sort(a + 1, a + 1 + m);

	for (int i = 1; i <= n; i++) {
		l[i] = std::lower_bound(a + 1, a + 1 + m, l[i]) - a;
		r[i] = std::upper_bound(a + 1, a + 1 + m, r[i]) - a;
		c[l[i]]++, c[r[i]]--;
		if (l[i] < r[i]) {
			b[l[i]]++;
		}
	}

	for (int i = 1; i <= m; i++) {
		c[i] += c[i - 1];
	}

	LL ans = 0;

	for (int i = 1; i <= m; i++) {
		ans += (ksm(2, b[i]) - 1) * ksm(2, c[i] - b[i]) % mod;
		ans %= mod;
	}

	if (ans < 0) ans += mod;

	std::cout << ans << '\n';

	return 0;
}

标签:T461430,采矿点,OI,int,res,线段,Mine,LL
From: https://www.cnblogs.com/xiaole-jackle/p/18231658

相关文章

  • 将 Android 应用程序嵌入华为移动设备的最佳方式是什么?
    我是华为移动应用程序开发的新手。i)AndroidStudio代码是否可以移植到DevEcoIDE中?ii)请就华为移动应用程序的开发要求和期望提供一些建议。iii)AndroidStudio-kotlin和Java开发人员的最佳方法iv)有关华为移动应用程序开发指南和要求的资源指南预先感谢,请......
  • 基于BungeeCord搭建 多服务端 Minecraft 我的世界 Bedwars服务器 教程
    本文基于BungeeCord搭建多服务我的世界起床战争服务器本文章后续会持续更新由于多世界插件EssentialsX-Core与Bedwars1058在部分指令上有冲突,于是建议使用BungeeCord(之后我简称BC)搭建多服务端minecraft服务器,将起床Bedwars服务分离出来,顺便将其他的服务比如登陆大厅等分离出......
  • uniapp打包Android跟iOS禁用录屏截屏
    1.禁用截屏和录屏的目的保护敏感信息:防止用户截屏或录屏分享应用中的敏感信息,如个人隐私数据、金融信息、商业机密等。版权保护:保护应用中的版权内容,如视频、图片、文本内容,防止未经授权的复制和传播。数据安全:防止恶意用户利用截屏或录屏功能进行信息盗取,增加应用的数据......
  • android如何保存对象list到file
    //存储publicstaticvoidsaveObjectsToFile(List<?extendsSerializable>objects,Stringfilename)throwsIOException{Filefile1=BaseApplication.getInstance().getApplicationContext().getExternalFilesDir("");FileappDir=new......
  • 【NOIP2019普及组复赛】题3:纪念品
    题3:纪念品【题目描述】小伟突然获得一种超能力,他知道未来T天N种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:1.任选一个纪念品,若手上有足够金币,以当日价格购买该......
  • 【NOIP2019普及组复赛】题1:数字游戏
    题1:数字游戏【题目描述】小K同学向小PPP同学发送了一个长度为88......
  • P10536 [Opoi 2024] 二十六点 题解
    比较直接的做法。当\(P_x=1\)时显然可以暴力DP,设\(f_{x,c}\)表示\(x\)的子树中以\(c\)开头的最长不下降子序列的长度。直接转移即可。\(P_x\neq1\)的时候呢?我们发现,所谓“忽略掉这些路径中的第\(2\)到第\(P_x\)个的点”,代表的就是按照深度转移,大概就是这样:......
  • [NOIP2015 提高组] 跳石头
    [NOIP2015提高组]跳石头跳石头题目描述一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有$N$块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点......
  • 编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)
    引言现在你已经拥有了c++的基础语法知识,人物已经有了基本属性,那么想要打怪,手里必须要有趁手的武器,各种算法就是手中的武器,要根据怪物的不同特性来选择不同的武器。本章节讲的就是新手第一把武器:排序算法。所谓排序算法就是把一些乱序的序列按照从小到大或从大到小进行排序,是......
  • ABC 312 E Tangency of Cuboids
    题意给定三维空间的n个长方体,每个长方体以其一条体对角线的坐标形式给出,即对于每一个长方体i,其一条体对角线的两个端点的坐标会给出。现在对于每一个给出的长方体,求出其它给出的长方体,与其共面的长方体个数。(保证每个长方体两两不相交)思路首先我们第一个关注的应该是坐标的数......