链接:

https://vjudge.net/contest/308446#problem/C

题意:

Chika gives you an integer sequence a1,a2,…,an and m tasks. For each task, you need to answer the number of " friendly pairs" in a given interval.

friendly pair: for two integers ai and aj, if i<j and the absolute value of ai−aj is no more than a given constant integer K, then (i,j) is called a "friendly pair".A friendly pair (i,j) in a interval [L,R] should satisfy L≤i<j≤R.

思路:

莫队算法,刚学的莫队,第一每次更改都查询位置,太蠢了.

用两个数组记录每个位置查询的下标.减少时间开销.

代码:

#include <bits/stdc++.h>
using namespace std; const int MAXN = 3e4+10; struct Node
{
int l, r;
int pos;
}node[MAXN];
int Tree[MAXN];
int a[MAXN], b[MAXN];
int L[MAXN], R[MAXN], P[MAXN];
int Res[MAXN];
int n, m, k;
int pos;
int l, r, res;
int unit; int Lowbit(int x)
{
return (-x)&x;
} void AddTree(int x, int v)
{
while (x <= n)
{
Tree[x] += v;
x += Lowbit(x);
}
} int GetSum(int x)
{
int sum = 0;
while (x > 0)
{
sum += Tree[x];
x -= Lowbit(x);
}
return sum;
} void Add(int x)
{
int rsum = GetSum(R[x]);
int lsum = GetSum(L[x]);
res += rsum-lsum;
AddTree(P[x], 1);
} void Del(int x)
{
AddTree(P[x], -1);
int rsum = GetSum(R[x]);
int lsum = GetSum(L[x]);
res -= rsum - lsum;
} void Query(int ql, int qr)
{
while (l < ql)
Del(l++);
while (l > ql)
Add(--l);
while (r < qr)
Add(++r);
while (r > qr)
Del(r--);
} bool cmp(Node& a, Node& b)
{
if (a.l/unit != b.l/unit)
return a.l/unit < b.l/unit;
return a.r < b.r;
} int main()
{
scanf("%d %d %d", &n, &m, &k);
unit = sqrt(n);
for (int i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
for (int i = 1;i <= m;i++)
scanf("%d %d", &node[i].l, &node[i].r), node[i].pos = i;
sort(b+1, b+1+n);
pos = unique(b+1, b+1+n)-b;
for (int i = 1;i <= n;i++)
{
P[i] = lower_bound(b+1, b+pos, a[i])-b;
R[i] = lower_bound(b+1, b+pos, a[i]+k)-b;
if (b[R[i]] != a[i]+k)
R[i]--;
L[i] = lower_bound(b+1, b+pos, a[i]-k)-b-1;
}
sort(node+1, node+1+m, cmp);
l = 1, r = 0;
for (int i = 1;i <= m;i++)
{
Query(node[i].l, node[i].r);
Res[node[i].pos] = res;
}
for (int i = 1;i <= m;i++)
printf("%d\n", Res[i]); return 0;
}
/*
7 2 3
2 5 7 5 1 5 6
6 6
1 3
4 6
2 4
3 4
7 2 3
2 5 7 5 1 5 6
1 3
4 6
*/

HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)的更多相关文章

  1. BZOJ3289【莫队算法+树状数组+离散化】

    思路: 区间逆序数即是交换次数. 逆序数,可以用树状数组吧. 怎么处理区间变换的时候求逆序数啊.. 这里分成左边的增/删,右边的增/删 因为是按时序插入, 所以左边增,增一个数,计算:ans+=sun ...

  2. 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...

  3. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  5. BZOJ3289 Mato的文件管理(莫队算法+树状数组)

    题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...

  6. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...

  7. BZOJ 3289:Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话 ...

  8. 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...

  9. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

随机推荐

  1. python - socket通信笔记

    参考: 通过编写聊天程序来熟悉python中多线程和socket的用法:https://www.cnblogs.com/mingjiatang/p/4905395.html python socket ...

  2. Hibernate一级缓冲

    Hibernate的一级缓冲 什么是缓冲 缓冲概念: 数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低. 解决办法: 把数据存在内存中, ...

  3. 获取使用GitHub api和Jira api Authentication的方法

    近段时间在搭建我司的用例管理平台,有如下需求: 1.需要根据项目--版本--轮次的形式来管理项目用例,用例统一保存在git工程. 2.执行用例时,如果用例执行失败,可以通过平台在Jira上提bug. ...

  4. 添加linux中svn的用户和密码

    1:首先找到svn路径 find / -iname "svn" 一般找到svn路径之后就可以找到配置文件位置啦 svn/svnrepos/jgcp/conf 2:进入目录之后修改a ...

  5. vim加脚本注释和文本加密

    vim /etc/vimrc 一.李导版本 autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" fun ...

  6. 使用itchat完成微信自动回复

    import itchat from itchat.content import * # 微信自动回复 @itchat.msg_register([TEXT]) def text_reply(msg) ...

  7. linux 系统目录权限

    小结: 目录的读.写.执行权限 1. 可读r:表示具有浏览目录 下面文件及子目录的权限 ls dir 1)如果没有x权限,则不能进到目录,既无法执行cd dir 2)如果没有x权限,ls列表时可以看到 ...

  8. [19/06/09-星期日] CSS基础_示例

    一.图片格式&Hack(尽量不要使用) IE6对图片png-24的透明效果不支持,IE6中背景会发灰,可以使用png-8来代替.但是使用png-8代替之后清晰度会有所下降. 使用js来解决该问 ...

  9. RabbitMq学习5-路由(Routing)

    一.路由(Routing) 在前面的教程中,我们实现了一个简单的日志系统.可以把日志消息广播给多个接收者. 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集.例如,我们只需要把严重的错 ...

  10. 小白学Python——Matplotlib 学习(1)

    众所周知,通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象.而大多数编程语言都有自己的绘图工具,matplotlib就是基于Python的绘图工具包,使用它我们 ...