莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)
/*
莫队算法:求出[l, r]上取出两只相同袜子的个数。
莫队算法是离线处理一类区间不修改查询类问题的算法。如果你知道了[L,R]的答案,可以在O(1)的时间下得到
[L,R-1]和[L,R+1]和[L-1,R]和[L+1,R],4个while是精华!
对于莫队算法我感觉就是暴力。只是预先知道了所有的询问。可以合理的组织计算每个询问的顺序以此来降低复杂度。
详细解释:http://blog.csdn.net/bossup/article/details/39236275
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; typedef long long ll;
const int MAXN = 5e4 + ;
const int INF = 0x3f3f3f3f;
struct Data
{
int b, l, r, id;
ll x, y;
Data () {}
Data (int b, ll l, ll r, int id) : b (b), l (l), r (r), id (id) {};
}data[MAXN];
int cnt[MAXN];
int a[MAXN];
int n, m;
ll ans; bool cmp_pre(Data x, Data y)
{
if (x.b == y.b) return x.r < y.r;
return x.b < y.b;
} bool cmp_id(Data x, Data y) {return x.id < y.id;} ll cal(int v) {return (ll) v * v;} void updata(int v, int add)
{
ans -= cal (cnt[v]);
cnt[v] += add;
ans += cal (cnt[v]);
} ll GCD(ll a, ll b) {return b == ? a : GCD (b, a % b);} void Modui(void)
{
sort (data+, data++m, cmp_pre);
memset (cnt, , sizeof (cnt)); int l = , r = ; ans = ;
for (int i=; i<=m; ++i)
{
while (data[i].l < l) updata (a[--l], );
while (data[i].l > l) updata (a[l], -), l++;
while (data[i].r > r) updata (a[++r], );
while (data[i].r < r) updata (a[r], -), r--; if (data[i].l == data[i].r)
{
data[i].x = ; data[i].y = ;
continue;
}
data[i].x = ans - (data[i].r - data[i].l + );
data[i].y = (ll) (data[i].r - data[i].l + ) * (data[i].r - data[i].l);
ll k = GCD (data[i].x, data[i].y);
data[i].x /= k; data[i].y /= k;
} sort (data+, data++m, cmp_id);
for (int i=; i<=m; ++i)
{
printf ("%lld/%lld\n", data[i].x, data[i].y);
}
} int main(void) //BOJ 2038 [2009国家集训队]小Z的袜子(hose)
{
// freopen ("BZOJ_2038.in", "r", stdin); while (scanf ("%d%d", &n, &m) == )
{
for (int i=; i<=n; ++i) scanf ("%d", &a[i]); int block = (int) sqrt (n * 1.0);
for (int i=; i<=m; ++i)
{
int l, r;
scanf ("%d%d", &l, &r);
data[i] = Data (l / block, l, r, i);
} Modui ();
} return ;
}
莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)的更多相关文章
- 莫队乱搞--BZOJ2038: [2009国家集训队]小Z的袜子(hose)
$n \leq 50000$的$\leq 50000$的数字序列,$m \leq 50000$个询问,每次问一个区间中随机拿两次(不放回)拿到相同数字的概率,以既约分数形式输出. 莫队入门.把询问按“ ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块
分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 2938 Solved: 13 ...
随机推荐
- HDU 4416 (后缀自动机)
HDU 4416 Good Article Good sentence Problem : 给一个串S,和一些串T,询问S中有多少个子串没有在T中出现. Solution :首先对所有的T串建立后缀自 ...
- 洛谷 P1608 路径统计
P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...
- iframe显示滚动条
子页面通过iframe加载,出现了竖向滚动条 最后查出原因:文档申明 iframe有滚动条的页面的文档申明 <!DOCTYPE html> 改成如下就行了 <!DOCTYPE HTM ...
- CSS头像右上角的讨厌红点
就是这个讨厌的红点,如图: 说明: 1.主要用到position定位: 2.使用border-radius画圆角: 源码: <!DOCTYPE html> <html> < ...
- openstack setup demo Overview
Overview openstack是一套开源的云计算部署平台,通过一系列service提供IAAS.每一个service都提供API.具体的service列表如下: dashboard Horizo ...
- Java随机生成常用汉字验证码
原文:http://www.open-open.com/code/view/1422514803970 import java.awt.Color; import java.awt.Font; imp ...
- IOS程序崩溃报告管理解决方案(Crashlytics 在2014-09-24)
预研Crashlytics 在2014-09-241:实现原理在原理上,Crashlytics通过以下2步完成崩溃日志的上传和分析:(1)提供应用SDK,你需要在应用启动时调用其SDK来设置你的应用 ...
- 怎样载入指定路径的Logback.xml
今天想外置logback.xml,谢了例如以下代码 File logbackFile = new File("./conf/logback.xml"); if (logbackFi ...
- 编程算法 - 两个升序列的同样元素 代码(C)
两个升序列的同样元素 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 两个升序列的同样元素, 须要使用两个指针, 依次遍历, 假设相等输出, 假设小于或 ...
- C# 实现WEBSOCKET聊天应用示例
C# 实现WEBSOCKET聊天应用示例 http://blog.163.com/da7_1@126/blog/static/10407267820121016103055506/ 2012-11-1 ...