[loj3341]时代的眼泪
题意即求在区间$[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]时代的眼泪的更多相关文章
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- 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 ...
- 【poj2891】同余方程组
同余方程组 例题1:pku2891Strange Way to Express Integers 中国剩余定理求的同余方程组mod 的数是两两互素的.然而本题(一般情况,也包括两两互素的情况,所以中国 ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- 纪中集训 Day 6
今天他们回去了,就剩我和DWJ(一位初三大大(后来问云神才知道的ORZ))一起在做题,不得不说他真的是太厉害了,一个升初三大大在各种方面都比我强QAQ 让我突然感觉到自己的高一还是不够努力啊QAQ 连 ...
- GDOI 2016 & APIO 2016 游记
缓慢施工中...... UPD:APIO游记已烂尾......因为Cu滚粗+生病一直没心情写..过了几天就发现APIO的事都快忘光了...去看KPM的就可以啦 今年apio竟然没和gdoi撞...智障 ...
- spring 依赖注入总结--为什么官方推荐构造器注入
一 公司小伙伴使用了构造器注入,说是spring的官方推荐.但是,我问了三个问题,他都答不出来,感觉能写篇博文. 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? ...
- BZOJ 2809 APIO 2012 dispatching 平衡树启示式合并
题目大意:给出一棵树,每个节点有两个值,各自是这个忍者的薪水和忍者的领导力.客户的惬意程度是这个点的领导力乘可以取得人数.前提是取的人的薪水总和不超过总的钱数. 思路:仅仅能在子树中操作.贪心的想,我 ...
- 【2014秋季版】【辛星php】【0】清晰的认识一下PHP语言
*********************PHP情结***************** 1.假设您和我经历非常相似,也可能会有这种PHP情结,为什么呢.由于我最先学习的是Java.然后学习了C++,开 ...
随机推荐
- 在Vue中使用JSX,很easy的
摘要:JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javasc ...
- 题解 [JSOI2011]柠檬
题目传送门 题目大意 给出一个区间,每个点都有一个颜色,把这个区间分为许多块,每一块的权值为 \(\max\{s\times t^2\}\) ,其中 \(s\) 为某种颜色,\(t\) 为该颜色在该块 ...
- Java(9)数组详解
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201564.html 博客主页:https://www.cnblogs.com/testero ...
- Java(22)常用API一
1 API 1.1 API概述 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的 ...
- 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?
大家好,我是大明哥,我又来了. 为什么是 Reactor 一般所有的网络服务,一般分为如下几个步骤: 读请求(read request) 读解析(read decode) 处理程序(process s ...
- 2020年OO助教工作总结
随着这学期课程的落幕,我一学期的OO助教工作也宣告结束.这学期我的工作主要在系统组,和OO后台的数据库打交道. 作业查重 我几乎每周都会做的例行工作,是对每周的homework进行查重管理.由于使用了 ...
- 上拉电阻大小对i2c总线的影响
漏极开路上拉电阻取值为何不能很大或很小? 如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β<Ic),有饱和状态变成放大状态,这样端口输 ...
- 万能构造解决Rolle中值问题
只要原函数是两个函数的乘积形式,皆可此构造.
- Java:final,finally 和 finalize 的区别
在Java中,final,final和finalize之间有许多差异.final,final和finalize之间的差异列表如下: No final finally finalize 1 final用 ...
- 高度最小的BST 牛客网 程序员面试金典 C++ Python
高度最小的BST 牛客网 程序员面试金典 C++ Python 题目描述 对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树. 给定一个有序序列int[] val ...