HDU6534 Chika and Friendly Pairs

莫队,树状数组的简单题

#include<bits/stdc++.h>

using namespace std;

const int maxn = 30005;
const int maxq = 27005;
int n, m, k, num, sz, len;
int a[maxn], belong[maxn], t[maxn], tree[maxn], ans[maxq];
int lowerl[maxn], lowerr[maxn], lower[maxn];
struct Q{
int l ,r, id;
}query[maxq]; int cmp(Q a, Q b){
return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
void init()
{
for(int i = 1; i <= n; i++) t[i] = a[i];
sort(t + 1, t + n + 1);
len = unique(t + 1, t + n + 1) - (t + 1);
for(int i = 0; i <= len; i++) tree[i] = 0;
}
int _hash(int x)
{
return lower_bound(t + 1, t + len + 1, x) - t;
}
inline int lowbit(int x){return x & (-x);}
void update(int pos, int x)
{
if(pos < 1) return;
while(pos <= len + 1){
tree[pos] += x;
pos += lowbit(pos);
}
}
int query_ans(int pos)
{
int ret = 0;
while(pos >= 1){
ret += tree[pos];
pos -= lowbit(pos);
}
return ret;
}
int main()
{
while(~scanf("%d%d%d", &n, &m, &k)){
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sz = sqrt(n);
num = ceil((double)n / sz);
for(int i = 1; i <= num; i++){
for(int j = (i - 1) * sz + 1; j <= i * sz && j <= n; j++){
belong[j] = i;
}
}
for(int i = 1; i <= m; i++){
scanf("%d%d", &query[i].l, &query[i].r);
query[i].id = i;
}
init();
sort(query + 1, query + m + 1, cmp); int l = 1, r = 0;
int now = 0; for(int i = 1; i <= n; i++){
lowerl[i] = _hash(a[i] - k);
lowerr[i] = _hash(a[i] + k);
lower[i] = _hash(a[i]);
} for(int i = 1; i <= m; i++){
int ql = query[i].l, qr = query[i].r;
while(l < ql){
int lid = lowerl[l], rid = lowerr[l], id = lower[l];
lid--;
if(t[rid] > a[l] + k) rid--; update(id, -1);
now -= (query_ans(rid) - query_ans(lid));
l++;
}
while(l > ql){
l--;
int lid = lowerl[l], rid = lowerr[l], id = lower[l];
lid--;
if(t[rid] > a[l] + k) rid--;
now += (query_ans(rid) - query_ans(lid));
update(id, 1); }
while(r < qr){
r++;
int lid = lowerl[r], rid = lowerr[r], id = lower[r];
lid--;
if(t[rid] > a[r] + k) rid--; now += (query_ans(rid) - query_ans(lid));
update(id, 1); }
while(r > qr){
int lid = lowerl[r], rid = lowerr[r], id = lower[r];
lid--;
if(t[rid] > a[r] + k) rid--; update(id, -1);
now -= (query_ans(rid) - query_ans(lid));
r--;
}
ans[query[i].id] = now;
}
for(int i = 1; i <= m; i++){
printf("%d\n", ans[i]);
}
}
return 0;
}

HDU6534 Chika and Friendly Pairs(莫队,树状数组)的更多相关文章

  1. 51nod 1290 Counting Diff Pairs | 莫队 树状数组

    51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...

  2. bzoj3236 作业 莫队+树状数组

    莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  3. BZOJ_3289_Mato的文件管理_莫队+树状数组

    BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...

  4. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  5. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  6. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  7. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...

  8. HihoCoder 1488 : 排队接水(莫队+树状数组)

    描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...

  9. BZOJ 3236 莫队+树状数组

    思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...

  10. BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)

    传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...

随机推荐

  1. c#服务端图片打包下载

    一,设计多图片打包下载逻辑:1,如果是要拉取腾讯云等资源服务器的图片,2,我们先把远程图片拉取到本地的临时文件夹,3,然后压缩临时文件夹,4,压缩完删除临时文件夹,5,返回压缩完给用户,6,用户就去请 ...

  2. win10删除文件夹时需要管理员授权或拒绝访问(无权访问权限修改)

    win10 用户:我自己就是电脑主人,凭啥我没有自己电脑文件夹的权限? 微软:对不起,您是电脑硬件的主人,但是电脑系统的主人是我!你只不过是个用户而已. win10 用户:我cao你...[哔-] 对 ...

  3. display:inline-block元素之间空隙的产生原因和解决办法

    在CSS布局中,如果我们想要将一些元素在同一行显示,其中的一种方法就是把要同行显示的元素设置display属性为inline-block.但是你会发现这些同行显示的inline-block元素之间会出 ...

  4. Java 从后向前依次比较两个数组

    这是华为往年的一道上机题 题目: 给定两个数组,以及两个数组的长度,要求从最后一个元素开始,依次比较两个数组对应的元素.如果有一个数组较短,则以短数组为准.返回不同元素的个数. 解答: int fun ...

  5. 转载:一种云环境下SaaS软件部署方法及装置与流程

    转载:http://www.xjishu.com/zhuanli/55/201710103925.html 本发明涉及云计算技术领域,特别是涉及一种云环境下SaaS软件部署方法及装置. 背景技术: 随 ...

  6. linux把用户添加到组

    使用 usermod 命令 将现有的用户添加到多个次要组或附加组 # usermod -a -G GroupName UserName id 命令查看输出 # id UserName 用户添加到多个次 ...

  7. windows挂载nfs

    注意:Win10 Creators Update前只有Win10企业版可以挂载NFS, Creators Update后专业版也可挂载NFS了. 安装 按Win+R输入OptionalFeatures ...

  8. Big Data(六)用户权限实操&HDFS-API实操

    创建用户实操 1.创建用户god useradd god passwd god 2.设置ssh免密 ssh-copy-id -i id_dsa node02 3.修改hdfs-site.xml中的ss ...

  9. C#文件路径操作总结

    一.获取当前文件的路径 1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName     获取模块的完整路径,包括 ...

  10. (转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化

    硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放.[delete后用:alter table table_name move    truncate后用:alter tab ...