题目链接:P1975 [国家集训队]排队
题目大意: 给你一段数列,每次可以交换两个数的位置,问每次交换之后全局的逆序对个数。
题目分析: 对于一个序列,题目要求求动态的逆序对个数,考虑交换某两个位置,假设分别为 pos1,pos2pos_1,pos_2pos1​,pos2​,那么发生变化的逆序对一定是在[pos1,pos2][pos_1,pos_2][pos1​,pos2​]这个区间上的,那么考虑交换,就等价于将 pos1pos_1pos1​ 位置的数字删去,将pos2pos_2pos2​ 位置的数字删去,将 pos2pos_2pos2​ 位置加一个新数,将 pos1pos_1pos1​位置加一个新数。因此考虑求区间排名,然后就可以离散化之后用树套树来解决了。
下面是代码 (写的丑轻喷)
题目代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define mxn 100005
int Rt,n,m,Tot,tot,arr[mxn],brr[mxn],Ns[mxn],a[mxn],rt[mxn*10],sm[mxn*300],ls[mxn*300],rs[mxn*300],Ls[mxn*10],Rs[mxn*10];void Add(int &k,int L,int R,int p,int o){if(o==1&&!k)k=++tot;if(k)sm[k]+=o;if(!k||L==R)return;int mid=(L+R)>>1;if(p<=mid)Add(ls[k],L,mid,p,o);else Add(rs[k],mid+1,R,p,o);
}
int Query(int k,int L,int R,int l,int r){if(!k)return 0;if(l<=L&&r>=R)return sm[k];int mid=(L+R)>>1;if(r<=mid)return Query(ls[k],L,mid,l,r);else if(l>mid)return Query(rs[k],mid+1,R,l,r);else return Query(ls[k],L,mid,l,mid)+Query(rs[k],mid+1,R,mid+1,r);
}
int Query_rank(int k,int L,int R,int l,int r,int f,int t){if(!k)return 0;if(l<=L&&r>=R)return Query(rt[k],1,n,f,t);int mid=(L+R)>>1;return (l<=mid?Query_rank(Ls[k],L,mid,l,r,f,t):0)+(r>mid?Query_rank(Rs[k],mid+1,R,l,r,f,t):0);
}
int Query_kth(int k,int L,int R,int x,int l,int r){if(L==R)return L;int mid=(L+R)>>1,tmp=Query(rt[Ls[k]],1,n,l,r);if(x<=tmp)return Query_kth(Ls[k],L,mid,x,l,r);else return Query_kth(Rs[k],mid+1,R,x-tmp,l,r);
}
void Update(int &k,int L,int R,int v,int p,int o){if(o==1&&!k)k=++Tot;if(k)Add(rt[k],1,n,p,o);if(!k||L==R)return;int mid=(L+R)>>1;if(v<=mid)Update(Ls[k],L,mid,v,p,o);else Update(Rs[k],mid+1,R,v,p,o);
}
int Get_pre(int x,int y,int z){if(Query_rank(Rt,0,1e8,0,z-1,x,y)==Query_rank(Rt,0,1e8,0,-1e9,x,y))return -2147483647;return Query_kth(Rt,0,1e8,Query_rank(Rt,0,1e8,0,z-1,x,y),x,y);
}
int Get_nxt(int x,int y,int z){if(Query_rank(Rt,0,1e8,0,z,x,y)==Query_rank(Rt,0,1e8,0,1e9,x,y))return 2147483647;return Query_kth(Rt,0,1e8,Query_rank(Rt,0,1e8,0,z,x,y)+1,x,y);
}
int ans;
void mergesort(int l,int mid,int r)
{int ll=l,rr=mid+1,ss=l;while(ss<=r){if(rr>r||arr[ll]<=arr[rr]&&ll<=mid) {brr[ss]=arr[ll];ll++; }else{brr[ss]=arr[rr];ans+=mid-ll+1;rr++;}ss++; }for(int i=l;i<=r;++i)arr[i]=brr[i];
}
void merge(int l,int r)
{if(l==r)return ;int mid=(l+r)/2;merge(l,mid);merge(mid+1,r);mergesort(l,mid,r);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&arr[i]);Ns[i]=arr[i];}sort(Ns+1,Ns+n+1);int N=unique(Ns+1,Ns+n+1)-Ns-1;for(int i=1;i<=n;i++)arr[i]=a[i]=lower_bound(Ns+1,Ns+N+1,arr[i])-Ns;for(int i=1;i<=n;i++)Update(Rt,0,1e9,arr[i],i,1);merge(1,n);for(int i=1;i<=n;i++)arr[i]=a[i];printf("%d\n",ans);scanf("%d",&m);for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);if(a>b)swap(a,b);if(arr[a]>arr[b])--ans;if(arr[a]<arr[b])++ans;if(b!=a+1){int len=b-a-1;int ns=Query_rank(Rt,0,1e9,0,arr[a]-1,a+1,b-1);//<aint np=Query_rank(Rt,0,1e9,0,arr[b]-1,a+1,b-1);//<bint nt=len-Query_rank(Rt,0,1e9,0,arr[a],a+1,b-1);//>aint nq=len-Query_rank(Rt,0,1e9,0,arr[b],a+1,b-1);//>bans=ans-ns+np-nq+nt;}swap(arr[a],arr[b]);Update(Rt,0,1e9,arr[b],a,-1);Update(Rt,0,1e9,arr[b],b,1);Update(Rt,0,1e9,arr[a],b,-1);Update(Rt,0,1e9,arr[a],a,1);printf("%d\n",ans);}return 0;
}

