P3157 动态逆序对 ,树状数组套动态开点线段树

题目

洛谷题目链接

题解

在求整体的逆序对的数量时,很好办,直接用树状数组处理即可,不过在这时,我们还需要处理出一个数组pa[]pa[]pa[],其中pa[i]pa[i]pa[i]代表在区间[1,i)[1,i)[1,i)中满足aj>aia_j>a_iaj>aiaja_jaj有多少个。

然后我们再利用一个新的BITBITBIT,并且倒着遍历a[]a[]a[]数组,这样我们可以处理出sa[]sa[]sa[]数组,其中sa[i]sa[i]sa[i]表示在区间(i,n](i,n](i,n]中有多少jjj使得,ai>aja_i > a_jai>aj

我们考虑删除一个元素对答案的影响,删除一个元素以后,那么要从答案中减去这个元素原来能构成的逆序对的数量,也就是pa[i]+sa[i]pa[i]+sa[i]pa[i]+sa[i]。但是呀,这里有一个问题!就是说pa[i]pa[i]pa[i]或者是sa[i]sa[i]sa[i]中很可能包含有已经被删除掉的元素了。

解决这个问题有两个方案,第一就是我们每删除的一个元素就对所有依赖这个元素的sa[]、pa[]sa[]、pa[]sa[]pa[]数组全部更新,这样显然不合理,遇到极端数据时间复杂度会爆炸。
还有一个解决方案就是,我们把要减去的部分容斥一下,即在已经被删除的元素里面,再找于、与aia_iai元素能构成逆序对的数量ttt

这样的话,ans−=sa[i]+pa[i]−tans -= sa[i]+pa[i]-tans=sa[i]+pa[i]t

这个思路听起来很完美,但是这个ttt要怎么找呢?

其实我们需要的是对所有被删除的元素建立一颗可修改的主席树

正常的主席树想要修改的时候,如果修改了第iii个版本的主席树,同时要把i+1、i+2...i+1、i+2...i+1i+2...等版本的主席树都修改,因为是主席树跟前一个版本的主席树是有依赖关系的。

我们发现树状数组跟我们的需求非常像,因为树状数组具有区间求和的性质,也具有单点修改时间复杂度O(logn)O(logn)O(logn)的优秀性质。

于是!我们可以用树状数组套权值线段树来解决这个问题。

由于空间所限,我们做线段树采用动态开点的方法。

