HDU6534 Chika and Friendly Pairs(莫队,树状数组)
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(莫队,树状数组)的更多相关文章
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
		51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ... 
- bzoj3236 作业 莫队+树状数组
		莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ... 
- BZOJ_3289_Mato的文件管理_莫队+树状数组
		BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ... 
- 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 ... 
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
		题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ... 
- bzoj 3289: Mato的文件管理 莫队+树状数组
		3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ... 
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
		点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ... 
- HihoCoder 1488 : 排队接水(莫队+树状数组)
		描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ... 
- BZOJ 3236 莫队+树状数组
		思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ... 
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
		传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ... 
随机推荐
- Picnic Planning POJ - 1639(度限制生成树)
			解题报告 题意理解 给定一张N个点,M个边的无向图,求出无向图的一颗最小生成树,但是我们要求一号节点的入度不可以超过给定的整数S 也就是一个最小生成树,要求它的一号节点,最多只能和S个节点相连. ... 
- 2015 四川省赛 C Censor(哈希 | KMP)
			模式串为子串 KMP /* @author : victor */ #include <bits/stdc++.h> using namespace std; typedef long l ... 
- 使用svn未响应卡死的几个原因,commit时checkout时
			1.commit 时 很可能是:检索文件内容过多导致,解决:不要在最外层文件夹目录下commit 2.checkout时 很可能是:地址错误 
- Win7安装Visual Studio 2019闪退问题
			最近在Win7 系统上安装最新版的VS2019发现 每次在这个画面之后就闪退了,即便换了台电脑也是一样的情况,于是我意识到,这应该是系统本身的问题 经过调查发现是只需要安装两个更新就可以了 这两个更新 ... 
- Apache 80跳转443
			<VirtualHost *:> ServerName your.domain.com #域名 RewriteEngine on #启用重定向 RewriteCond %{SERVER_P ... 
- Binary Numbers AND Sum CodeForces - 1066E (前缀和)
			You are given two huge binary integer numbers aa and bb of lengths nn and mmrespectively. You will r ... 
- Windows10家庭版的功能中没有Hyper-V的解决方法
			1.在桌面新建记事本 将下面的内容复制到编辑器或者记事本当中 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper ... 
- python之路day15--内置函数
			函数分为自定义函数和内置函数 python内置函数分类: 5.5.1 强制转换 int() / str() / bool() / list() / tuple() / dict() / set() 5 ... 
- HTTP协议的请求方法
			HTTP概念: HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件.图像.结果等,即是一个客户端和服务器端请求和应答的标准 1.http无连接:限制每次连接只处理一个请求,服务端完成客 ... 
- 第六章 Linux文件与目录管理
			http://www.92csz.com/study/linux/6.htm 绝对路径:路径的写法一定由根目录”/”写起 相对路径:路径的写法不是由根目录”/”写起 mkdir 创建一个目录.mkdi ... 
