whu oj 1551 Pairs (莫队算法)

problem_id=1551">题目链接

题目大意:

给出的询问,求出这个区间的里 差小于等于 2 的数字的对数。

思路分析:

莫队算法。

然后分析一下。

假设添加了一个数字。那么就要加它旁边相差为2 的数字的和。

反之降低一个。就要降低相差为2 的数字的和。再减去自己这个1.。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define maxn 100005

using namespace std;

int app[maxn];
int save[maxn];
int pos[maxn];

struct foo
{
    int l,r,index;
    int ans;
    bool operator < (const foo &cmp)const
    {
        if(pos[l] == pos[cmp.l])
            return r<cmp.r;
        return pos[l]<pos[cmp.l];
    }
}Q[maxn];
bool cmp_id(const foo &a, const foo &b)
{
    return a.index < b.index;
}
void debug()
{
    for(int i=0;i<=7;i++)
        printf("%d ",app[i]);
    puts("");
}
void modify(int p,int &ans,int add)
{
    int tot=0;
    for(int i=max(save[p]-2,0);i<=save[p]+2;i++)
    {
        tot+=app[i];
    }

    if(add>0)ans+=tot;
    else ans-=tot-1;
    app[save[p]]+=add;
}
int main()
{
    int n,m;
    int cas=1;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int SIZE=(int)sqrt(1.0*n);
        memset(app,0,sizeof app);

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&save[i]);
            pos[i]=(i-1)/SIZE+1;
        }

        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&Q[i].l,&Q[i].r);
            Q[i].index=i;
        }

        sort(Q,Q+m);
        int ans=0;
        for(int i=0,l=1,r=0;i<m;i++)
        {
            if(r<Q[i].r)
            {
                for(r=r+1;r<=Q[i].r;r++)
                    modify(r,ans,1);
                r--;
            }
            if(r>Q[i].r)
            {
                for(;r>Q[i].r;r--)
                    modify(r,ans,-1);
            }
            if(l<Q[i].l)
            {
                for(;l<Q[i].l;l++)
                    modify(l,ans,-1);
            }
            if(l>Q[i].l)
            {
                for(l=l-1;l>=Q[i].l;l--)
                    modify(l,ans,1);
                l++;
            }
            Q[i].ans=ans;
        }

        sort(Q,Q+m,cmp_id);
        printf("Case %d:\n",cas++);
        for(int i=0;i<m;i++)
            printf("%d\n",Q[i].ans);
    }
    return 0;
}
时间: 2024-10-02 18:46:42

whu oj 1551 Pairs (莫队算法)的相关文章

[voj 1551]E - Pairs 2014年武汉大学邀请赛E题 莫队算法

题目大意 有n个数,m个查询,对于每个查询,询问指定区间,有多少个数对的绝对值小于等于2. 解题思路 莫队O^1.5 首先将询问离线处理左端点进行编号,每sqrt(n)个为一组 sort结构体 当左端点编号相同时,比较右端点大小.小的放在前面. 对于每组询问暴力处理,只需处理当前新加入(删除的数字在当前区间内有多少点和它的绝对值只差小于2即可) 唯一要注意的是加点是先更新答案再计数,删点是先计数器-1再更新答案 因为对于每个询问,左端点的修改量不超过sqrt(n) 右端点每一组最坏的复杂度是修改

XOR and Favorite Number(莫队算法+分块)

E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pai

kyeremal-bzoj2038-[2009国家集训队]-小z的袜子(hose)-莫队算法

bzoj2038-[2009国家集训队]-小z的袜子(hose) F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  Manacher Logout 捐赠本站 Notice:省选季快乐&另求历年World Final数据,谢谢&OJ试题突破3000大关! 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 

CodeFroce Round 340 div2 E XOR and Favorite Number【莫队算法】

题面: Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l?≤?i?≤?j?≤?r and the xor of the numbers ai,?ai?

莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 6475  Solved: 3004[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜

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

51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[j]中,有多少对数,abs(A[i] - A[j]) <= K(abs表示绝对值). 题解 莫队!//其实我就是搜索"51nod + 莫队"找到的这道题-- 七级算法题! 一道320分! 你值得拥有! 题解就是--用个普通的莫队,加上树状数组来统计符合条件的数个数,就好啦. 当增加/

Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫队算法 + 异或和前缀和的巧妙】

任意门:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks yo

莫队算法

Beautiful Girl 题意 给定一个长度为 n 的序列 a[1], a[2], ..., a[n] . m 组询问 (l, r, K) , 求区间 [l, r] 去除重复的数之后的第 K 小. n, m <= 100000 . 分析 莫队算法 + 值域分块. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include &

BZOJ4241 历史研究 莫队算法 堆

欢迎访问~原文出处--博客园-zhouzhendong&AK 去博客园看该题解 题目 Description IOI国历史研究的第一人--JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1.