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每天早上都要耗费很久从一堆五颜六色 ...
随机推荐
- List<string> to List<decimal> by C# 2.0
List<" } ); List<decimal> temp = data.ConvertAll<decimal>(delegate(string x) { r ...
- zabbix3.2在lamp环境安装
zabbix官网下载zabbix-3.2.1.tar.gz wget http://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20 ...
- 向.net后端发送请求获取数据,在前端动态填充表格
实现效果 实现步骤 通过Ajax请求的方式 1.在前端定义Table 2.通过Ajax向.net后端发送数据请求 3.在.net后端定义方法供前端调用,并返回所需的数据 4.通过构造字符串的方式,将后 ...
- svn地址如何更改
1.先进入平时放的更新文件的位置 2.然后右键 选中TortoiseSVN中的Relocate修改里面的完了之后输入账号和密码就好了当然你要记得密码和账号
- HDU 5765 Bonds
比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...
- IIS6 伪静态
1. 设置IIS--主目录--脚本映射那一个属性 2.必须还要上传自己的urlrewriter组件,并在config里做相应的设置 二者缺一不可
- centos 7 切换运行模式
如设置命令行级别方法: systemctl set-default multi-user.target 设置窗口级别方法: systemctl set-default graphical.target
- Linux基础命令---压缩与打包
GZIP: 普通文件打包成gzip文件:gzip filename(问题:如何测试一个文件是否是gzip文件?) gzip文件解压成普通文件:gzip -d filename(副作用:原始gz文件会被 ...
- java和.net的类比
原文地址在http://www.seguetech.com/blog/2013/06/03/dotnet-vs-java-how-to-pick
- 求最大公约数(GCD)的两种算法
之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种.在处理大数时更优秀的算法--Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a% ...