题目大意:

给定一个数列,每次询问区间逆序对数,不强制在线。

题解:

如果不强制在线的话,我们可以离线下来搞一个莫队,每次指针左右移动的时候相当于查当前区间中有多少数比它大或者有多少数比它小,这个需要用树状数组维护,时间复杂度\(O(n\sqrt{n}logn)\)。

但是\(300ms\)跑不出来。。。

于是我们观察指针左右移动的时候我们都需要查询些什么?

比如说左端点向左移动,我们相当于是查询\(l \sim r\)中有多少数比\(a[l-1]\)小。

然后搞成前缀和相减,弄成\(1\sim r\) 和\(1 \sim l-1\),观察到后面那个是\(1\sim l-1\)中有多少个数比\(a[l-1]\)小,这个东西只有一个变量,所以可以提前预处理出来。

那么我们只有前一种问题了。

我们再次把这些问题离线,每个询问挂到\(r\)上,然后依次从\(1-n\)扫描,然后再进行分块,每次添加一个数可以\(\sqrt n\)的做,这样查询可以做到\(O(1)\),于是我们的总复杂度是\(O(m\sqrt n+n\sqrt n)\)。

注意到我们的总询问有\(m\sqrt n\)个,\(32MB\)存不下。。

毒瘤出题人

注意到每次指针移动会是一段区间,所以每次存询问的时候直接把整段区间存下来就好了,所以空间就是\(O(m)\)的了。

