P1494 [国家集训队] 小 Z 的袜子

news2024/9/25 11:19:21

这一题是一个关于多次查询区间状态的一个问题,暴力肯定会超限,但是可以用莫队来优化暴力。

莫队的思想就是,用上一个区间的状态来更新当前区间的状态。

问题就是状态怎么更新以及求出当前区间的状态、也就是有多少对相同的袜子以及总共有多少袜子,通过这两个值可以求出来概率。

如何求出来有多少对相同的袜子,只需要遍历一遍当前区间记录每个颜色出现了多少次,当到了某个位置的时候,只需要知道之前的袜子有多少能跟自己配对即可。从区间中删除某个袜子也是如此,减去区间中跟自己颜色相同的袜子即可。

解释的不太好,看代码吧还是。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define x first
//#define y second
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, string> pis;
typedef struct{
	int l, r, i;
}aa;
const int mod = 1e9 + 7;
const int N = 1e6+ 10;
int dx[] = {-1, 0, 1, 0, -1, 1, 1, -1};
int dy[] = {0, 1, 0, -1, 1, 1, -1, -1};
int n, m;
int o[N], f[N][2];
aa p[N];
int x, y;
int st[N], s;

inline void add(int a) // 加上当前位置
{
    // 首先需要知道之前一共有多少袜子颜色跟自己相同,就是当前袜子可以跟之前的组成多少对。
	s += st[o[a]] ++;
    // 加完之后把这个颜色的袜子加一
}
inline void del(int a) // 减去当前位置
{
    // 先是把当前的袜子从区间内减去,
    // 然后需要知道区间内一共有多少袜子颜色跟自己相同,就是当前袜子可以跟区间内的袜子组成多少对。
	s -= -- st[o[a]];
}
inline void query(int i, int l, int r) // 记录当前区间的概率, i表示是第i个问题,因为要按顺序输出
{
	if(s == 0)  // 特判不能组成袜子 
	{
		f[i][0] = 0, f[i][1] = 1;
		return ;
	}
	int k = r - l + 1; 
	k = k * (k - 1) / 2; // 这两行通过组合数求出不分颜色可以组成多少对袜子。
	int a = __gcd(k, s); // 化简为最简分数,需要计算出来最大公约数。
//	cout << s << " " << k << " " << a << endl;
	f[i][0] = s / a, f[i][1] = k / a; // 记录分子、分母。
}
int id[N];
inline void sovle()
{
	st[0] = 1;
	cin >> n >> m;
	int len = sqrt(n);
	for(int i = 1; i <= n; i ++)
	{
		cin >> o[i];
		id[i] = (i - 1) / len + 1;
	 } 
	for(int i = 0; i < m; i ++)
	{
		cin >> p[i].l >> p[i].r;
		p[i].i = i;
	}
	stable_sort(p, p + m, [&](aa a, aa b){  // 莫队特殊的排序方式
		if(id[a.l] == id[b.l]) 
		{
			if(id[a.l] & 1 == 1) return a.r < b.r;
			else return a.r > b.r;
		}
		else
		return id[a.l] < id[b.l];	
	});
	int l = 0, r = 0, k = 0;
	for(int i = 0; i < m; i ++) 
	{
		while(r > p[i].r) del(r --);
		while(r < p[i].r) add(++ r);
		while(l > p[i].l) add(-- l);
		while(l < p[i].l) del(l ++); // 这四部可以通过之前的区间移动到当前区间,在移动的过程中进行计算。
		query(p[i].i, p[i].l, p[i].r); // 记录当前区间的概率
	}
	for(int i = 0; i < m; i ++)
	{
		cout << f[i][0] << "/" << f[i][1] << endl;
	}
}