其中树状数组里的每一个节点里面包含有一颗线段树。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define pr(x) cout<<#x<<":"<<x<<endl
#define int long long
const int maxn = 200007;struct segtree{int root[maxn*40];int lson[maxn*40];int rson[maxn*40];int val[maxn*40];int idx;void ins(int &rt,int l,int r,int pos,int v){if(!rt) rt = ++idx;val[rt] += v;if(l == r) return ;int mid = (l+r)/2;if(pos <= mid) ins(lson[rt],l,mid,pos,v);else ins(rson[rt],mid+1,r,pos,v);} int query(int rt,int l,int r,int ul,int ur){if(!rt || r < ul || ur < l) return 0;if(ul <= l && r <= ur) return val[rt];int mid = (l+r)/2;int a = query(lson[rt],l,mid,ul,ur);int b = query(rson[rt],mid+1,r,ul,ur);return a+b;}
}seg;struct BIT{int a[maxn];void add(int pos,int v){for(;pos < maxn;pos += pos & (-pos))a[pos] += v;}int query(int pos){int ans = 0;for(;pos;pos -= pos & (-pos))ans += a[pos];return ans;}
}b1,b2;
int pos[maxn],a[maxn];
int pa[maxn],sa[maxn];
int n,m;signed main(){long long ans = 0;cin>>n>>m;for(int i = 1;i <= n;++i){scanf("%lld",&a[i]);pos[a[i]] = i;b1.add(a[i],1);ans += pa[i] = b1.query(n) - b1.query(a[i]);}for(int i = n;i > 0;i--){sa[i] = b2.query(a[i]-1);b2.add(a[i],1);}for(int i = 1;i <= m;++i){printf("%lld\n",ans);int v;scanf("%lld",&v);int p = pos[v];p--;long long tmp = 0;for(;p;p -= p & (-p))tmp += seg.query(seg.root[p],0,100001,v+1,100001);p = pos[v];for(;p;p -= p & (-p))tmp -= seg.query(seg.root[p],0,100001,0,v-1);p = n;for(;p;p -= p & (-p))tmp += seg.query(seg.root[p],0,100001,0,v-1);ans -= sa[pos[v]] + pa[pos[v]] - tmp;p = pos[v];for(;p <= n;p += p&(-p))seg.ins(seg.root[p],0,100001,v,1);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DP】猫咪的进化

猫咪的进化 题目大意&#xff1a; 有n个实数&#xff0c;每一个实数可以选&#xff0c;可以不选&#xff0c;也可以选择它的平方&#xff0c;但如果选择了它的平方&#xff0c;就不能选择下一个数或下一个数的平方&#xff0c;求选出来的数的和最大是多少 原题&#xff1a; …

[8.21NOIP模拟赛]决战【tarjan】

正题 题目大意 nnn个点mmm条边的联通图&#xff0c;去掉一个点使得其变为一棵树 求能去掉哪些点 解题思路 首先去掉后就是一棵n−1n-1n−1个节点的树&#xff0c;也就是有n−2n-2n−2条边&#xff0c;这样我们就需要去掉m−n2m-n2m−n2条边&#xff0c;也就是去掉入度为m−n2…

[译]RabbitMQ教程C#版 - 发布订阅

先决条件本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.发布/订阅…

P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案

题目 洛谷题目链接 题解 题目的数据范围非常奇怪&#xff0c;一半是200∗200200∗200的矩阵&#xff0c;另一半是1∗500001∗50000的矩阵&#xff0c;显然是一道二合一的题目&#xff0c;但是不一样的地方也就在与数据结构的选择不一样&#xff0c;而我们解这道题使用的算法…

nssl1511-我的世界【堆,贪心】

正题 题目大意 nnn个点的一棵树&#xff0c;给每一个点一个权值&#xff0c;每个点的依靠点是与它相连的权值最小的点&#xff0c;要求每个点最多只有一个依赖点。 求字典序最小的方案 解题思路 首先最小的一定是叶子结点&#xff0c;然后他的父节点指向他&#xff0c;因为它…

【SPFA】【最短路/次短路】GF打Dota

GF打Dota 题目大意&#xff1a; 求一个点到另一个点的最短路或次短路 原题&#xff1a; 题目描述 众所周知&#xff0c;GF同学喜欢打dota&#xff0c;而且打得非常好。今天GF和Spartan同学进行了一场大战。现在GF拿到一张地图&#xff0c;地图上一共有n个地点&#xff0c;…

用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里&#xff1a;用ASP.NET Core …

2017 SEERC Divide and Conquer 树上差分

题目 题目大意&#xff1a;给出两颗树的复合图(即这张图是由两颗树拼起来的)&#xff0c;询问最小割掉多少条边&#xff0c;可以使得图不联通&#xff0c;并输出方案数。 分析 我觉得这是一道很难的题目&#xff0c;因为比较难想&#xff0c;前提结论比较多。 首先我们需要…

P2414-[NOI2011]阿狸的打字机【AC自动机,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P2414 题目大意 一个子串表示操作有 往凹槽里打一个字母删除最后一个字母将凹槽中的字母打印到一个新的行里&#xff08;原来的不会消失&#xff09; 然后每次询问两个数字(x,y)(x,y)(x,y)表示询问第xxx行的字串在第yyy行的…

青蛙跳荷叶

青蛙跳荷叶 题目大意&#xff1a; 有n个点&#xff0c;从1开始到跳完这些点&#xff0c;且每次的距离不能相等&#xff0c;一个点不能到多次 原题&#xff1a; 题目描述 从前&#xff0c;有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排&#xff0c;小青蛙一开始…

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介0.1 什么是 ConsulConsul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。这里所谓的服务&#xff0c;不仅仅包括常用的 Api 这些服务&#xff0c;也包括软件开发过程当中所需要的诸如 Rpc、Redis、Mysql 等需要调用的资源。简而言之 Con…

2017 ACM Jordanian Collegiate J.Efficiency Test 动态规划、类倍增

题目 题目链接 题解及代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N 1e57; int f[2*N][55],a[2*N],sum[2*N],ans[2*N],pb[2*N]; int T,n,k; #define pr(x) cout<<#x<<":"&…

P3041-[USACO12JAN]Video Game G【AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3041 题目大意 输入nnn个只有ABCABCABC的字符串&#xff0c;求一个长度为LLL的字符串中最多包含多少个子串是nnn个字符串中的一个 解题思路 考虑ACACAC自动机是如何进行匹配的&#xff0c;对于下一个字符&#xff0c;如果有…

【DFS】排排坐

排排坐 题目大意&#xff1a; 有n个方块&#xff0c;有一些是黑色&#xff0c;有一些是白色&#xff0c;可以点击一个方块使它和它旁边的方块反转颜色&#xff08;黑变白&#xff0c;白变黑&#xff09;&#xff0c;问最少要点多少次才能将方块 们 变成目标的方块们&#xff…

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

预备知识: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立成熟度2级的 API请看这里&#xff1a;用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST, 用ASP.NET Core 2.0 建立规范的 REST AP…

CERC2017 Gambling Guide,最短路变形,期望dp

题目链接 题面链接 题意 给定一个无向图&#xff0c;你需要从11点出发到达n" role="presentation" style="position: relative;">nn点&#xff0c;你在每一点的时候&#xff0c;使用11个单位的代价,随机得到相邻点的票,但是你可以选择留在原地…

P4045-[JSOI2009]密码【AC自动机,状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4045 题目大意 给nnn个字符串&#xff0c;求有多少个长度为lll的字符串包含所有给出的字符串 解题思路 因为nnn很小&#xff0c;考虑状压dpdpdp&#xff0c;因为是包含所有字符串&#xff0c;考虑在ACACAC自动机上dpdpdp。…

华为资深工程师:码农很多,但程序员并不多......

“春节假期&#xff0c;与几位友人小聚&#xff0c;大家互道工作顺利、平安健康云云......期间一位驰骋商界多年的老友问&#xff1a;“你现在在华为做什么工作呀?”我很骄傲地说&#xff1a;”系统架构师“&#xff0c;可是他却愣了很久。但当我老婆在旁边补上一句“码农“时…

【DP】【递归】分离与合体

分离与合体 题目大意&#xff1a; 有n个区域&#xff0c;可以把它们分为两个区间&#xff0c;结果加上左边区间的最左区域的数和最右区域的数还有右边区间的最右区域的数&#xff0c;就这样不停分&#xff0c;使结果最大&#xff0c;并输出各分界线的位置&#xff08;按1/2,2…

NEERC2017 Laminar Family 树链剖分+LCA

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一棵树和一组操作&#xff0c;操作的格式是给出u、vu、v两个节点&#xff0c;并将该节点所确定的路径上的节点全…