题意即求在区间$[l,r]$中且权值在$[x,y]$中的逆序对个数

考虑分块,逆序对个数包含4部分:

1.左/右块外内部,预处理出$i$到其所在块的块首/尾,小于/小于等于$j$(需要对$j$离散)的数即可;

2.左块外与右块外,预处理出每个块内数的顺序,来对左/右块外排序,再归并排序即可;

3.左/右块外到块内,预处理出前$i$个块中小于/小于等于$j$的数个数;

4.块内部,对权值区间$[x,y]$容斥,变为$[1,y]-[1,x)-[1,x)与[x,y]$

$[1,y]$和$[1,x)$类似,预处理第$i$个块中的$j$(离散)在 第$k$个块中比其小的数的个数,特别的,当$k=i$定义为$i$到其所在块块首小于$j$的数个数(即1.),然后对$j$和$k$两维求前缀和即可(预处理过程中,为了避免二分,可以先枚举$k$再枚举$j$)

$[1,x)$与$[x,y]$,答案分为两类:1.块与块之间;2.块内部

第1个比较好做,枚举前$i$个块,即求出前$i-1$个块中$[1,x)$的点个数*第$i$个块中$[x,y]$的点个数,用3.的预处理即可

第2个对第$i$个块预处理出$j$是否在$k$之前(离散),那么即求$\sum_{j=1}^{x-1}\sum_{k=x}^{y}f[j][k]$,二位前缀和来计算即可

特别的,当$l$和$r$在同一个连通块中,直接用第1种做法,再对询问区间容斥一下即可

