HDU - 6534 Chika and Friendly Pairs
这个题其实也是很简单的莫队,题目要求是给一个序列,询问l-r区间内部,找到有多少对答案满足 i < j 并且
| a[ i ] -a[ j ] | <=k 也就是有多少对,满足差值小于k的个数。
把这个式子展开,其实就是-k<= a[ i ] -a [ j ] <= k 也就是 a[ j ] -k <= a[ i ] <= a[ j ] + k,也就是说,对于某个 j 位置,我们需要在询问的区间内,找到 i < j 并且在[ a[j] -k ,a[j] +k ] 范围中的数的个数,这个其实可以通过树状数组区间查询即可。
但是对于k来说,太大了,树状数组也开不下,所以我们要进行离散化,把a[i],a[i]+k,a[i]-k位置存下来即可(老套路了)保证每个位置都能找得到,然后区间查询即可,然后每次算贡献即可。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxx = 2e5+;
int block;
int a[maxx];
std::vector<int>vx;
int sum[maxx];
int ans[maxx];
int num;
int n,m,k;
struct node{
int l,r;
int id;
friend bool operator < (const node &a,const node &b){
if(a.l/block==b.l/block){
return a.r<b.r;
}
return a.l/block<b.l/block;
}
}q[maxx];
int low[maxx];
int up[maxx];
int p[maxx];
int lowbit(int x){
return x&(-x);
}
void add(int x,int w){
for(int i=x;i<=*n;i+=lowbit(i)){
sum[i]+=w;
}
return ;
}
int getsum(int x){
int s=;
for(int i=x;i;i-=lowbit(i)){
s+=sum[i];
}
return s;
}
void add(int x){
num+=getsum(up[x])-getsum(low[x]-);
add(p[x],);
}
void del(int x){
add(p[x],-);
num-=getsum(up[x])-getsum(low[x]-);
}
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
block=sqrt(n);
memset(sum,,sizeof(sum));
memset(ans,,sizeof(ans));
vx.clear();
///绝对值小于等于K
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
vx.push_back(a[i]);
vx.push_back(a[i]+k);
vx.push_back(a[i]-k);
}
num=;
sort(vx.begin(),vx.end());
vx.erase(unique(vx.begin(),vx.end()),vx.end());
int sz=vx.size();
for(int i=;i<=n;i++){
p[i]=lower_bound(vx.begin(),vx.end(),a[i])-vx.begin()+;
low[i]=lower_bound(vx.begin(),vx.end(),a[i]-k)-vx.begin()+;
up[i]=lower_bound(vx.begin(),vx.end(),a[i]+k)-vx.begin()+;
}
for(int i=;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+,q++m);
int l=,r=;
num=;
for(int i=;i<=m;i++){
while(l<q[i].l)del(l),l++;
// cout<<num<<" ";
while(l>q[i].l)l--,add(l);
// cout<<num<<" ";
while(r<q[i].r)r++,add(r);
// cout<<num<<" ";
while(r>q[i].r)del(r),r--;
// cout<<num<<" "<<endl;
ans[q[i].id]=num;
}
for(int i=;i<=m;i++){
printf("%d\n",ans[i]);
}
}
return ;
}
HDU - 6534 Chika and Friendly Pairs的更多相关文章
- HDU6534 Chika and Friendly Pairs(莫队,树状数组)
HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...
- 201⑨湘潭邀请赛 Chika and Friendly Pairs(HDU6534)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6534 题意: 给你一个数组,对于第i个数来说,如果存在一个位置j,使得j>i并且a[j]-k&l ...
- HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)
链接: https://vjudge.net/contest/308446#problem/C 题意: Chika gives you an integer sequence a1,a2,-,an a ...
- HDU 6534 莫队+ 树状数组
题意及思路:https://blog.csdn.net/tianyizhicheng/article/details/90369491 代码: #include <bits/stdc++.h&g ...
- 2019 CCPC 湖南全国邀请赛
A. Chessboard 做法1 单纯形. 做法2 最大费用可行流问题,行列模型. 对每行建一个点,每列建一个点.物品 \(i\) 在 \((r,c)\),那么 \(r\) 向 \(c\) 连流量为 ...
- AtCoder Regular Contest 092 C - 2D Plane 2N Points(二分图匹配)
Problem Statement On a two-dimensional plane, there are N red points and N blue points. The coordina ...
- AtCoderBeginner091-C 2D Plane 2N Points 模拟问题
题目链接:https://abc091.contest.atcoder.jp/tasks/arc092_a 题意 On a two-dimensional plane, there are N red ...
- AtCoder Regular Contest 092 2D Plane 2N Points AtCoder - 3942 (匈牙利算法)
Problem Statement On a two-dimensional plane, there are N red points and N blue points. The coordina ...
- HDU 5178 pairs —— 思维 + 二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5178 pairs Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- html中有序列表标签ol,li的高级应用
本文主要介绍html中有序列表标签ol,li的高级应用, 在网页设计时我们设计有序列表内容时,经常会在每个ITEM前手工加上一个数值,或是由程序加上这个数值. 而如果使用有序列表标签ol和li,则不需 ...
- day38 03-Spring的IOC和DI的区别
在IOC中有一个DI的概念. IOC是控制反转,DI是依赖注入.现在编写的类里面是没有其他的属性的.如果你学过像UML设计的话, 电视没有遥控器,按按钮也可以,但是紧密的那种,像人和四肢,人如果没有了 ...
- Hdu 4920矩阵乘法(内存访问的讲究)
题目链接 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K ( ...
- Junit测试类
1.当前工程下--右键bulid path add libraries-Junit4 import org.junit.Test;//导入这个类public class TestJunit { pub ...
- python mooc 3维可视化<第一周第一单元>
基本含义 数据->图像 分类 重点关注空间数据的可视化 方法 二维标量数据场 三维标量数据场 二位标量数据场 颜色映射法 等值线法 立体图法 层次分割法 三维标量数据场 面绘制法 体绘制法 展示 ...
- Python 正则表达式语法实例
- 洛谷P1063 能量项链 [2006NOIP提高组]
P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标 记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...
- Codeforces 404B
毫无疑问这题不是难题,但是这种题目最让人纠结 打心里对这种题目就比较害怕,果然,各种WE 这里贴上代码,用Python写的,比较偷懒: def cur_pos(a, d): if 0 <= d ...
- 洛谷P2607 骑士
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- jupyter的简单操作
jupyter简单使用 esc+ m 切换到标记模式 shift + enter 运行 a 向上新增代码块 b 向下新增代码块 dd 删除代码块 y python代码模式 file --- downl ...