博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Strange Queries (莫队+容斥原理)
阅读量:4313 次
发布时间:2019-06-06

本文共 1223 字,大约阅读时间需要 4 分钟。

题目大意:

给你一个长度为\(N\)的数列,求满足\(a_i = a_j\)\(l1\leq i \leq r1 , l2 \leq j \leq r2\)\((i,j)\)对数。

看到这种题目,第一反应就是莫队啦,但一看这个询问有点奇怪,不好算,怎么办呢?

这个时候就要用到容斥原理

至于怎么容斥,学过容斥原理的就可以跳过了。

首先:我们要求的答案一定\([l1,r2]\)(假设\(r1 < r2\))区间之内。很明显我们在这个区间内有许多答案是不需要的,那么就需要减去,比如\([l1,r1]\)自己配对或\([l1,r1]\)\([r1,l2]\)的配对,减去这些之后,我们发现区间\([r1,l2]\)会被减去两次,所以要加上来。

然后,我们就得到了美丽的关系式:

\[ Ans = ans[l1,r2] - ans[l1,l2] - ans[r1,r2] + ans[r1,l2] \]

为了保证复杂度,我们要把四个$ ans $放在四个询问中,所以要开四倍。

\(\mathcal{Code}\)

#include
#include
#include
#include
#define get ch=getchar()#define isd (ch>=48&&ch<=57)#define ll long long#define Re register#define In inlineusing namespace std;const int maxn=5e5+1;In int read(){ char get;int r=0,s=1; while(!isd)s=ch==45?0:s,get;while(isd)r=(r<<1)+(r<<3)+(ch^48),get; return s?r:-r;}struct Q{int l,r,id;}q[maxn<<2];int n,m,M,u,L,R;ll Ans;int a[maxn],pos[maxn];ll ans[maxn],s[maxn];bool cmp(Q a,Q b){return pos[a.l]==pos[b.l]?a.r
q[i].l)add(--L); while(R>q[i].r)sub(R--); while(R
0)ans[q[i].id]+=Ans; else ans[-q[i].id]-=Ans; } for(int i=1;i<=M;i++)printf("%lld\n",ans[i]); return 0;}

转载于:https://www.cnblogs.com/dclicker/p/10160760.html

你可能感兴趣的文章
自己使用MySQL中的GROUP_CONCAT(CONCAT_WS())函数查询的数据显示不全的问题. 以及在后台开发中怎么设置使用....
查看>>
Mysql强制修改密码
查看>>
100
查看>>
新手springmvc web简单搭建过程-caidachun
查看>>
Inline Edit
查看>>
Mybatis generator生成工具简单介绍
查看>>
Shellshock漏洞复现
查看>>
邮箱爆破
查看>>
Parrot os安装docker及docker-compose
查看>>
Parrot os配置源更新
查看>>
HTTP/2 简介及https原理
查看>>
JS代码静态分析及挖掘
查看>>
Jenkins漏洞利用复现
查看>>
WM_PAINT
查看>>
动态查看服务器打印日志
查看>>
来自官方的 windows 7 快捷键大全
查看>>
Deep RL Bootcamp Lecture 8 Derivative Free Methods
查看>>
iOS 关于Xcode上的Other linker flags
查看>>
.NET中的程序集(Assembly)
查看>>
第17章:MongoDB-聚合操作--聚合管道--$group
查看>>