HDU5213 Lucky【容斥+莫队】
HDU5213 Lucky
题意:
给出\(N\)个数和\(k\),有\(m\)次询问,每次询问区间\([L1,R1]\)和区间\([L2,R2]\)中分别取一个数能相加得到\(k\)的方案数
题解:
可以考虑容斥把两个区间的问题转化成四个单区间的问题,对于原问题给的区间\([L1,R1]\)和\([L2,R2]\),我们记\(f(L,R)\)为区间\([L,R]\)内能相加得到\(k\)的有多少组合,那么对于每次的询问,可以简化为:\(f(L1,R1)+f(R1+1,L2-1)-f(L1,L2-1)-f(R1+1,R2)\)
对于这个\(f(L,R)\),可以使用莫队来解决
//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 1e5+7;
typedef long long int LL;
int n,k,m,A[MAXN],q,tot,cnt[MAXN];
LL ret[MAXN],ans;
class Query{
public:
int op, id, l, r;
}Q[MAXN<<2];
void dec(int x){
if(k>x) ans -= cnt[k-x];
cnt[x]--;
}
void inc(int x){
if(k>x) ans += cnt[k-x];
cnt[x]++;
}
void solve(){
scanf("%d",&k);
for(int i = 1; i <= n; i++) scanf("%d",&A[i]);
scanf("%d",&q);
int tot = 0;
for(int i = 1; i <= q; i++){
int l1, r1, l2, r2;
scanf("%d %d %d %d",&l1,&r1,&l2,&r2);
tot++; Q[tot].id = i; Q[tot].l = l1; Q[tot].r = r2; Q[tot].op = 1;
tot++; Q[tot].id = i; Q[tot].l = r1 + 1; Q[tot].r = l2 - 1; Q[tot].op = 1;
tot++; Q[tot].id = i; Q[tot].l = l1; Q[tot].r = l2 - 1; Q[tot].op = -1;
tot++; Q[tot].id = i; Q[tot].l = r1 + 1; Q[tot].r = r2; Q[tot].op = -1;
}
int sqt = sqrt(n);
sort(Q+1,Q+1+tot,[&sqt](const Query &lhs, const Query &rhs){
return lhs.l / sqt == rhs.l / sqt ? lhs.r < rhs.r : lhs.l / sqt < rhs.l / sqt;
});
ans = 0;
memset(cnt,0,sizeof(cnt));
memset(ret,0,sizeof(ret));
int L = 1, R = 0;
for(int i = 1; i <= tot; i++){
while(L>Q[i].l) inc(A[--L]);
while(R<Q[i].r) inc(A[++R]);
while(L<Q[i].l) dec(A[L++]);
while(R>Q[i].r) dec(A[R--]);
ret[Q[i].id] += Q[i].op * ans;
}
for(int i = 1; i <= q; i++) printf("%I64d\n",ret[i]);
}
int main(){
while(scanf("%d",&n)!=EOF) solve();
return 0;
}
HDU5213 Lucky【容斥+莫队】的更多相关文章
- Hdu 5213-Lucky 莫队,容斥原理,分块
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5213 Lucky Time Limit: 6000/3000 MS (Java/Others) Me ...
- YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...
- 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{ ...
- HDU 5213 Lucky 莫队+容斥
Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...
- hdu_5213_Lucky(莫队算法+容斥定理)
题目连接:hdu_5213_Lucky 题意:给你n个数,一个K,m个询问,每个询问有l1,r1,l2,r2两个区间,让你选取两个数x,y,x,y的位置为xi,yi,满足l1<=xi<=r ...
- Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥
传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...
- Codeforces 548E(莫反、容斥)
转化为质数域上的操作,如果用莫反的话,记录因数的cnt. 其实莫反的推式子最后和容斥做法殊途同归了,容斥的系数就是莫比乌斯函数. const int maxn = 2e5 + 5, maxa = 5e ...
- hdu 5212 反向容斥或者莫比
http://acm.hdu.edu.cn/showproblem.php?pid=5212 题意:忽略.. 题解:把题目转化为求每个gcd的贡献.(http://www.cnblogs.com/z1 ...
随机推荐
- ajax跨域访问http服务--jsonp
在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...
- Openstack Ocata 公共服务端(三)
Openstack Ocata 公共服务端 mysql 安装: yum install mariadb mariadb-server mysql 安装过程省略 rabbit-server 安装包: # ...
- maven依赖与传递性依赖
目录 依赖范围 传递性依赖 依赖调节 可选依赖 本文主要是针对<maven实战>书中关键知识点的学习记录,未免有纰漏或描述不到之处,建议购买阅读原书 首先贴出一个pom常见的一些元素释义 ...
- MySQL select join on 连表查询和自连接查询
连表查询 JOIN ON 操作 描述 inner join 只返回匹配的值 right join 会从右表中返回所有的值, 即使左表中没有匹配 left join 会从左表中返回所有的值, 即使右表中 ...
- 【RAC】Oracle 10g RAC相关启停命令,维护命令
Oracle10g RAC关闭及启动步骤 情况1:需要关闭DB(所有实例),OS及Server. a.首先停止Oracle10g环境 $ lsnrctl stop (每个节点上停止监听,也可以用s ...
- LeetCode349. 两个数组的交集
题目 给定两个数组,编写一个函数来计算它们的交集. 分析 数组元素值可以很大,所以不适合直接开数组进行哈希,这里要学习另一种哈希方式:集合 集合有三种,区别见下面代码随想录的Carl大佬的表格,总结的 ...
- DOS的FOR命令用法总结
鉴于dos自带的关于for命令的帮助信息看起来太简单,自己总结了一下,并增加了必要的实例,以备日后自己查阅.其中一些地方可能存在理解错误,敬请指出. [转发请注明出处]
- 定制个性化的GUI
你现在还在使用SAP GUI710或者是GUI720,又或者更早的640等吗?那么古董先生,推荐您使用GUI730吧,您可能会730好在哪?那我建议您去百度或者Google问吧.对于新的GUI730, ...
- 关于安装版JDK1.8 1.7更改多个JDK环境变量 不生效
配置maven(apache-maven-3.3.9)时提示异常:'mvn' 不是内部或外部命令,上网查找得知 它不支持jdk1.8,所以重新安装jdk1.7,后来就出现下面的问题 现象: 当使用安装 ...
- Linux 安装分区设置分区大小
一.Linux分区挂载点介绍 Linux分区挂载点介绍,推荐容量仅供参考不是绝对,跟各系统用途以及硬盘空间配额等因素实际调整: 分区类型 介绍 备注 /boot 启动分区 一般设置100M-200M, ...