hdu_5213_Lucky(莫队算法+容斥定理)
题目连接:hdu_5213_Lucky
题意:给你n个数,一个K,m个询问,每个询问有l1,r1,l2,r2两个区间,让你选取两个数x,y,x,y的位置为xi,yi,满足l1<=xi<=r1,l2<=y2<=r2,使得x+y=K;
题解:首先,这题没有修改操作,即可以离线,离线区间问题就要想到莫队算法,然后看状态怎么搞,因为要求的答案满足区间的可加性,我们令f(l,r)表示 l到r这个区间满足条件的ans,令F(l1,r1,l2,r2)为在这两个区间内选取的数满足条件的ans,则根据容斥定理,F(l1,r1,l2,r2)=f(l1,r2)-f(r1+1,r2)-f(l1,l2-1)+f(r1+1,l2-1)。这里为什么不用靠左的区间来减1呢?因为当靠左的区间为1时,减1会到0的位置,所以不方便操作,这个公式可以在草稿上画一下线段区间图就了解了。然后就是莫队的操作了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int N=(int)3e4+;
int sqr,n,a[N],m,K,l1,r1,l2,r2,ans[N],cnt[N];
struct dt{
int l,r,id,f;
bool operator<(const dt &b)const{
if(l/sqr==b.l/sqr)return r<b.r;
else return l/sqr<b.l/sqr;
}
}q[N<<]; void modui(){
sqr=(int)sqrt(n+0.5);
sort(q,q+(m<<));
int an=,l=,r=;
F(i,,(m<<)-){
while(r<q[i].r){
r++;
if(K>a[r]&&K-a[r]<=n)an+=cnt[K-a[r]];
cnt[a[r]]++;
}
while(r>q[i].r){
cnt[a[r]]--;
if(K>a[r]&&K-a[r]<=n)an-=cnt[K-a[r]];
r--;
}
while(l<q[i].l){
cnt[a[l]]--;
if(K>a[l]&&K-a[l]<=n)an-=cnt[K-a[l]];
l++;
}
while(l>q[i].l){
l--;
if(K>a[l]&&K-a[l]<=n)an+=cnt[K-a[l]];
cnt[a[l]]++;
}
ans[q[i].id]+=an*q[i].f;
}
} int main(){
while(~scanf("%d",&n)){
scanf("%d",&K);
F(i,,n)scanf("%d",a+i),cnt[i]=;
scanf("%d",&m);
F(i,,m-){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2),ans[i]=;
q[(i<<)].l=l1,q[(i<<)].r=r2,q[(i<<)].id=i,q[(i<<)].f=;
q[(i<<)+].l=l1,q[(i<<)+].r=l2-,q[(i<<)+].id=i,q[(i<<)+].f=-;
q[(i<<)+].l=r1+,q[(i<<)+].r=r2,q[(i<<)+].id=i,q[(i<<)+].f=-;
q[(i<<)+].l=r1+,q[(i<<)+].r=l2-,q[(i<<)+].id=i,q[(i<<)+].f=;
}
modui();
F(i,,m-)printf("%d\n",ans[i]);
}
return ;
}
hdu_5213_Lucky(莫队算法+容斥定理)的更多相关文章
- Lucky HDU - 5213 (莫队,容斥)
WLD is always very lucky.His secret is a lucky number . is a fixed odd number. Now he meets a strang ...
- HDU5213(容斥定理+莫队算法)
传送门 题意 给出n个数和幸运数k,m次询问,每次询问[l1,r1]和[l2,r2]有多少对数满足x+y=k,x∈[l1,r1],y∈[l2,r2] 分析 看到m只有3e4,可以考虑\(m\sqrt{ ...
- 51nod1284容斥定理
1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 10, ...
- 【hdu4135】【hdu2841】【hdu1695】一类通过容斥定理求区间互质的方法
[HDU4135]Co-prime 题意 给出三个整数N,A,B.问在区间[A,B]内,与N互质的数的个数.其中N<=10^9,A,B<=10^15. 分析 容斥定理的模板题.可以通过容斥 ...
- NBUT 1457 莫队算法 离散化
Sona Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Submit Status Practice NBUT 145 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- NPY and girls-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
随机推荐
- Jenkins - 持续集成环境搭建【转】
1. Jenkins 概述 Jenkins是一个开源的持续集成工具.持续集成主要功能是进行自动化的构建.自动化构建包括自动编译.发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件. 2 ...
- 用shell统计访问日志里每个ip访问次数【转】
今天,要统计一个系统的每个ip访问次数,于是我找到该系统访问日志,并写脚本实现. 访问日志情况: [root@qular ~]# cd /usr/local/nginx/logs/ [root@q ...
- 多元线性相关Matlab代码
clc,clearload pz.txt %原始数据存放在纯文本文件pz.txt 中mu=mean(pz);sig=std(pz); %求均值和标准差rr=corrcoef(pz); %求相关系数矩阵 ...
- freemarker遍历list中的map
前台: <select id="jq" name="jq" class="tsui" data-required="true ...
- 《C++ Primer》之面向对象编程(一)
面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.//动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 面向对象编程的关键思想是多态性(polymorphism). ...
- OPENWRT make defconfig错误之一
make defconfig rm: cannot remove `tmp/.host.mk': Permission denied 退到trunk上级目录 su root sudo chown -R ...
- The 3n + 1 problem
The 3n + 1 problem Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- Puppent 基本使用方法
简单的文件配置 master端 vim /etc/puppet/manifests/site.pp ###########################内容如下 node default{ file ...
- MySQL整理碎片
1 innodb引擎表 alter table TABLE_NAME engine='innodb'; 还有一种方法 optiize table TABLE_NAME; http://stackove ...
- C#设置默认打印机
项目中,需要选择打印机,切换打印机.demo如下(wpf应用程序): Xaml: <Window x:Class="PrintersApp.MainWindow" xmlns ...