时间复杂度为$o(n\sqrt{n})$,常数极大,可能无法通过

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define K 300
5 #define NdK 400
6 vector<int>v,vl,vr;
7 int n,m,l,r,x,y,a[N],b[N],bl[N],st[N],ed[N],id[N];
8 int g1[N][K+10],g2[N][K+10],g3[NdK][N],g4[NdK][N],f1[NdK][K+10][NdK],f2[NdK][K+10][K+10];
9 long long ans;
10 int calc1(int k){//统计[st[bl[k]],k]范围内的答案
11 int z=g3[bl[k]][x]-g3[bl[k]-1][x],ans=0;
12 for(int i=st[bl[k]];i<=k;i++)//xx<=id[x]<id[i]
13 if ((x<=a[i])&&(a[i]<=y))ans+=g1[i][id[i]]-g1[i][z];
14 return ans;
15 }
16 int calc2(int k){//统计[k,ed[bl[k]]范围内的答案
17 int z=g4[bl[k]][y]-g4[bl[k]-1][y]-1,ans=0;
18 for(int i=k;i<=ed[bl[k]];i++)//id[i]<id[x]<=y
19 if ((x<=a[i])&&(a[i]<=y))ans+=g2[i][z]-g2[i][id[i]];
20 return ans;
21 }
22 int calc3(int l,int r){//统计[l,r]范围内的答案
23 int z=g3[bl[l]][x]-g3[bl[l]-1][x],ans=0;
24 for(int i=l;i<=r;i++)//id[i]<id[x]<=yy,l<=x<=i
25 if ((x<=a[i])&&(a[i]<=y))ans+=g1[i][id[i]]-g1[i][z]-g1[l-1][id[i]]+g1[l-1][z];
26 return ans;
27 }
28 long long calc4(int l,int r,int x){//统计[bl[l],ed[r]],[1,x]的答案
29 int ans=0;
30 for(int i=l;i<=r;i++){
31 int y=g4[i][x]-g4[i-1][x]-1;
32 if (y>=0)ans+=f1[i][y][i]-f1[i][y][l-1];
33 }
34 return ans;
35 }
36 int merge(int x1,int y1,int x2,int y2){//归并排序[x1,y1]和[x2,y2]并统计答案
37 vl.clear();
38 vr.clear();
39 for(int i=x1;i<=y1;i++)
40 if ((x<=a[i])&&(a[i]<=y))b[id[i]]=a[i];
41 for(int i=0;i<=ed[bl[x1]]-st[bl[x1]];i++)
42 if (b[i]){
43 vl.push_back(b[i]);
44 b[i]=0;
45 }
46 for(int i=x2;i<=y2;i++)
47 if ((x<=a[i])&&(a[i]<=y))b[id[i]]=a[i];
48 for(int i=0;i<=ed[bl[x2]]-st[bl[x2]];i++)
49 if (b[i]){
50 vr.push_back(b[i]);
51 b[i]=0;
52 }
53 int ans=0;
54 for(int i=0,j=0,k=0;(i<vl.size())||(j<vr.size());k++)
55 if ((i<vl.size())&&((j==vr.size())||(vl[i]<vr[j])))i++;
56 else{
57 j++;
58 ans+=k--;
59 }
60 return ans;
61 }
62 int main(){
63 freopen("tears.in","r",stdin);
64 freopen("tears.out","w",stdout);
65 scanf("%d%d",&n,&m);
66 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
67 for(int i=1;i<=n;i++){
68 bl[i]=i/K+1;
69 if (K==1)bl[i]--;
70 if (!st[bl[i]])st[bl[i]]=i;
71 ed[bl[i]]=i;
72 }
73 for(int i=1;i<=bl[n];i++){
74 v.clear();
75 for(int j=st[i];j<=ed[i];j++)v.push_back(a[j]);
76 sort(v.begin(),v.end());
77 for(int j=st[i];j<=ed[i];j++)id[j]=lower_bound(v.begin(),v.end(),a[j])-v.begin();
78 for(int j=0;j<=ed[i]-bl[i];j++){
79 g1[st[i]][j]=(a[st[i]]<v[j]);
80 for(int k=st[i]+1;k<=ed[i];k++)g1[k][j]=g1[k-1][j]+(a[k]<v[j]);
81 g2[ed[i]][j]=(a[ed[i]]<=v[j]);
82 for(int k=ed[i]-1;k>=st[i];k--)g2[k][j]=g2[k+1][j]+(a[k]<=v[j]);
83 }
84 for(int j=1,k=0;j<=n;j++){
85 while ((k<v.size())&&(v[k]<j))k++;
86 g3[i][j]=g3[i-1][j]+k;
87 g4[i][j]=g4[i-1][j]+k;
88 if ((k<v.size())&&(v[k]==j))g4[i][j]++;
89 }
90 for(int j=1;j<i;j++){
91 f1[i][0][j]=g3[j][v[0]]-g3[j-1][v[0]];
92 for(int k=1;k<v.size();k++)f1[i][k][j]=f1[i][k-1][j]+g3[j][v[k]];
93 for(int k=0;k<v.size();k++)f1[i][k][j]+=f1[i][k][j-1];
94 }
95 for(int j=st[i];j<=ed[i];j++)f1[i][id[j]][i]=g1[j][id[j]];
96 for(int j=1;j<=ed[i]-st[i];j++)f1[i][j][i]+=f1[i][j-1][i];
97 for(int j=0;j<=ed[i]-st[i];j++)f1[i][j][i]+=f1[i][j][i-1];
98 for(int j=st[i];j<=ed[i];j++)
99 for(int k=j+1;k<=ed[i];k++)
100 if (a[j]<a[k])f2[i][id[j]][id[k]]=1;
101 for(int j=1;j<=ed[i]-st[i];j++){
102 f2[i][j][0]+=f2[i][j-1][0];
103 f2[i][0][j]+=f2[i][0][j-1];
104 }
105 for(int j=1;j<=ed[i]-st[i];j++)
106 for(int k=1;k<=ed[i]-st[i];k++)f2[i][j][k]+=f2[i][j-1][k]+f2[i][j][k-1]-f2[i][j-1][k-1];
107 }
108 for(int i=1;i<=m;i++){
109 scanf("%d%d%d%d",&l,&r,&x,&y);
110 if (bl[l]==bl[r]){
111 printf("%d\n",calc3(l,r));
112 continue;
113 }
114 ans=calc1(r)+calc2(l)+merge(l,ed[bl[l]],st[bl[r]],r);
115 for(int j=st[bl[r]];j<=r;j++)//x<=a[x]<a[j]
116 if ((x<=a[j])&&(a[j]<=y))ans+=g3[bl[r]-1][a[j]]-g3[bl[r]-1][x]-g3[bl[l]][a[j]]+g3[bl[l]][x];
117 for(int j=l;j<=ed[bl[l]];j++)//a[j]<a[x]<=y
118 if ((x<=a[j])&&(a[j]<=y))ans+=g4[bl[r]-1][y]-g4[bl[r]-1][a[j]]-g4[bl[l]][y]+g4[bl[l]][a[j]];
119 l=bl[l]+1;
120 r=bl[r]-1;
121 if (l<=r){
122 ans+=calc4(l,r,y)-calc4(l,r,x-1);
123 for(int j=l;j<=r;j++)ans-=(g3[j-1][x]-g3[l-1][x])*(g4[j][y]-g3[j][x]-g4[j-1][y]+g3[j-1][x]);
124 for(int j=l;j<=r;j++){
125 int xx=g3[j][x]-g3[j-1][x],yy=g4[j][y]-g4[j-1][y]-1;
126 ans-=f2[j][xx-1][yy]-f2[j][xx-1][xx-1];
127 }
128 }
129 printf("%lld\n",ans);
130 }
131 }