#include<bits/stdc++.h>
#define N 100009
using namespace std;
typedef long long ll;
int n,n1,q,be[N],c[N],bl[N],bel,a[N];
int sum1[N],sum0[N],san0[N],san1[N],pre0[N],pre1[N],ys[N];
ll ans[N];
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
struct node{int l,r,id;inline bool operator <(const node &b)const{if(be[l]!=be[b.l])return be[l]<be[b.l];return (be[l]&1)?r<b.r:r>b.r;}
}b[N];
struct node2{int be,l,r,tag,opt;
};
vector<node2>vec[N];
vector<node2>::iterator it;
struct BIT{int tr[N];inline void add(int x,int y){while(x<=n)tr[x]+=y,x+=x&-x;}inline int query(int x){int ans=0;while(x)ans+=tr[x],x-=x&-x;return ans;}inline void clear(){memset(tr,0,sizeof(tr));}
}tr;
int main(){n=rd();q=rd();n1=sqrt(n);for(int i=1;i<=n;++i)a[i]=rd(),c[++c[0]]=a[i];sort(c+1,c+c[0]+1);c[0]=unique(c+1,c+c[0]+1)-c-1;for(int i=1;i<=n;++i)a[i]=lower_bound(c+1,c+c[0]+1,a[i])-c;for(int i=1;i<=n;++i){pre0[i]=tr.query(a[i]-1);tr.add(a[i],1);}tr.clear();for(int i=1;i<=n;++i){pre1[i]=tr.query(n-a[i]);tr.add(n-a[i]+1,1);}for(int i=1;i<=n;++i)be[i]=(i-1)/n1+1;for(int i=1;i<=q;++i){b[i].l=rd();b[i].r=rd();b[i].id=i;}sort(b+1,b+q+1);int l=1,r=1;for(int i=1;i<=q;++i){while(l>b[i].l){for(int j=b[i].l;j<l;++j){ans[i]-=pre0[j];}vec[r].push_back(node2{i,b[i].l,l-1,0,1});l=b[i].l;}while(r<b[i].r){for(int j=r+1;j<=b[i].r;++j){ans[i]+=pre1[j];}if(l!=1){vec[l-1].push_back(node2{i,r+1,b[i].r,1,-1});} r=b[i].r;}while(l<b[i].l){for(int j=l;j<b[i].l;++j){ans[i]+=pre0[j];}vec[r].push_back(node2{i,l,b[i].l-1,0,-1});l=b[i].l;} while(r>b[i].r){for(int j=b[i].r+1;j<=r;++j){ans[i]-=pre1[j];}vec[l-1].push_back(node2{i,b[i].r+1,r,1,1});r=b[i].r;}ys[b[i].id]=i;}int bel=sqrt(c[0]);for(int i=1;i<=c[0];++i)bl[i]=(i-1)/bel+1;for(int i=1;i<=n;++i){int now=bl[a[i]];for(int j=now;j<=bl[c[0]];++j)sum0[j]++;for(int j=a[i];j<=min(c[0],bel*now);++j)san0[j]++;now=bl[c[0]-a[i]+1];for(int j=now;j<=bl[c[0]];++j)sum1[j]++;for(int j=c[0]-a[i]+1;j<=min(c[0],bel*now);++j)san1[j]++;for(it=vec[i].begin();it!=vec[i].end();++it){node2 x=*it;if(!x.tag){int tmp=0;for(int j=x.l;j<=x.r;++j){int now=bl[a[j]];int xx=sum0[now-1];if(bl[a[j]-1]==bl[a[j]])xx+=san0[a[j]-1];tmp+=xx;ans[x.be]+=x.opt*xx;}   }else{int tmp=0;for(int j=x.l;j<=x.r;++j){int now=bl[c[0]-a[j]+1];int xx=sum1[now-1];tmp+=xx;if(bl[c[0]-a[j]]==bl[c[0]-a[j]+1])xx+=san1[c[0]-a[j]];ans[x.be]+=x.opt*xx;}}}}for(int i=1;i<=q;++i)ans[i]+=ans[i-1];for(int i=1;i<=q;++i)printf("%lld\n",ans[ys[i]]);return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10889603.html

[Ynoi2019模拟赛]Yuno loves sqrt technology II相关推荐

  1. [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

    题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ...

  2. P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 [QA]区间众数,但空间很小 长度为nnn的序列,要求支持查找区间众数出现次数. 强制 ...

  3. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  4. NOIP2017模拟赛总结(2017.10.30-2017.11.1)

    第三篇博客,放上2017.10.30-2017.11.1的题. 2017.10.30 Problem A 题目大意: 有一排nnn棵果树和一个容量为sss的果篮,从前往后摘果,如果当前果树的果子数量不 ...

  5. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...

  6. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 模拟赛-20190114-新魔法(distance)

    前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai​ 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...

  9. 蓝桥杯省内模拟赛解题过程

    今天参加了一场蓝桥杯模拟赛,做的咋样还不知道,本博客的题解只是我提交的代码,并不代表真正的题解,大家参考着看看吧. 题目一 问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQI ...

最新文章

  1. jquery对事件的监听方法addEventListener()
  2. 计算机ip地址删除,Windows 8 或 Windows Server 2012 中删除一个 IP 地址时,不正确地删除活动路由表项...
  3. jQuery插件编写基础之“又见弹窗”
  4. linux yum libsasl2,CentOS8 yum 凡是安装 安装mysql +需要:libsasl2.so.2()(64bit)
  5. 【Java程序设计】多线程进阶
  6. JQuery input file 上传图片
  7. ENVI入门系列教程---一、数据预处理---3.1 基于自带定位信息的几何校正
  8. 强烈推荐:创业起步 八种赢利模式
  9. ClickHouse原理及使用
  10. SREng 使用指南(四)智能扫描的详细解说
  11. 计算机语言26个字母,C 语言实例 - 循环输出26个字母
  12. day56 JavaScript
  13. mysql 设置密码出现ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  14. 了解爬虫的风险与以及如何规避风险-Java网络爬虫系统性学习与实战系列(3)
  15. Spring Boot简介,四大核心,特性
  16. 快速提高网站排名工具大全
  17. 怎么用c语言编写画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件...
  18. 神雕侠侣手游服务器维修到多久,神雕侠侣2手游9月17日停服维护公告_神雕侠侣2手游9月17日更新了什么_玩游戏网...
  19. 工业相机的帧频和行频
  20. android组件化蘑菇街,蘑菇街 App 的组件化之路·续

热门文章

  1. ASP.NET MVC
  2. mac os 下 Android Studio设置真机调试
  3. Processing Orders With Windows Workflow
  4. javascript 运算+
  5. 转贴 DISCUZ7.0 恢复被删除的会员的UID
  6. 爱因斯坦牛顿达尔文投胎中国后
  7. VS2012下安装OpenCV3.0.0的记要
  8. 从ubuntu中文论坛转载的一片超好的文章,慢慢学习中
  9. fabric.js 不同类型 不同控件_耐温灌封胶都哪几个类型?不同类型的灌封胶有哪些不同之处?...
  10. java上课笔记大全_JAVA基础知识上课笔记