【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=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
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=;for(int i=x;i>=;i-=lowbit(i))ans+=d[i];return ans;}
void calc(cyc a[],cyc b[]){
memset(d,,sizeof(d));
for(int i=;i<=n;i++)A[a[i].id]=b[i].id;
for(int i=;i<=n;i++){
modify(A[i]);
ans+=i-query(A[i]);
}
}
int main(){
n=read();
for(int i=;i<=n;i++)a[i].num=read(),a[i].id=i;
for(int i=;i<=n;i++)b[i].num=read(),b[i].id=i;
for(int i=;i<=n;i++)c[i].num=read(),c[i].id=i;
sort(a+,a+n+,cmp);sort(b+,b+n+,cmp);sort(c+,c+n+,cmp);
ans=;
calc(a,b);calc(b,c);calc(a,c);
printf("%lld",1ll*n*(n-)/-ans/);
return ;
}
【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赌骆驼
		传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4430 [题解] 把每只骆驼在第一个人.第二个人.第三个人的位置找出来,然后做三维偏序即可. ... 
- BZOJ 4430 Guessing Camels赌骆驼
		[题意概述] 给出三个n的排列,求有多少个数对在三个排列中顺序相同 [题解] 考虑用补集转化的方法,答案为总对数-不满足的对数 一对数不满足条件,当且仅当这对数在两个排列中顺序相同,在另一个排列中的顺 ... 
- BZOJ 4430 Guessing Camels
		Description Jaap, Jan, and Thijs are on a trip to the desert after having attended the ACM ICPC Worl ... 
- bzoj 4428: [Nwerc2015]Debugging调试
		4428: [Nwerc2015]Debugging调试 Description Your fancy debugger will not help you in this matter. There ... 
- 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
		题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ... 
- BZOJ 4425: [Nwerc2015]Assigning Workstations分配工作站
		难度在于读题 #include<cstdio> #include<algorithm> #include<queue> using namespace std; p ... 
- bzoj AC倒序
		Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ... 
- 越狱Season 1-Episode 13: End of the Tunnel
		Season 1, Episode 13: End of the Tunnel -Fernando: The name is John Abruzzi. 名字是John Abruzzi A b r u ... 
随机推荐
- Crash使用参考
			整理自man 8 crash 1.简介 Crash工具可以用来分析一个正在运行的内核,也可以用来分析一个内核的crash dump文件,这里说的是内核代码异常产生的crash dump文件,不是应用层 ... 
- 转  高性能IO模型浅析
			高性能IO模型浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: ( ... 
- python爬虫 妹子图片网
			代码如下 #coding=utf-8 import os import re import urllib from time import sleep import requests from lxm ... 
- Win10修改编辑hosts文件无法保存怎么办
			Win10无法修改编辑保存hosts文件怎么办?Win10系统默认是没有权限去编辑保存系统里的文件,这也是权限不够才导致修改编辑hosts后无法保存的原因,解决的办法就是把自己的帐户权限给提高就行了. ... 
- ManagementObjectSearcher的使用
			1.获取本地路径的网络访问地址 private IEnumerable<KeyValuePair<string, string>> GetShareFolders() { va ... 
- 枚举当前环境中打开的所有IE
			IE程序是属于Shell的一个应用程序,要枚举当前打开的所有IE程序窗口,可以通过ShellWindows集合来打开属于Shell的当前的窗口的集合. 首先添加程序需要的头文件和tlb库 //#imp ... 
- Redis 学习之集群
			该文使用centos6.5 64位 redis3.2.8 一. redis-cluster架构图 集群通信:所有redis节点之间通过PING-PONG机制彼此互联,内部使用二进制鞋子优化传输速度 ... 
- 【python】用 sqlacodegen 将存在的数据库表 转化成model.py
			Flask的sqlalchemy对数据库表的模型提供了很多易用的方法.为了使用这些内容,需要将数据库表按照Flask识别的格式创建成Model,但是一般我们都是在已经创建好的数据库环境中开发Pytho ... 
- What’s That NetScaler Reset Packet?
			What’s That NetScaler Reset Packet? https://www.citrix.com/blogs/2014/05/20/whats-that-netscaler-res ... 
- [HNOI2010]合唱队 区间DP
			---题面--- 题解: 偶然翻到这道题,,,就写了. 观察到一个数被插在哪里只受前一个数的影响,如果明确了前一个数是哪个,那么我们就可以确定大小关系,就可以知道当前这个数插在哪里,而上一个插入的数就 ... 
