[Ynoi2019模拟赛]Yuno loves sqrt technology II
题目大意:
给定一个长为\(n\)的序列,\(m\)次询问,每次查询一个区间的逆序对数。
32MB。
解题思路:
众所周知lxl是个毒瘤,Ynoi道道都是神仙题
二次离线莫队。
对于每个区间\([l,r]\),考虑将右端点向右移动1格。
其多出来的部分是\([l,r]\)与\(a_{r+1}\)产生的逆序对(\(a\)与\(b\)产生的逆序对和\(b\)与\(a\)产生的逆序对是不同的)。
显然,可以把\([l,r]\)区间拆成\([1,r]-[1,l-1]\)。
所以,\([l,r]\)与\(a_{r+1}\)产生的逆序对=\([1,r]\)与\(a_{r+1}\)产生的逆序对-\([1,l-1]\)与\(a_{r+1}\)产生的逆序对。
右端点不断移动,区间\([1,r]\)始终在变,而\([1,l-1]\)却是不变的。
我们先考虑\([1,r]\)与\(a_{r+1}\)产生的逆序对,显然可以用树状数组在\(O(n\log n)\)的时间内预处理出这个东西的前缀和。
然后莫队端点移动、计算这部分贡献的时候就可以做到\(O(1)\)。
然后考虑\([1,l-1]\)与\(a_{r+1}\)产生的逆序对,假设\(r\)要移动到\(r'\)(\(r< r' \))。
那么,这部分产生的贡献其实是\([1,l-1]\)与\([r,r']\)产生的逆序对。
考虑用一个vector,\(v_i\)记录\([1,i]\)这个区间与其他哪些区间会产生逆序对。
由于莫队的复杂度证明,\(v_i\)记录的区间的长度总和不超过\(O(n\sqrt n)\),所以直接扫描线,然后暴力计算贡献即可。
其他端点移动方法也是类似处理一下即可。
现在,我们需要一种数据结构,支持\(O(1)\)查询前缀和,不超过\(O(\sqrt n)\)的时间进行单点修改。
那么用权值分块即可,记录块的前缀和和每个位置到该位置所在块的块首的前缀和即可。
由于我们计算的是每个询问与上一个询问的差,所以最后要进行一次前缀和。
时间复杂度\(O(n\sqrt n+n\log n)\),空间复杂度\(O(n+m)\)。
C++ Code:
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- #include<cctype>
- #include<cstring>
- #define N 100005
- #define siz 317
- class istream{
- char buf[15000003],*s;
- public:
- inline istream(){
- buf[fread(s=buf,1,15000001,stdin)]='\n';
- fclose(stdin);
- }
- template<typename T>
- inline istream&operator>>(T&rhs){
- for(rhs=0;!isdigit(*s);++s);
- while(isdigit(*s))rhs=rhs*10+(*s++&15);
- return*this;
- }
- }cin;
- struct ostream{
- char buf[8000005],*s;
- inline ostream(){s=buf;}
- inline void operator<<(long long d){
- if(!d){
- *s++='0';
- }else{
- static long long w;
- for(w=1;w<=d;w*=10);
- for(;w/=10;d%=w)*s++=d/w^'0';
- }
- *s++='\n';
- }
- inline ostream&operator<<(const char&c){*s++=c;return*this;}
- inline~ostream(){fwrite(buf,1,s-buf,stdout);}
- }cout;
- std::vector<int>ls;
- int n,m,a[N];
- long long L_R[N],R_L[N],ans[N],out[N];
- struct BiT{
- int b[N];
- inline void add(int i){for(;i<N;i+=i&-i)++b[i];}
- inline int ask(int i){int x=0;for(;i;i^=i&-i)x+=b[i];return x;}
- }b;
- struct que{
- int l,r,id;
- inline bool operator<(const que&rhs)const{
- return(l/siz!=rhs.l/siz)?(l<rhs.l):(r<rhs.r);
- }
- }q[N];
- struct node{
- int l,r,id,op;
- };
- std::vector<node>L[N],R[N];
- int bL[320],bR[320],bel[123456],c[123456],s[320];
- int main(){
- ls.push_back(-1);
- cin>>n>>m;
- for(int i=1;i<=n;ls.push_back(a[i++]))cin>>a[i];
- std::sort(ls.begin(),ls.end());
- ls.erase(std::unique(ls.begin(),ls.end()),ls.end());
- for(int i=1;i<=n;++i)a[i]=std::lower_bound(ls.begin(),ls.end(),a[i])-ls.begin();
- for(int i=1;i<=n;++i){
- L_R[i]=L_R[i-1]+b.ask(1e5)-b.ask(a[i]);
- b.add(a[i]);
- }
- memset(b.b,0,sizeof b.b);
- for(int i=n;i;--i){
- R_L[i]=R_L[i+1]+b.ask(a[i]-1);
- b.add(a[i]);
- }
- for(int i=1;i<=m;++i)cin>>q[i].l>>q[q[i].id=i].r;
- std::sort(q+1,q+m+1);
- q[0].l=1;
- for(int i=1;i<=m;++i){
- ans[i]=L_R[q[i].r]-L_R[q[i-1].r]+R_L[q[i].l]-R_L[q[i-1].l];
- if(q[i].r>q[i-1].r)
- R[q[i-1].l-1].push_back((node){q[i-1].r+1,q[i].r,i,-1});
- else
- if(q[i].r<q[i-1].r)
- R[q[i-1].l-1].push_back((node){q[i].r+1,q[i-1].r,i,1});
- if(q[i].l<q[i-1].l)
- L[q[i].r+1].push_back((node){q[i].l,q[i-1].l-1,i,-1});
- else
- if(q[i].l>q[i-1].l)
- L[q[i].r+1].push_back((node){q[i-1].l,q[i].l-1,i,1});
- }
- for(int i=1;i<=siz;++i){
- bL[i]=bR[i-1]+1;
- bR[i]=i*siz;
- for(int j=bL[i];j<=bR[i];++j)bel[j]=i;
- }
- for(int i=1;i<=n;++i){
- for(int j=1;j<bel[a[i]];++j)++s[j];
- for(int j=bL[bel[a[i]]];j<=a[i];++j)++c[j];
- for(node j:R[i]){
- int l=j.l,r=j.r;
- long long tmp=0;
- for(int k=l;k<=r;++k)
- tmp+=s[bel[a[k]+1]]+c[a[k]+1];
- ans[j.id]+=j.op*tmp;
- }
- }
- memset(c,0,sizeof c);
- memset(s,0,sizeof s);
- for(int i=n;i;--i){
- for(int j=bel[a[i]]+1;j<=siz;++j)++s[j];
- for(int j=a[i];j<=bR[bel[a[i]]];++j)++c[j];
- for(node j:L[i]){
- int l=j.l,r=j.r;
- long long tmp=0;
- for(int k=l;k<=r;++k)
- tmp+=s[bel[a[k]-1]]+c[a[k]-1];
- ans[j.id]+=j.op*tmp;
- }
- }
- 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)cout<<out[i];
- return 0;
- }
[Ynoi2019模拟赛]Yuno loves sqrt technology II的更多相关文章
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...
- [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 ...
- 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)
题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
随机推荐
- 使用厂商MIB库查找设备OID值并实施监控的方法
https://wenku.baidu.com/view/8f4b389e0029bd64783e2cd0.html
- Spring注解@Repository、@Service、@Controller、@Component
继前几章所讲解的注解中: http://www.cnblogs.com/EasonJim/p/6892280.html http://www.cnblogs.com/EasonJim/p/689974 ...
- Leetcode45:Intersection of Two Linked Lists
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- Linux下叹号!的用法
在定义包含!的字符串变量时,出现了以下提示错误. 注意:在centos系统下错误,在Fedora系统可以正常运行. 修正方法有以下几种: (1)将整个字符串用单引号引起来. (2)在!后添加空格. ( ...
- 如何做URL静态化 和页面的静态化
为什么要进行URL静态化? 如果帮到了您,您可以小支持一下,谢谢您 1.更好的迎合搜索引擎工作原理的爬行抓取机制:2.把网站URL静态化更有助于网站获得好的排名:3.URL静态化有利于用户体验.不 ...
- 寒武纪芯片——有自己的SDK,支持tf、caffe、MXNet
寒武纪芯片 产品中心>智能处理器IP 智能处理器IP MLU智能芯片 软件开发环境 Cambricon-1A 高性能硬件架构及软件支持兼容Caffe.Tensorflow.MXnet等主流AI开 ...
- sublime中BracketHighlighter 插件使用 (转)
sublime中BracketHighlighter 插件使用 1.打开package Control,选择install Package 2.输入BracketHighlighter,回车 3.这样 ...
- 虚拟机CentOS设置IP
虚拟机里Centos7的IP地址查看方法 本地虚拟机安装了CentOS 7,想通过ftp上传文件,发现通过ifconfig,没有inet这个属性 查看ens33网卡的配置:vi /etc/syscon ...
- docker(部署常见应用):docker部署nginx
上回说到centos安装docker. 这次用实战,docker部署运行常见的应用. docker常用命令 参看:docker命令大全.这里不做赘述. docker部署nginx 1.docker h ...
- 24. Swap Nodes in Pairs[M]两两交换链表中的节点
题目 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...