P1975-[国家集训队]排队【树状数组套线段树】
正题
题目链接:https://www.luogu.com.cn/problem/P1975
题目大意
一个nnn个数字的序列,每次交换两个数,求逆序对。
解题思路
显然交换lll和rrr的话对[1..l−1][1..l-1][1..l−1]和[r+1,n][r+1,n][r+1,n]是不会有影响的,所以我们只需要考虑lll和rrr与[l+1,r−1][l+1,r-1][l+1,r−1]之间的逆序对。
用主席树我们可以做到不带修改的求,考虑如何修改,我们使用线段树记录树状数组上的数值,我们就可以得到一个可以区间修改的主席树,可以解决本题。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=2e5+10,M=1e7+10,L=1e9;
int a[N],root[N],n,m,tot,ans;
struct Seg_Tree{int v[M],ls[M],rs[M];void Change(int &x,int l,int r,int pos,int val){if(!x) x=++tot;v[x]+=val;if(l==r) return;int mid=(l+r)>>1;if(pos<=mid) Change(ls[x],l,mid,pos,val);else Change(rs[x],mid+1,r,pos,val);}int Get_Big(int &x,int l,int r,int pos){if(l==r||!x) return 0;int mid=(l+r)>>1;if(pos<=mid)return v[rs[x]]+Get_Big(ls[x],l,mid,pos);else return Get_Big(rs[x],mid+1,r,pos);}int Get_Sma(int &x,int l,int r,int pos){if(l==r||!x) return 0;int mid=(l+r)>>1;if(pos<=mid) return Get_Sma(ls[x],l,mid,pos);else return Get_Sma(rs[x],mid+1,r,pos)+v[ls[x]];}
}T;
void Change(int x,int y,int val){while(x<=n){T.Change(root[x],1,L,y,val);x+=lowbit(x);}
}
int Bigger(int x,int y){int ans=0;while(x){ans+=T.Get_Big(root[x],1,L,y);x-=lowbit(x);}return ans;
}
int Smaller(int x,int y){int ans=0;while(x){ans+=T.Get_Sma(root[x],1,L,y);x-=lowbit(x);}return ans;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);ans+=Bigger(i-1,a[i]);Change(i,a[i],1);}printf("%d\n",ans);scanf("%d",&m);while(m--){int x,y;scanf("%d%d",&x,&y);if(x>y)swap(x,y);ans-=Smaller(y-1,a[x])-Smaller(x,a[x])+Bigger(y-1,a[y])-Bigger(x,a[y]);ans+=Bigger(y-1,a[x])-Bigger(x,a[x])+Smaller(y-1,a[y])-Smaller(x,a[y]);ans+=(a[x]<a[y])-(a[x]>a[y]);printf("%d\n",ans);Change(x,a[x],-1);Change(x,a[y],1);Change(y,a[y],-1);Change(y,a[x],1);swap(a[x],a[y]);}
}
P1975-[国家集训队]排队【树状数组套线段树】相关推荐
- BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- P5445-[APIO2019]路灯【set,树状数组套线段树】
正题 题目链接:https://www.luogu.com.cn/problem/P5445 题目大意 n+1n+1n+1个点,iii和i+1i+1i+1个点之间有一条边,qqq个操作 断开/连接第x ...
- H - Hello Ms. Ze(树状数组套主席树,线段树上二分)
H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...
- ICPC 徐州 H Yuuki and a problem (树状数组套主席树)
Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...
- #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)
#279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...
- 【BZOJ1901】Dynamic Rankings,树状数组套主席树
Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树
文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...
最新文章
- JMeter入门(1):JMeter总体介绍及组件介绍
- 对抗性分割损失素描着色
- 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY4-决策树
- python人工智能-Python 人工智能应用快速入门 (一)
- 学习进度条(第六周)
- 从Excel到Python:最常用的36个Pandas函数
- 简化Swagger使用的自制Starter:spring-boot-starter-swagger,欢迎使用和吐槽
- 清华大学出品:罚梯度范数提高深度学习模型泛化性
- openstack 手动安装版 功能测试
- android uri parcel,Android ParcelFileDescriptor实现进程间通信
- c语言结构体实验张三丰,如何成为公务员考试结构化面试里的张三丰
- android 高德amap开发二(地图操作)
- error C4703: 使用了可能未初始化的本地指针变量
- PRISM概率模型检测器初使用--骰子模型
- Matlab 全局变量定义与使用
- CleanMyMac X下载Mac系统清理优化工具
- 大数据入门教程系列之Hbase安装(伪分布式)
- 2课:单片机引脚介绍
- pyenchant英文单词拼写检查
- 数据的结构分类:结构化数据,半结构化数据以及非结构化数据
热门文章
- position定位 响应式_使用 Vue3 实现双盒子定位 Overlay
- java综合图形界面程序设计_java综合图形界面程序设计.doc
- linux文件目录的管理,Linux文件目录管理
- 查看linux的计划任务日志,查看计划任务日志(共5篇).docx
- python安装地是什么_如何安装python
- oracle dbf文件设置,oracle移动数据dbf文件
- java实用教程——组件及事件处理——概述
- Mysql中group by 使用中发现的问题
- C++ 学习之旅(5)——设置Setup文件目录
- 《C++ Primer》7.1.3节练习