hdu3113 Lucky 莫队算法

原创 2015年07月08日 19:59:03
定义记号f(A,B)表示询问区间A,B时的答案
用记号+表示集合的并
利用莫队算法我们可以计算出任意f(A,A)的值
不妨假设A=[l1,r1],B=[l2,r2],C=[r1+1,l21]
容易知道f(A,B)=f(A+B+C,A+B+C)+f(C,C)f(A+C,A+C)f(C+B,C+B)
因此一个询问被拆成四个可以用莫队算法做的询问
直接把上述四个询问拆开即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=120005;
int a[maxn];
int cnt[maxn];
typedef long long LL;
LL s1[maxn];
struct pi{
    int l,r,x,id;
}pp[maxn];
int tot;
void  add(int l,int r,int p,int id){
    pp[tot].l=l;
    pp[tot].r=r;
    pp[tot].x=(l-1)/p+1;
    pp[tot].id=id;
    tot++;
}
int cmp(pi a,pi b){
    if(a.x!=b.x) return a.x<b.x;
    return a.r<b.r;
}
int main()
{
    int i,j,n,m,k;
    while(cin>>n){
        memset(cnt,0,sizeof(cnt));
        cin>>k;
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        LL s=0;
        cin>>m;
        tot=0;
        int p=sqrt(n);
        for(i=0;i<m;i++){
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
            add(a,d,p,4*i);
            add(b+1,c-1,p,4*i+1);
            add(a,c-1,p,4*i+2);
            add(b+1,d,p,4*i+3);
        }
        sort(pp,pp+tot,cmp);
        int l=0,r=0;
        for(i=0;i<tot;i++){
            if(i==0){
                for(j=pp[i].l;j<=pp[i].r;j++){
                    cnt[a[j]]++;
                    if(a[j]<=k&&k-a[j]<=30000){
                        int p=cnt[k-a[j]];
                        if(p>0) s+=p;
                    }
                }
            }
            else{
                if(l<pp[i].l){
                    for(j=l;j<pp[i].l;j++){
                        if(a[j]<=k&&k-a[j]<=30000){
                            int p=cnt[k-a[j]];
                            if(p>0) s-=p;
                        }
                        cnt[a[j]]--;
                    }
                }
                else{
                    for(j=l-1;j>=pp[i].l;j--){
                        cnt[a[j]]++;
                        if(a[j]<=k&&k-a[j]<=30000){
                            int p=cnt[k-a[j]];
                            if(p>0) s+=p;
                        }
                    }
                }
                if(r<pp[i].r){
                    for(j=r+1;j<=pp[i].r;j++){
                        cnt[a[j]]++;
                        if(a[j]<=k&&k-a[j]<=30000){
                            int p=cnt[k-a[j]];
                            if(p>0) s+=p;
                        }
                    }
                }
                else{
                    for(j=r;j>pp[i].r;j--){
                        if(a[j]<=k&&k-a[j]<=30000){
                            int p=cnt[k-a[j]];
                            if(p>0) s-=p;
                        }
                        cnt[a[j]]--;
                    }
                }
            }
            s1[pp[i].id]=s;
            l=pp[i].l;
            r=pp[i].r;
        }
        for(i=0;i<m;i++){
            LL ss=s1[4*i]+s1[4*i+1]-s1[4*i+2]-s1[4*i+3];
            printf("%I64d\n",ss);
        }
    }
}


hdu_5213_Lucky(莫队算法+容斥定理)

题目连接:hdu_5213_Lucky 题意:给你n个数,一个K,m个询问,每个询问有l1,r1,l2,r2两个区间,让你选取两个数x,y,x,y的位置为xi,yi,满足l1 题解:首先,这题没有...
  • bin_gege
  • bin_gege
  • 2016年07月06日 18:39
  • 252

莫队算法模板

形如hdu 5381:点击打开链接 add(int x, int y)的函数复杂度为 O(|x-y|) del同理 #pragma comment(linker, "/STACK:1024000000...
  • qq574857122
  • qq574857122
  • 2015年08月14日 00:20
  • 1623

莫队算法讲解 (详尽版)

莫队算法我早有耳闻。。可惜前不久才去学习。 但是自己看了看论文,也就1h左右,就能够全部理解了。 也就是说其实这个算法不难。。 好了,让我们进入正题。 我们首先来看一道例题: Des...
  • ThinFatty
  • ThinFatty
  • 2017年05月20日 16:25
  • 615

莫队算法小介绍——看似暴力的莫队算法

摘要:        莫队算法是一个对于区间、树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单易懂且短小好...
  • lqybzx
  • lqybzx
  • 2016年08月17日 23:30
  • 2925

莫队算法详解

莫队算法详解 本文翻译自MO’s Algorithm (Query square root decomposition),作者anudeep2011,发表日期为2014-12-28。由于最近碰到一些莫...
  • hnshhslsh
  • hnshhslsh
  • 2016年01月26日 00:13
  • 1396

【模板】莫队算法

题意:给定一个大小为N的数组,数组中所有元素的大小
  • yxr0105
  • yxr0105
  • 2016年05月20日 22:02
  • 2086

hdu 5145 NPY and girls(排列组合+莫队算法)

NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • acm_cxq
  • acm_cxq
  • 2016年07月14日 19:06
  • 266

树上莫队算法

继续回来写博客……记录点有意思的题目什么的。
  • KuribohG
  • KuribohG
  • 2014年11月24日 23:34
  • 6622

莫队分块算法模板[BZOJ2038]

#include #include #include #include #include #include #include #include #include #include #include #...
  • snowy_smile
  • snowy_smile
  • 2015年10月28日 09:27
  • 718

莫队算法——解决序列上询问的利器 (2) 带修改的莫队

普通的莫队戳这里。   还是考虑类似的问题:有一个长为N序列,有M个操作:1.询问:在区间[L,R]内,出现了多少个不同的数字。2.修改,将第x个数改为v(序列中所有数字均小于K)。题目会给出K。 ...
  • WT_cnyali
  • WT_cnyali
  • 2017年03月28日 22:04
  • 264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu3113 Lucky 莫队算法
举报原因:
原因补充:

(最多只允许输入30个字)