[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++,开 ...
随机推荐
- 小白自制Linux开发板 番外篇 一 modprobe加载驱动问题(转载整理)
使用modprobe加载驱动 转载地址:https://blog.csdn.net/qq_39101111/article/details/78773362 前面我们提到,modprobe并不需要指定 ...
- C# datagridview、datagrid、GridControl增加行号
01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...
- 【UE4 C++】调用外部链接库 lib静态库
简述 本例以插件形式测试 使用Lib引用,打包程序运行不用再拷贝lib文件 需要 lib 文件和 .h 头文件 lib部分的代码 .h 头文件 #pragma once #ifndef __MYTES ...
- MySQL:提高笔记-1
MySQL:提高笔记-1 学完基础的语法后,进一步对 MySQL 进行学习 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门到精通 后做的笔记 1. 索引 1.1 索引概述 M ...
- Java:动态代理小记
Java:动态代理小记 对 Java 中的 动态代理,做一个微不足道的小小小小记 概述 动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理.比如说加日志,加事务等.可以给这个类创建一个代理 ...
- 【STM32学习笔记】USART 硬件流控
流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口.流控的定义.大家一定了解,RS232 中的"RS"是Recommend Standard 的缩写,即&qu ...
- stm32学习心得体会
stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...
- inline hook原理和实现
inline hook是通过修改函数执行指令来达到挂钩的.比如A要调用B,但人为地修改执行流程导致A调用了C,C在完成了自己的功能后,返回B再执行. 修改这段指令前首先要获取修改权限 由于要修改的代码 ...
- RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立
(注意! 区分shell命令和往配置文件里加的代码不同) 一:ftp服务的安装,启动和启用. 1:vim /etc/sysconfig/selinux 改为disabled后重启 ...
- Oracle的主要组件和基本概念
oracle 简介 oracle(甲骨文)公司 1977年,三人合伙创办(Software Development Laboratories,SDL) 1979年,更名为Relational Soft ...