【题意】给定三个长度为n的排列,求在三个排列中顺序相同的数对个数。

【算法】逆序对

【题解】很容易联想到NOIP火柴排队,涉及顺序问题显然和逆序对息息相关。

一个数对如果在三个排列中顺序不同,一定是1+2或2+1,也就是只在两数列之间顺序相同。

所以对三个数列两两求逆序对总数num,则不满足要求的数对一定会产生且仅产生两个逆序对,ans=n*(n-1)/2-num/2。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define lowbit(x) x&-x
#define ll long long
using namespace std;
int read(){char c;int s=0,t=1;while(!isdigit(c=getchar()))if(c=='-')t=-1;do{s=s*10+c-'0';}while(isdigit(c=getchar()));return s*t;
}
const int maxn=200010;
ll ans;
int d[maxn],n,A[maxn];
struct cyc{int num,id;}a[maxn],b[maxn],c[maxn];
bool cmp(cyc a,cyc b){return a.num<b.num;}
void modify(int x){for(int i=x;i<=n;i+=lowbit(i))d[i]++;}
int query(int x){int ans=0;for(int i=x;i>=1;i-=lowbit(i))ans+=d[i];return ans;}
void calc(cyc a[],cyc b[]){memset(d,0,sizeof(d));for(int i=1;i<=n;i++)A[a[i].id]=b[i].id;for(int i=1;i<=n;i++){modify(A[i]);ans+=i-query(A[i]);}
}
int main(){n=read();for(int i=1;i<=n;i++)a[i].num=read(),a[i].id=i;for(int i=1;i<=n;i++)b[i].num=read(),b[i].id=i;for(int i=1;i<=n;i++)c[i].num=read(),c[i].id=i;sort(a+1,a+n+1,cmp);sort(b+1,b+n+1,cmp);sort(c+1,c+n+1,cmp);ans=0;calc(a,b);calc(b,c);calc(a,c);printf("%lld",1ll*n*(n-1)/2-ans/2);return 0;
}

View Code

转载于:https://www.cnblogs.com/onioncyc/p/7782150.html

【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼相关推荐

  1. bzoj 4430: [Nwerc2015]Guessing Camels赌骆驼

    4430: [Nwerc2015]Guessing Camels赌骆 Description Jaap, Jan, and Thijs are on a trip to the desert afte ...

  2. [BZOJ4430][Nwerc2015]Guessing Camels赌骆驼

    [Nwerc2015]Guessing Camels赌骆驼 Description Jaap, Jan, and Thijs are on a trip to the desert after hav ...

  3. BZOJ 4430 Guessing Camels赌骆驼

    [题意概述] 给出三个n的排列,求有多少个数对在三个排列中顺序相同 [题解] 考虑用补集转化的方法,答案为总对数-不满足的对数 一对数不满足条件,当且仅当这对数在两个排列中顺序相同,在另一个排列中的顺 ...

  4. Guessing Camels

    题目链接:Guessing Camels 把每个数字在分别三个数组出现的位置当成三个维度的下标. 那么问题就变成一个三维偏序了,cdq分治即可. AC代码: #pragma GCC optimize( ...

  5. Gym - 101485G NWERC2015 G Guessing Camels

    本题暴力做听说可以动态树,然而我不会. 3维偏序可以用CDQ分治,寒假学了然而考场上不会写.(菜不成声.jpg) 再间接一点,我们知道是用总数对减去存在逆序的数对. 而逆序就是求两个数列中的两个数字相 ...

  6. 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels

    题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...

  7. 《骆驼祥子》读书报告

    <骆驼祥子>读书报告 初2024级13班 刘颜嘉 2022年4月3日 引言 钱会把人引进恶劣的社会中去,把高尚的理想撇开,而甘心走入地狱中去. 一.祥子的小传   积极向上去买车 祥子刚到 ...

  8. 为什么“骆驼祥子”的奋斗,跳不出贫穷的“三大恶性循环”?

    <骆驼祥子>就是一个民国的"北漂故事" 编者按:本文来自微信公众号"人神共奋"(ID:tongyipaocha),作者人神共奋,36氪经授权发布. ...

  9. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

最新文章

  1. java开发培训好学习吗?难度大不大?
  2. 二分查找式的debug
  3. python-jsonrpc框架实现JsonRPC协议的web服务
  4. sql 精读(六)获取每个类别中最受欢迎的商品
  5. 五大常用算法之五:分支限界法
  6. sql server数据库:创建数据库、建立数据库用户、为用户赋予权限
  7. dell服务器linux密码,Dell服务器忘记idrac密码,如何在不重启服务器的情况下重置密码?...
  8. 数据集 oracle,Analytics 数据集 - Oracle® ZFS Storage Appliance RESTful API 指南,发行版 OS8.6.0...
  9. 通过CSS样式隐藏百度版权标志
  10. vs点击方法跳不到对于的地方_迷你世界:大神玩花式跑酷有多简单?老玩家教你,轻松学会百段跳...
  11. 机器学习笔记(二)线性回归模型实现
  12. 三种方法教你如何在 Mac 上检查磁盘空间使用情况
  13. buffer正确的拼接方式
  14. 电大系统服务器的性能测试报告表,湖南电大校教职工绩效管理系统的设计与实现...
  15. 串口液晶屏和并口液晶屏的区别
  16. git 和gitHup工具笔记的详细教程
  17. 5G聚合路由器有哪些优势?能应用在哪些场景?
  18. 时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ 中的T和Z表示什么
  19. js原生代码实现轮播图淡入淡出和滚动的效果
  20. 码医自学法V2.2(附名老中医)

热门文章

  1. 基于SSM实现旅游网站管理系统
  2. Eclipse利用Maven的插件部署web项目到远程tomcat服务器
  3. hdu-6166(最短路+二进制分组)
  4. FFT [TPLY]
  5. Extjs鼠标长按事件(实现长按按钮触发事件的方法:mousedown、mouseup)
  6. 三星S4接电话黑屏无法挂断通话
  7. Android Fragment详解(二):Fragment创建及其生命周期
  8. 你应该知道的15个Silverlight诀窍
  9. JS的一些扩展:String、StringBuilder、Uri
  10. Windows 多种版介绍