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. qtdebug和release加载不同的文件配置

    win32:CONFIG(release, debug|release): { LIBS +=$$PWD/../../../thirdparty\qwt\lib\qwt.lib LIBS +=$$PW ...

  2. FileUtils.writeByteArrayToFile方法

    FileUtil类是Apache Commons IO库里面的一个类,是与文件相关的一个辅助类,我写了一个可运行的java文件 import java.io.*; import org.apache. ...

  3. java冒泡排序小实例

    首先我们了解下什么是冒泡排序: 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的: ...

  4. Windows Server IIS设置计划任务重启

    Windows Server ,IIS设置计划任务重启. echo ----->>c:\log_iisreset.txt &&  echo %date% %time% &g ...

  5. KVM虚拟化简介及安装

    kvm是基于图形化的linux操作的 安装图形化界面的知识点: 磁盘空间有两个词: 精简置备:我先在我系统里面去声明我要一个50G的空间,但是呢,我不会把50G都分给你,你用多少,我分给你多少,但是做 ...

  6. git 命令解析

    git 补丁 Git 提供了两种补丁方案:   (1)用 git diff 生成的UNIX标准补丁.diff文件:.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以 ...

  7. SpringBootMVC01——A simple SpringBootMVC Sample

    不带数据库的SpringBootMVC案例 1.创建一个SpringBoot项目,添加thymeleaf,webstarter 2.目录层级 3.启动器代码 package com.littlepag ...

  8. 实现MD5算法

    using System; using System.Text; using System.Security.Cryptography; namespace Common { /// <summ ...

  9. zencart后台订单详细页显示产品图片和链接

    方法一: 找到admin/order.php 大约491行 for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 与 if (iss ...

  10. openCV for python的使用

    一.openCV简介 OpenCV是一个开源的跨平台计算机视觉库.它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和 ...