[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]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
随机推荐
- usart下位机输出使用printf的格式化技巧
输出使用printf("0x%3X ", I2c_Buf_Write[i]);时,上位机接收过程,使用文本格式,显示结果如下 虽然是保留了三位的宽度,但是并不美观. 相比于使用pr ...
- Visual Studio 2015部署OpenCV
Visual Studio 2015的安装破解及OpenCV的安装和部署 平台:win10 X64+VS2015专业版 X64:vs2015.pro_chs+OpenCV 3.X:opencv-3.4 ...
- java运行报错:nested exception is java.lang.NoSuchFieldError: INSTANCE,但使用@Test测试是好的
解决方法: 原因是,在tomcat里,同名不同版本的jar包,默认加载版本低的.我项目里有两个httpclient jar包.一个4.2.5 另一个是4.5.所以加载了4.2.5的,而我要用的是4. ...
- windows下解决端口被占用的问题
步骤一.Windows查看所有的端口 点击电脑左下角的开始,然后选择运行选项,接着我们在弹出的窗口中,输入[cmd]命令,进行命令提示符.然后我们在窗口中输入[netstat -ano]按下回车,即会 ...
- vue 开发系列(七) 路由配置
概要 用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将 ...
- 1.The Necessity of a Broad Education 全面教育的必要性
1.The Necessity of a Broad Education 全面教育的必要性 (1) According to a survey,which was based on the respo ...
- js setInterval详解
[自己总结]: 语法 setInterval(code,interval) ①可以有第三个参数,第三个参数作为第一个参数(函数)的参数 ②第一个参数是函数,有三种形式: 1.传函数名,不用加引号,也 ...
- myeclipse cannot connect to vm
启动tomcat时,tomcat可以直接运行,而debug时弹出 解决方法:打开360安全卫士的功能大全找到修复网络(LSP)点击立即修复就可以使用debug
- maven的传递性依赖
一.概念: 假如有maven项目A,项目A依赖项目B,项目B依赖项目C,我们说A对B是第一直接依赖,B对C是第二直接依赖,那么他们的依赖关系:A---->B----->C,那么我们执行项目 ...
- 学以致用八---centos7.2 安装vim8+支持python3
目的:打造基于python的vim环境 也是在地铁上突然产生的一个想法,平时都是在pycharm上练习python,但有时候会提示激活码过期,又得上网找激活码,够折腾的.那何不在linux环境下来搭建 ...