正题

题目链接: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-[国家集训队]排队【树状数组套线段树】相关推荐

  1. 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 ...

  2. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  3. P5445-[APIO2019]路灯【set,树状数组套线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P5445 题目大意 n+1n+1n+1个点,iii和i+1i+1i+1个点之间有一条边,qqq个操作 断开/连接第x ...

  4. H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

    H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...

  5. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  6. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)

    #279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...

  7. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  8. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  9. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

最新文章

  1. JMeter入门(1):JMeter总体介绍及组件介绍
  2. 对抗性分割损失素描着色
  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY4-决策树
  4. python人工智能-Python 人工智能应用快速入门 (一)
  5. 学习进度条(第六周)
  6. 从Excel到Python:最常用的36个Pandas函数
  7. 简化Swagger使用的自制Starter:spring-boot-starter-swagger,欢迎使用和吐槽
  8. 清华大学出品:罚梯度范数提高深度学习模型泛化性
  9. openstack 手动安装版 功能测试
  10. android uri parcel,Android ParcelFileDescriptor实现进程间通信
  11. c语言结构体实验张三丰,如何成为公务员考试结构化面试里的张三丰
  12. android 高德amap开发二(地图操作)
  13. error C4703: 使用了可能未初始化的本地指针变量
  14. PRISM概率模型检测器初使用--骰子模型
  15. Matlab 全局变量定义与使用
  16. CleanMyMac X下载Mac系统清理优化工具
  17. 大数据入门教程系列之Hbase安装(伪分布式)
  18. 2课:单片机引脚介绍
  19. pyenchant英文单词拼写检查
  20. 数据的结构分类:结构化数据,半结构化数据以及非结构化数据

热门文章

  1. position定位 响应式_使用 Vue3 实现双盒子定位 Overlay
  2. java综合图形界面程序设计_java综合图形界面程序设计.doc
  3. linux文件目录的管理,Linux文件目录管理
  4. 查看linux的计划任务日志,查看计划任务日志(共5篇).docx
  5. python安装地是什么_如何安装python
  6. oracle dbf文件设置,oracle移动数据dbf文件
  7. java实用教程——组件及事件处理——概述
  8. Mysql中group by 使用中发现的问题
  9. C++ 学习之旅(5)——设置Setup文件目录
  10. 《C++ Primer》7.1.3节练习