[Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队。
终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\)
二次离线莫队,顾名思义就是将莫队离线两次。那怎么离线两次呢?
每当我们将 \([l,r]\) 移动右端点到 \(a_{r+1}\) 的时候,发现贡献为 \([1,r]-[1,l-1]\) 对 \(a_{r+1}\)。
\([1,r]\) 对 \(a_{r+1}\) 的贡献可以 \(O(n\log n)\) 预处理出来,那么我们只需要处理 \([1,l-1]\) 对 \(a_{r+1}\) 的贡献。
那么我们将 \([l,r]\) 移动右端点到 \(r'\) 时,贡献多出来的只有 \([l,r]\) 对 \((r,r']\) 的贡献。又由于前缀只有 \(n\) 个,所以我们可以再离线一下。
因为总的区间移动长度由莫队的思想为 \(O(n\sqrt{n})\),所以只需要一个 \(O(\sqrt{n})\) 插入 \(O(1)\) 查询的数据结构。
值域分块啊!
那么我们算出来的其实是差分过的,其实一次询问的答案就是 \(ans\) 的前缀和。最后将原询问的位置找到就行了。
鉴于上次的教训加了 \(fread\) 和 \(fwrite\)。。。
\(Code\ Below:\)
#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int maxn=100000+10;
const int lim=100000;
int n,m,blo,a[maxn],b[maxn],c[maxn],d[maxn],mp[maxn],tot;
int pos[maxn],bL[maxn],bR[maxn];ll pre[maxn],suf[maxn],ans[maxn],out[maxn];
namespace IO{
#define gc() (iS==iT?(iT=(iS=ibuff)+fread(ibuff,1,SIZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
const int SIZ=1<<21|1;
char *iS,*iT,ibuff[SIZ],obuff[SIZ],*oS=obuff,*oT=oS+SIZ-1,fu[110],c;int fr;
inline void out(){
fwrite(obuff,1,oS-obuff,stdout);
oS=obuff;
}
template <class T>
inline void read(T &x){
x=0;T y=1;
for(c=gc();(c>'9'||c<'0')&&c!='-';c=gc());
c=='-'?y=-1:x=(c&15);
for(c=gc();c>='0'&&c<='9';c=gc()) x=x*10+(c&15);
x*=y;
}
template <class T>
inline void print(T x,char text='\n'){
if(x<0) *oS++='-',x*=-1;
if(x==0) *oS++='0';
while(x) fu[++fr]=x%10+'0',x/=10;
while(fr) *oS++=fu[fr--];
*oS++=text;out();
}
}
struct Query{
int l,r,v,id;
}q[maxn];
vector<Query> L[maxn],R[maxn];
inline bool cmp(const Query &a,const Query &b){
if((a.l-1)/blo!=(b.l-1)/blo) return (a.l-1)/blo<(b.l-1)/blo;
return a.r<b.r;
}
inline void add(int x,int y){
for(;x<=n;x+=lowbit(x)) b[x]+=y;
}
inline int sum(int x){
int ans=0;
for(;x;x-=lowbit(x)) ans+=b[x];
return ans;
}
int main()
{
IO::read(n);IO::read(m);blo=sqrt(n)+1;
for(int i=1;i<=n;i++) IO::read(a[i]),mp[i]=a[i];
sort(mp+1,mp+n+1);
tot=unique(mp+1,mp+n+1)-mp-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(mp+1,mp+tot+1,a[i])-mp;
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+i-1-sum(a[i]),add(a[i],1);
memset(b,0,sizeof(b));
for(int i=n;i>=1;i--) suf[i]=suf[i+1]+sum(a[i]-1),add(a[i],1);
for(int i=1;i<=m;i++) IO::read(q[i].l),IO::read(q[i].r),q[i].id=i;
sort(q+1,q+m+1,cmp);q[0].l=1;
for(int i=1;i<=m;i++){
ans[i]=pre[q[i].r]-pre[q[i-1].r]+suf[q[i].l]-suf[q[i-1].l];
if(q[i-1].r<q[i].r) L[q[i-1].l-1].push_back((Query){q[i-1].r+1,q[i].r,-1,i});
if(q[i].r<q[i-1].r) L[q[i-1].l-1].push_back((Query){q[i].r+1,q[i-1].r,1,i});
if(q[i].l<q[i-1].l) R[q[i].r+1].push_back((Query){q[i].l,q[i-1].l-1,-1,i});
if(q[i-1].l<q[i].l) R[q[i].r+1].push_back((Query){q[i-1].l,q[i].l-1,1,i});
}
for(int i=1;i<=lim;i++){
pos[i]=(i-1)/blo+1;
if(pos[i]!=pos[i-1]) bL[pos[i]]=i,bR[pos[i-1]]=i-1;
}
bR[pos[lim]]=lim;
int sum,l,r,v,id;
for(int i=1;i<=n;i++){
for(int j=1;j<pos[a[i]];j++) c[j]++;
for(int j=bL[pos[a[i]]];j<=a[i];j++) d[j]++;
for(int j=0,siz=L[i].size();j<siz;j++){
l=L[i][j].l;r=L[i][j].r;v=L[i][j].v;id=L[i][j].id;sum=0;
for(int k=l;k<=r;k++) sum+=c[pos[a[k]+1]]+d[a[k]+1];
ans[id]+=v*sum;
}
}
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i=n;i>=1;i--){
for(int j=pos[a[i]]+1;j<=blo;j++) c[j]++;
for(int j=a[i];j<=bR[pos[a[i]]];j++) d[j]++;
for(int j=0,siz=R[i].size();j<siz;j++){
l=R[i][j].l;r=R[i][j].r;v=R[i][j].v;id=R[i][j].id;sum=0;
for(int k=l;k<=r;k++) sum+=c[pos[a[k]-1]]+d[a[k]-1];
ans[id]+=v*sum;
}
}
for(int i=1;i<=m;i++) ans[i]+=ans[i-1],out[q[i].id]=ans[i];
for(int i=1;i<=m;i++) IO::print(out[i]);
return 0;
}
[Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)的更多相关文章
- [Ynoi2019模拟赛]Yuno loves sqrt technology II
题目大意: 给定一个长为\(n\)的序列,\(m\)次询问,每次查询一个区间的逆序对数. 32MB. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 二次离线莫队. 对于每个区 ...
- 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)
题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...
- [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]
题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ...
- [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...
- [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III
题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ...
- 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)
传送门 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 用蒲公英那个分块的方法做结果两天没卡过去→_→ 首先我们分块,预处理块与块之间的答案,然后每次询问的时候拆成整块和两边剩下的元素 整块的答案很简 ...
- Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块
这才是真正的$N\sqrt{N}$吧$qwq$ 记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i ...
- P5048 [[Ynoi2019模拟赛]Yuno loves sqrt technology III]
为什么我感觉这题难度虚高啊-- 区间众数的出现次数- 计算器算一下 \(\sqrt 500000 = 708\) 然后我们发现这题的突破口? 考虑分块出来[L,R]块的众数出现个数 用 \(\text ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
随机推荐
- centos6中搭建tomcat
一.安装jdk [root@tomcat ~]# yum -y list java* Loaded plugins: fastestmirror, security Loading mirror sp ...
- centos7 hive + 远程mysql 搭建笔记
1.require:java环境,本地可用的hadoop,远程可访问的mysql 2.拷贝hive文件(hive-2.2.1) 3.设置环境变量 export HIVE_HOME=/data/spar ...
- 机器学习笔试--LeetCode
#########简单######### 共25道: 1. 两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例 ...
- 牛客训练三:处女座和小姐姐(三)(数位dp)
题目链接:传送门 思路:数位dp的记忆化搜索模板 从高位向低位枚举,逐位确定每一位的6的个数,dp[i][s]表示处理到第i条边,状态为s时的数字的个数. 注意,要使用long long类型. #in ...
- Router components
Input Unit The Input unit contains virtual channel buffers and an input VC arbiter. Route Info: use ...
- MFC单文档带窗体创建
我用的vs05.先随便起个名字qwerty. 确定以后在左边最下面有一个生成的类,点击生成的类,把基类改成CFormView 最后点击完成就创建好了. 单文档的窗口不是后来创建后插入的,是在创建后就自 ...
- Arria10 SDI II学习笔记
12G-SDI16是什么意思? 关于 int_vpid_byte1 int_vpid_byte2 int_vpid_byte3 int_vpid_byte4 这些参数是不是如果外部数据有就不需要传输, ...
- C#重点内容之:接口(interface)(一)网络初级示例
这一篇来源于网络,简单介绍了接口的概念 接口是体现面向对象编程思想优越性的一件利器,为什么这么说呢? 首先我们来看,接口是为继承而存在的,如果没有继承,那就自然不需要接口了,既然有继承,那就需要把可能 ...
- Python爬虫防封杀方法集合
Python爬虫防封杀方法集合 mrlevo520 2016.09.01 14:20* 阅读 2263喜欢 38 Python 2.7 IDE Pycharm 5.0.3 前言 ...
- 【转】require.js学习笔记(一)
一.立即执行函数 立即执行函数可以有效避免临时变量污染全局空间.可以在页面初始化时,在立即执行函数内实现一次执行变量的定义及使用. for (var i = 0; i < elems.lengt ...