HDU5213 Lucky 莫队算法 容斥定理

  题意:有一串数字 a[i] 和一个K  还有m个查询  x1 y1 x2 y2     

求一共有多少对数u,v 满足   a[u]+a[v]==K u在区间x1 y1  v在区间x2 y2种

 

用容斥定理即可  

ans= f(x1,y2) - f(x1,x2-1) - f(y1+1,y2) + f(y1+1,x2-1) 就是答案了

注意维护的方式也比较巧妙 

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
#define inf 0x3f3f3f3f
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1
//
const int N=3e4+5;
struct node
{
    int l,r,flag,id;
}s[N<<2];

int anss[N],ans,L,R,cnt[N],n,a[N],K,m,x1,x2,y2,block,cnt1,yy;//我的cb上不能定义y1  不然疯狂报错???

bool judge(int x)
{
    return x>=1&&x<=n;
}
void add(int x)
{
    x=a[x];
    cnt[x]++;
    if(judge(K-x))ans+=cnt[K-x];
}
void del(int x)
{
    x=a[x];
    cnt[x]--;
    if(judge(K-x))ans-=cnt[K-x];
}
bool cmp(node a,node b)
{
    return (a.l/block)==(b.l/block)?a.r<b.r:a.l<b.l;
}
int main()
{
    while(~RI(n))
    {
        RI(K);rep(i,1,n)RI(a[i]);RI(m);cnt1=0;
        
        rep(i,1,m)
        {
            anss[i]=cnt[i]=0;
            RII(x1,yy);RII(x2,y2);
            s[++cnt1].flag=1, s[cnt1].l=x1,s[cnt1].r=y2,s[cnt1].id=i;
            s[++cnt1].flag=-1,s[cnt1].l=x1,s[cnt1].r=x2-1,s[cnt1].id=i;
            s[++cnt1].flag=-1,s[cnt1].l=yy+1,s[cnt1].r=y2,s[cnt1].id=i;
            s[++cnt1].flag=1, s[cnt1].l=yy+1,s[cnt1].r=x2-1,s[cnt1].id=i;
        }
        block=sqrt(n);
        sort(s+1,s+1+cnt1,cmp);
        L=1,R=0,ans=0;

        rep(i,1,cnt1)
        {
            int l=s[i].l,r=s[i].r;
            while(L<l)del(L++);
            while(L>l)add(--L);
            while(R<r)add(++R);
            while(R>r)del(R--);

            anss[s[i].id]+=s[i].flag*ans;
        }
        rep(i,1,m)printf("%d\n",anss[i]);
    }
    return 0;
}
View Code

转载于:https://www.cnblogs.com/bxd123/p/10919825.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值