HYSBZ 2038 小Z的袜子 莫队算法

6人阅读 评论(0) 收藏 举报
分类:

保存下莫队模板,原理太容易懂了……慢慢学习!



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200005;

ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
struct query
{
	int l;
	int r;
	int id;

} q[MAXN];
int block[MAXN];
bool cmp(query a, query b)
{
	if (block[a.l] == block[b.l])
		return a.r < b.r;
	return block[a.l] < block[b.l];
}

int a[MAXN];
int res[MAXN];
ll num[MAXN];
ll len[MAXN];
int N, M;

ll add(int a)
{
	ll temp = num[a] * num[a];
	num[a]++;
	return num[a] * num[a] - temp;
}
ll remove(int a)
{
	ll temp = num[a] * num[a];
	num[a]--;
	return num[a] * num[a] - temp;
}

void solve()
{
	int l = 1;
	int r = 1;
	num[a[1]] = 1;
	int ans = 1;

	for (int i = 0; i < M; i++)
	{
		while (q[i].r > r)
			r++, ans += add(a[r]);
		while (q[i].r < r)
			ans += remove(a[r]), r--;
		while (q[i].l > l)
			ans += remove(a[l]), l++;
		while (q[i].l < l)
			l--, ans += add(a[l]);
		res[q[i].id] = ans;
	}
}

int main()
{

	scanf("%d%d", &N, &M);
	int blocksize = sqrt(N);
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &a[i]);
		num[a[i]] = 0;
		block[i] = (i - 1) / blocksize + 1;
	}
	for (int i = 0; i < M; i++)
	{
		scanf("%d%d", &q[i].l, &q[i].r);
		q[i].id = i;
		len[i] = q[i].r - q[i].l + 1;
	}
	sort(q, q + M, cmp);
	solve();
	for (int i = 0; i < M; i++)
	{
		ll g = gcd(res[i] - len[i], len[i] * (len[i] - 1));
		printf("%lld/%lld\n", (res[i] - len[i]) / g, len[i] * (len[i] - 1) / g);
	}
	return 0;
}

查看评论

DOM4J 使用简介

Dom4j 使用简介 作者:冰云 icecloud(AT)sina.com 时间:
  • icecloud
  • icecloud
  • 2003-12-17 23:58:00
  • 9234

bzoj2038 小Z的袜子 莫队算法

学习了一下莫队算法。核心就是在可以通过当前状态(l,r)的结果,能够在O(1)时间内推出相邻状态(l-1,r)(l+1,r)(l,r-1)(l,r+1)的结果的前提下,通过安排询问的次序,使总时间复杂...
  • lych_cys
  • lych_cys
  • 2016-01-23 16:35:58
  • 614

【BZOJ2038】小Z的袜子,第一次的莫队算法

传送门 写在前面:莫队竟如此暴力…… 思路:当初我对这个题的第一感觉——这个区间问题可以用线段树或者树状数组?答案当然是不能,于是我就去简单学了下莫队算法。在我看来,莫队(分块版,不是二维曼哈顿距...
  • xym_CSDN
  • xym_CSDN
  • 2016-03-14 19:59:27
  • 1933

HYSBZ 2038 小Z的袜子(hose)

Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,...
  • jtjy568805874
  • jtjy568805874
  • 2015-08-10 19:54:27
  • 503

【清橙 A1206】小Z的袜子(莫队算法)

【清橙 A1206】小Z的袜子(莫队算法) A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:1144   AC次数:319   平...
  • ChallengerRumble
  • ChallengerRumble
  • 2016-01-25 20:28:00
  • 1007

BZOJ 2038: [2009国家集训队]小Z的袜子(hose)|分块|莫队算法

似乎莫对算法才是正确的的姿势 不过直接分块暴力也可以 需要与处理几个东西和作诗那个题非常的相似,只不过那个题是强制在线的 维护到从开始每一个块的颜色的前缀和,块到块之间的答案 询问的时候,不跨...
  • ws_yzy
  • ws_yzy
  • 2016-01-23 09:31:07
  • 456

tsinsen-A1206 小Z的袜子(莫队算法)

题目: http://www.tsinsen.com/A1206 题意: 有许多袜子,每个有自己的颜色,排成一排。给出许多区间询问,求每个区间中任取两个袜子的颜色相同的概率,分数表示。 思路: 区间...
  • kopyh
  • kopyh
  • 2016-04-08 13:13:15
  • 421

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

题意:有n只袜子,每只袜子有自己的颜色,有m个询问l,r表示l到r这个区间内拿到两只颜色相同的袜子的概率是多少。 分析:第一次打莫队算法 莫队算法的思路是,对询问进行排序,以左端点...
  • qq_33229466
  • qq_33229466
  • 2016-08-16 21:10:12
  • 312

【莫队算法】小z的袜子(入门)

传说中,能解决一切可离线问题的莫队算法。一直没时间去认真看,看别人博客又看不懂,代码又感觉特别长。 最近小学弟去撸了下,发现看懂了,也顺带把我教会了=w=。 首先得要先懂得分块。 ...
  • QuanQqqqq
  • QuanQqqqq
  • 2017-09-05 16:39:40
  • 157

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

A - 小Z的袜子(hose) Time Limit:20000MS     Memory Limit:265216KB     64bit IO Format:%lld & %llu Sub...
  • zsc2014030403015
  • zsc2014030403015
  • 2016-05-04 21:23:51
  • 539
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 2781
    排名: 1万+
    Visitors
    Flag Counter
    文章分类
    最新评论