[loj3341]时代的眼泪的更多相关文章

  1. 【POJ2104】K-th Number

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3

  2. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  3. 【poj2891】同余方程组

    同余方程组 例题1:pku2891Strange Way to Express Integers 中国剩余定理求的同余方程组mod 的数是两两互素的.然而本题(一般情况,也包括两两互素的情况,所以中国 ...

  4. BZOJ 3236 AHOI 2013 作业 莫队算法

    题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...

  5. 纪中集训 Day 6

    今天他们回去了,就剩我和DWJ(一位初三大大(后来问云神才知道的ORZ))一起在做题,不得不说他真的是太厉害了,一个升初三大大在各种方面都比我强QAQ 让我突然感觉到自己的高一还是不够努力啊QAQ 连 ...

  6. GDOI 2016 & APIO 2016 游记

    缓慢施工中...... UPD:APIO游记已烂尾......因为Cu滚粗+生病一直没心情写..过了几天就发现APIO的事都快忘光了...去看KPM的就可以啦 今年apio竟然没和gdoi撞...智障 ...

  7. spring 依赖注入总结--为什么官方推荐构造器注入

    一 公司小伙伴使用了构造器注入,说是spring的官方推荐.但是,我问了三个问题,他都答不出来,感觉能写篇博文. 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? ...

  8. BZOJ 2809 APIO 2012 dispatching 平衡树启示式合并

    题目大意:给出一棵树,每个节点有两个值,各自是这个忍者的薪水和忍者的领导力.客户的惬意程度是这个点的领导力乘可以取得人数.前提是取的人的薪水总和不超过总的钱数. 思路:仅仅能在子树中操作.贪心的想,我 ...

  9. 【2014秋季版】【辛星php】【0】清晰的认识一下PHP语言

    *********************PHP情结***************** 1.假设您和我经历非常相似,也可能会有这种PHP情结,为什么呢.由于我最先学习的是Java.然后学习了C++,开 ...

随机推荐

  1. Java基础之(六):变量、运算符与JavaDoc

    变量.常量 一.变量的命名规范 首字母只能以字母(A-Z或者a-z)或者美元符($)或者下划线(_)开头,不能以数字开头,首字母之后只能跟字母(AZ或者az)或者数字,不能跟美元符或者下划线 源码 p ...

  2. FastAPI 学习之路(十一)请求体 - 嵌套模型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  3. 使用tinypng对需要上传Gitee图床的图片进行压缩

    目录 背景 Tinypng简介 Tinypng使用 手动上传图片 使用API 调用API自动上传超过1MB图片 安装tinyfy 自动上传脚本 其他 背景 在使用Gitee作为图床时(使用Typora ...

  4. Visual Studio Debug only user code with Just My Code

    Debug only user code with Just My Code By default, the debugger skips over non-user code (if you wan ...

  5. pip 安装软件报 Requirement already satisfied

    pip 安装的时候报错了,以为是豆瓣源有问题,换了还是一样,于是我们只需要加入一个参数 --target=路径    给它一个指定的位置就可以解决这个问题 安装位置不变,只是增加了一个参数在后面

  6. sql递归查询部门数据

    1 with cte as 2 ( 3 select a.DepartCode,a.DepartName,a.ParentDepartCode from tbDeparts a where Paren ...

  7. Noip模拟38 2021.8.13

    T1 a 跟入阵曲很像,但是忘记入阵曲这题的思路是什么了 这里再提一下,入阵曲是子矩阵和是$k$的倍数,这道题目是子矩阵和是在一段区间内$[L,R]$ 因为这道题$n$特别小,$m$较大,考虑复杂度为 ...

  8. 2021.10.15考试总结[NOIP模拟77]

    \(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...

  9. 『学了就忘』Linux基础 — 4、VMware安装

    目录 1.VMware介绍 2.VMware主要特点 3.VMware建议配置 4.VMware安装 1.VMware介绍 VMware是一个虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环 ...

  10. hdu 3635 Dragon Balls(并查集)

    题意: N个城市,每个城市有一个龙珠. 两个操作: 1.T A B:A城市的所有龙珠转移到B城市. 2.Q A:输出第A颗龙珠所在的城市,这个城市里所有的龙珠个数,第A颗龙珠总共到目前为止被转移了多少 ...