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

2023-10-28 11:20

本文主要是介绍P1494 [国家集训队] 小 Z 的袜子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

#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;}elsereturn 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;
}

这篇关于P1494 [国家集训队] 小 Z 的袜子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292862

相关文章

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ2038 小Z的袜子(莫队算法)

作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。 终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命。 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R的袜子中随机选出两只来穿。 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。 你的任务便是告诉小Z,他

bzoj 2038: [2009国家集训队]小Z的袜子(莫队算法)

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 15386  Solved: 6996 [Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜

洛谷P1829 - [国家集训队]Crash的数字表格

Portal Description 给出\(n,m(n,m\leq10^7)\),计算\[ \sum_{i=1}^n \sum_{j=1}^m lcm(i,j) \bmod 20101009\] fdsa Solution 推推推...\[\begin{align} ans &= \sum_{i=1}^n \sum_{j=1}^m lcm(i,j) \\ &= \sum_{i=1}^n \su

[国家集训队]Tree

Tree 题解 一道LCT板题。 看样子就像是一道LCT的板题,只需要将乘与加的懒标记分别传下去即可。 ‘-’就是简单的树上加边与删边 ‘/'就是查询和,update时更新即可。 不过需要注意一下在乘与加时懒标记与总数的变化。 mul是乘的懒标记,add是加的懒标记,sum是当前和,siz是子树大小。 公式其实很好推的,关键是别直接乘与加,笔者就因为这个WA了 源码

P4555 [国家集训队] 最长双回文串 题解

P4555 [国家集训队] 最长双回文串 题解 补一个题解区没有的解法。 解法 通过哈希实现的线性做法,受讨论区启发。 考虑枚举双回文串的分割点,即分割点左右各是一个回文串,对于每个分割点,我们最大化两个回文串的长度,而且两个回文串是互不影响的。 问题转化为求原串的所有前缀的最长回文后缀和所有后缀的最长回文前缀。因为两个问题求法是类似的,所以这里只说如何求所有前缀的最长回文后缀。 我们

四川叙永13岁少女入选跨界跨项跳台滑雪国家集训队

周忆雯在练习武术动作。 钟欣 摄 周忆雯在练习武术动作。 钟欣 摄 中新网泸州1月21日电 (邹立杨 苏忠国)记者21日从四川泸州市叙永县文体广局获悉,经过前期严格的省级测试,叙永县13岁少女周忆雯入选跨界跨项跳台滑雪国家集训队,将赶赴芬兰卡皮奥训练基地进行为期3个月的集中训练。 据介绍,2005年出生的周忆雯是四川叙永人,自小酷爱武术,2011年进入叙永县武术培训中心接受武术培训,后于

一只袜子折射出来的处事习惯和心态

一只袜子折射出来的出事习惯和心态 今晚写了会儿代码头有点晕,于是休息会儿, 顺便洗洗上午泡的袜子,再不洗没得穿了。没 想到六只洗完后只剩下五只了,可想而知,还 有一只袜子在漂洗时没捞出来就冲厕所去了。 这一小悲剧直接导致最严重的后果也仅是堵塞 下水道而已,但却值得我深思,这不是小题大 做,反而是一件很严肃的事情,有必要对自己 反思一番。也许就是这样一件小事折

P1297 [国家集训队] 单选错位 对期望的理解

[国家集训队] 单选错位 - 洛谷 思路:  其实每个位置的得分只和前一个位置有关。 而他们俩的所有情况的期望就是答案的这部分。  ——这是难想的,我期望学的不好。 (题目给的是每种情况的所有位置的和,全加起来是答案;我们算的是这个位置的所有情况的值) 然后每个位置和前一个位置的情况可以分三种:(其实就是上面大佬的题解分析) ai == ai+1    对ai+1来说每次得分 1/

BZOJ2038小Z的袜子——莫队

Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。 你的任务便是告诉小Z,他