[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]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
随机推荐
- VB.NET中的DLL编写和调用的最简单示例
DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题.这里给出最简单的DLL编写与 ...
- hibernate 的evict 和clear
摘自百度知道:http://zhidao.baidu.com/question/63663640.html 问: 先创建一个Student,然后调用session.save方法,然后再调用evict方 ...
- sql相同项求和
select (SELECT O2.ORG_NAME FROM OUTSOURCE_ORG O2 where o2.org_id = oo.parent_id) ...
- Oracle导入的常见语句
登录sql > sqlplus / as sysdba 创建表空间sql > create tablespace TABLESPACE datafile 'e:\tables1.dbf' ...
- 2019.01.24 NOIP训练 旅行(轮廓线dp)
传送门 题意简述: 给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数. 思路: 路径不是很好算. 将图改造一下,在最前面添两列,第一列全部能通过,第二列只有 ...
- (16)The beauty of what we'll never know
https://www.ted.com/talks/pico_iyer_the_beauty_of_what_we_ll_never_know/transcript 00:13One hot Octo ...
- AttributeError: type object 'testClass' has no attribute 'testMothod'
点击"Unittest for test_post_API.testClass"按钮,点击”Edit configuration...“,弹出对话框Run/Debug config ...
- 实战fortran77基础语法2
由于大量的接触fortran77,先学习fortran77吧 1.fortran不区分大小写,fortran77一般全部大写,感觉没必要,不好读,还是用大小写混合着写吧.后缀 .for 为固定格式的代 ...
- 虚拟机CentOs的安装及大数据的环境搭建
大数据问题汇总 1.安装问题 1.安装步骤,详见文档<centos虚拟机安装指南> 2.vi编辑器使用问题,详见文档<linux常用命令.pd ...
- SQL优化实战之加索引
有朋友和我说他的虚机里面的mysql无法跑sql,但是在本地环境是这个sql是可以跑出来的.碰到这个问题第一反应是:死锁. 于是让他查询数据库的几个状态: 发现连即时锁都非常少,不是锁的问题. 进一步 ...