#主席树、二分、树状数组#洛谷 3157 JZOJ 2287 动态逆序对

2024-02-11 05:18

本文主要是介绍#主席树、二分、树状数组#洛谷 3157 JZOJ 2287 动态逆序对,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


分析

首先如果不带修改操作那么就是一道主席树题目,但是既然有了修改,那么还必须用上树状数组维护,时间复杂度 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=100001;
int xa[N],xb[N],w[N*240],ls[N*240],rs[N*240],pos[N],n,m,cnt,rt[N]; long long ans;
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline void print(long long ans){if (ans>9) print(ans/10);putchar(ans%10+48);
}
inline void update(int &rt,int l,int r,int x,int y){if (!rt) rt=++cnt; w[rt]+=y; if (l==r) return; rr int mid=(l+r)>>1;if (x<=mid) update(ls[rt],l,mid,x,y);else update(rs[rt],mid+1,r,x,y);
}
inline signed query(int l,int r,int x,int type){rr int ca=0,cb=0,sum=0;for (rr int i=l-1;i;i-=-i&i) xa[++ca]=rt[i];for (rr int i=r;i;i-=-i&i) xb[++cb]=rt[i];for (rr int l=1,r=n;l<r;){rr int mid=(l+r)>>1;if (x>mid){if (type){for (rr int i=1;i<=ca;++i) sum-=w[ls[xa[i]]];for (rr int i=1;i<=cb;++i) sum+=w[ls[xb[i]]];}for (rr int i=1;i<=ca;++i) xa[i]=rs[xa[i]];for (rr int i=1;i<=cb;++i) xb[i]=rs[xb[i]];l=mid+1;}else{if (!type){for (rr int i=1;i<=ca;++i) sum-=w[rs[xa[i]]];for (rr int i=1;i<=cb;++i) sum+=w[rs[xb[i]]];}for (rr int i=1;i<=ca;++i) xa[i]=ls[xa[i]];for (rr int i=1;i<=cb;++i) xb[i]=ls[xb[i]];			r=mid;}}return sum;
}
signed main(){n=iut(); m=iut();for (rr int i=1,x;i<=n;++i){pos[x=iut()]=i,ans+=query(1,i-1,x,0);for (rr int j=i;j<=n;j+=-j&j) update(rt[j],1,n,x,1);}print(ans),putchar(10);for (rr int i=1;i<m;++i){rr int x=iut();ans-=query(1,pos[x]-1,x,0)+query(pos[x]+1,n,x,1);print(ans),putchar(10);for (rr int j=pos[x];j<=n;j+=-j&j) update(rt[j],1,n,x,-1);}return 0;
}

这篇关于#主席树、二分、树状数组#洛谷 3157 JZOJ 2287 动态逆序对的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698928

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序