signed main(void)
{
	IOS;
	int t = 1;
//	cin >> t;
	while(t --) sovle();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

禁止chrome浏览器更新方式

1、禁用更新服务 WinR调出运行&#xff0c;输入services.msc&#xff0c;进入服务。 在服务中有两个带有Google Update字样&#xff0c;双击打开后禁用&#xff0c;并把恢复选项设置为无操作。 2、删除计划任务 运行taskschd.msc&#xff0c;打开计划任务程序库&#xff0c;在…

uniapp 中添加 vconsole

uniapp 中添加 vconsole 一、安装 vconsole npm i vconsole二、使用 vconsole 在项目的 main.js 文件中添加如下内容 // #ifdef H5 // 提交前需要注释 本地调试使用 import * as vconsole from "vconsole"; new vconsole() // 使用 vconsole // #endif三、成功

Redis中的数据类型及与Mysql数据库同步方法

1.Redis中的数据类型 Redis中的数据类型包括&#xff1a; 排行榜应选用有序集合Zset&#xff0c;原因是排行榜既要去重&#xff0c;也要排序&#xff0c;用这种结构最为合适。 2.Redis和MySQL之间的同步常见方法 要实现Redis和MySQL之间的同步&#xff0c;常见方法包括&…

为什么网上的流量卡都有禁发地区呢?流量卡管控地区整理!

在网上购买过流量卡的朋友应该都知道&#xff0c;但凡是运营商推出的大流量优惠套餐&#xff0c;在套餐详情中都是有禁发地区&#xff0c;只不过每张卡的禁发地区不同而已。 设置禁发地区的主要目的还是为了防止一些电信诈骗案件的发生&#xff0c;或者违法违规利用电话卡的情…

Windows-Oracle11g 安装详解-含Navicate远程连接配置 -本地监听设置及更换navicate环境指向的oci.dll

文章目录 1 下载地址&#xff1a;2 安装2.1 解压缩运行setup2.2 修改配置文件2.3 一直选择默认&#xff0c;直到设置口令2.4 Oracle服务启动 3 登录Oracle4 解锁普通用户scott5 简化连接&#xff08;可做可不做&#xff09;5.1 修改配置文件5.2 添加内容 6 配置本地监听6.1 修改…

正点原子嵌入式linux驱动开发——Linux RTC驱动

RTC也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于Linux系统而言时间是非常重要的&#xff0c;就和使用Windows电脑或手机查看时间一样&#xff0c;在使用Linux设备的时候也需要查看时间。本章就来学习一下如何编写Linux下的RTC驱动程序。 Linux内核RTC驱动…

黑五网一来袭,卖家该如何做好旺季备货

亚马逊Prime Day大促刚刚完美落幕&#xff0c;黑五网一又将接着热度浪潮来袭&#xff0c;对于亚马逊卖家来说&#xff0c;黑五、网一是一年中非常重要的一个营销节点&#xff0c;是能让店铺销售量提升一个阶梯的重要机会。 在去年&#xff0c;美国消费者在黑五期间的消费额达到…

Java操作符

&#x1f435;由于Java的操作符和C语言的操作符有很多相同之处&#xff0c;所以本篇文章只讲解Java操作符的重点和与C语言的不同点 1. 四则运算操作符&#xff1a; - * / % 1.做除法和取模时右操作数不能为0&#xff1b; 2.取模的有操作数可以是double类型&#xff0c;但是没有…

电脑监控软件哪些比较好用

电脑监控软件在当今信息化时代越来越受到人们的关注&#xff0c;它们可以用于保护公司的商业机密&#xff0c;防止员工在工作中做一些不恰当的事情&#xff0c;以及在家庭中监控孩子的上网行为等。 本文将介绍一些比较好用的电脑监控软件&#xff1a; 一、域之盾软件 这款软件…

Linux之线程池

线程池 线程池概念线程池的应用场景线程池实现原理单例模式下线程池实现STL、智能指针和线程安全其他常见的各种锁 线程池概念 线程池&#xff1a;一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待…

【JavaSE语法】运算符

一、 什么是运算符 计算机的最基本的用途之一就是执行数学运算&#xff0c;运算符即对操作数进行操作时的符号&#xff0c;不同运算符操作的含义不同 Java中运算符可分为以下&#xff1a;算术运算符( - * /)、关系运算符(< > )、逻辑运算符、位运算符、移位运算符以及条…

第十六章 反射与注解

所有 Java 类均继承了 bjet 类&#xff0c;在 Object 类中定义了一个 getClass0方法&#xff0c;该回一个类型为Class的对象。例如下面的代码: JTextField textField new JTextField();//创建JTextField对象 Class textFieldC textField.getClass();//获取Class对象 利用Cla…

Java练习题2020-3

统计从1到N的整数中,所有立方值的平方根为整数的数的个数 输入说明&#xff1a;整数 N(N<10000)&#xff1b; 输出说明&#xff1a;符合条件的数的个数&#xff0c;如4^3648^2 输入样例&#xff1a;10 输出样例&#xff1a;3 (说明&#xff1a;样例中符合条件的3个数是1、4、…

【Linux】部署单机项目以及前后端分离项目

Linux部署单机项目&#xff1a; 优点&#xff1a; 简化了系统管理&#xff1a;由于所有服务都在同一台机器上运行&#xff0c;因此可以简化系统管理和维护。 提高了性能&#xff1a;由于没有网络延迟和其他因素的影响&#xff0c;所以可以提高系统的性能。 缺点&#xff1a; 容…

C/C++宏定义和宏函数

1.概述 C/C 的宏定义和宏函数非常的有用&#xff0c;由于最近看Android 的jni代码时老是会看见如下图所示的宏定义&#xff1a; 定义完后使用的时候直接如下使用就行了&#xff1a; JMI_DECLARE_CLASS(Context,android.content);这样就能很简洁的将一些逻辑重复的代码管理起来…

71 搜索二维矩阵

搜索二维矩阵 题解1 Z字查找(tricky)题解2 一次二分查找题解3 两次二分查找 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target …

OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”

夕小瑶科技说 原创 作者 | 小戏 一旦谈及未来 AI&#xff0c;除了天马行空的科幻畅想&#xff0c;不可避免的也有未来 AI 时代的末日预言。从 AI 武器化到 AI 欺骗&#xff0c;从邪恶 AI 到 AI 掌权&#xff0c;人工智能&#xff0c;尤其是通用人工智能的风险始终都清清楚楚的…

nrf52832 开发板入手笔记:资料搜集

前言 最近翻箱&#xff0c;发现了两块几年前买的 NRF52832 与 NRF52840 的开发板&#xff0c;打算搭个 BLE 的开发环境 NRF52832 与 NRF51822 之前用过&#xff0c; NRF52840 没有用过&#xff0c;好像是 BLE4 与 BLE5 的区别吧 相关介绍 除了开发板&#xff0c;最重要的还是…

有线网卡通过无线网卡使其它设备上网

我现在的网络是无线路由器连接公网&#xff0c;电脑上的无线网卡连接路由器使电脑上网&#xff0c;这是完全正常的连接方式。 我现在又有了一台嵌入式设备&#xff0c;它只有有线网口&#xff0c;所以就只能用有线的方式连网&#xff0c;但是我的无线路由器不在电脑旁边&#x…

【23种设计模式】依赖倒置原则

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…