P1975 [国家集训队]排队相关推荐

  1. P1975 [国家集训队]排队(三维偏序)

    P1975 [国家集训队]排队 查询逆序对数目,交换两个数的位置 首先逆序对是一个经典的二维偏序问题,然后现在问题变为静态,我们可以使用三维偏序来处理多出来的限制.或者也可以使用带修主席树处理.

  2. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  3. luogu1975 [国家集训队]排队

    思路 序列中 |i | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| |----|--|--|--|--|--|--|--|--|--|--| |a[i]| a| b| c| L| d ...

  4. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  5. BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2156 是 hydro 的 BZOJ ...

  6. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  8. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到 ...

  9. Luogu4451 [国家集训队]整数的lqp拆分

    题目链接:洛谷 题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\prod_{i=1}^mf_{a_i}$之和.其中$f_i$为斐波那契数列的第$i$项. 数 ...

  10. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...

    雷刚 发自 副中心  量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...

最新文章

  1. hypervisor简介
  2. 怎么读取java文件,Java怎么读取文件
  3. SAP QM 检验批上留样记录如何看?
  4. PHP学习笔记1.2——预定义变量参考
  5. Exchannge 2013数据库副本频繁自动切换
  6. Actor-ES框架:Ray-Handler-消息订阅器编写
  7. python代码没有反应_没有任何编程经验者不要被Python简明手册误导。
  8. 史上最牛研究生已成院士,给出“维持科研创新能力”的秘诀
  9. MYSQ--SHOW PROFILE Syntax and useing
  10. Tkinter注册界面判断用户名是否唯一的合法性验证(Python3.7)
  11. 量子通讯加密技术的技术原理
  12. linux返回上一步命令
  13. xdb 服务_localhost 8080 XDB服务器需要用户名和密码的问题
  14. 阿里云导出的镜像raw转换成vmdk格式工具
  15. arcgis api 4.X 比例尺的添加
  16. 【6.28校内test】T2 【音乐会】二重变革
  17. Cocos creator接 IOS 穿山甲
  18. docker oxidized时区问题,时间显示不是北京时间问题的解决办法
  19. 【C语言】初识C语言(中篇)
  20. 戴尔1420装XP方法和驱动

热门文章

  1. 视频I帧/P帧/B帧
  2. VS Code自定义代码颜色
  3. PING 192.168.5.13 (192.168.5.13 ) 56(84) data bytes后长时间不响应
  4. w10计算机用户名密码忘了,电脑w10系统开机密码忘了
  5. Linux下把ncsi设置成OCP模式,一种测试网卡NCSI连接稳定性的方法及系统与流程
  6. 科三 二十里铺(带视频)
  7. 谷歌小恐龙PHP代码,Chrome小恐龙前端修改代码代码总结
  8. 无法修改计算机时间权限,无法修改系统时间怎么办
  9. 怎么进入计算机网络权限设置方法,电脑怎么设置网络访问权限保护共享文件安全...
  10. python excel 设置行高与列宽