【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼
【题意】给定三个长度为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赌骆驼相关推荐
- bzoj 4430: [Nwerc2015]Guessing Camels赌骆驼
4430: [Nwerc2015]Guessing Camels赌骆 Description Jaap, Jan, and Thijs are on a trip to the desert afte ...
- [BZOJ4430][Nwerc2015]Guessing Camels赌骆驼
[Nwerc2015]Guessing Camels赌骆驼 Description Jaap, Jan, and Thijs are on a trip to the desert after hav ...
- BZOJ 4430 Guessing Camels赌骆驼
[题意概述] 给出三个n的排列,求有多少个数对在三个排列中顺序相同 [题解] 考虑用补集转化的方法,答案为总对数-不满足的对数 一对数不满足条件,当且仅当这对数在两个排列中顺序相同,在另一个排列中的顺 ...
- Guessing Camels
题目链接:Guessing Camels 把每个数字在分别三个数组出现的位置当成三个维度的下标. 那么问题就变成一个三维偏序了,cdq分治即可. AC代码: #pragma GCC optimize( ...
- Gym - 101485G NWERC2015 G Guessing Camels
本题暴力做听说可以动态树,然而我不会. 3维偏序可以用CDQ分治,寒假学了然而考场上不会写.(菜不成声.jpg) 再间接一点,我们知道是用总数对减去存在逆序的数对. 而逆序就是求两个数列中的两个数字相 ...
- 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...
- 《骆驼祥子》读书报告
<骆驼祥子>读书报告 初2024级13班 刘颜嘉 2022年4月3日 引言 钱会把人引进恶劣的社会中去,把高尚的理想撇开,而甘心走入地狱中去. 一.祥子的小传 积极向上去买车 祥子刚到 ...
- 为什么“骆驼祥子”的奋斗,跳不出贫穷的“三大恶性循环”?
<骆驼祥子>就是一个民国的"北漂故事" 编者按:本文来自微信公众号"人神共奋"(ID:tongyipaocha),作者人神共奋,36氪经授权发布. ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
最新文章
- java开发培训好学习吗?难度大不大?
- 二分查找式的debug
- python-jsonrpc框架实现JsonRPC协议的web服务
- sql 精读(六)获取每个类别中最受欢迎的商品
- 五大常用算法之五:分支限界法
- sql server数据库:创建数据库、建立数据库用户、为用户赋予权限
- dell服务器linux密码,Dell服务器忘记idrac密码,如何在不重启服务器的情况下重置密码?...
- 数据集 oracle,Analytics 数据集 - 
Oracle® ZFS Storage Appliance RESTful API 指南,发行版 OS8.6.0...
- 通过CSS样式隐藏百度版权标志
- vs点击方法跳不到对于的地方_迷你世界:大神玩花式跑酷有多简单?老玩家教你,轻松学会百段跳...
- 机器学习笔记(二)线性回归模型实现
- 三种方法教你如何在 Mac 上检查磁盘空间使用情况
- buffer正确的拼接方式
- 电大系统服务器的性能测试报告表,湖南电大校教职工绩效管理系统的设计与实现...
- 串口液晶屏和并口液晶屏的区别
- git 和gitHup工具笔记的详细教程
- 5G聚合路由器有哪些优势?能应用在哪些场景?
- 时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ 中的T和Z表示什么
- js原生代码实现轮播图淡入淡出和滚动的效果
- 码医自学法V2.2(附名老中医)