三维偏序问题【NOI2018模拟3.28】Subset

2024-05-29 02:48

本文主要是介绍三维偏序问题【NOI2018模拟3.28】Subset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三维偏序问题请看下面

Description

这里写图片描述

Input

第一行一个正整数 n
第二行 n 个数字,表示排列 a i
第三行 n 个数字,表示排列 b i
第四行 n 个数字,表示排列 c i

Output

一行一个整数,表示答案

Sample Input

8
1 7 5 3 4 8 2 6
3 1 2 7 4 8 5 6
6 3 4 5 8 2 1 7

Sample Output

42

Data Constraint

对于 10% 的数据满足 n ≤ 20
对于 30% 的数据满足 n ≤ 2000
另有 20% 的数据满足 a i = b i
对于 100% 的数据满足 n ≤ 100000

Solution

考虑S只包括了包含了三元组的位置,那么|S|<=3
若|S|=1,则答案为n
若|S|=2,则答案为 C2n 减去不合法的
在这种情况下,不合法的只有当某一列三个数都小于另一列,即这一列是没用的。
这个就是三维偏序问题了,具体怎么做,下面再说。
|S|=3,则答案为 C3n 减去不合法的
不合法的有三个最大值都集中在一列或两列
集中在一列,和上面的一样,三维偏序问题
集中在两列,枚举是哪两个数在同一列,然后变成二维偏序问题。

三维偏序问题

也可以理解为三维数点问题,就以这题中数一个点三维都小于另一个点为例。
二维偏序问题是很简单的:
一维排序,然后第二位用树状数组维护一下。
三维偏序也可以这么做,把树状数组变成树状数组套线段树,也不麻烦。
也可以考虑第二维分治,第三维用树状数组。
具体来说,先按照一维排序,在分治时分成两部分,只考虑左半边对右半边的贡献。
这时,可以左半边和右半边分别按第二维排序,因为保证了第一位左边比右边小。
然后只剩一维了,用树状数组维护一下。
递归做到底层就行了。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 101000
#define ll long long
#define lowbit(x) (x&(-x))
using namespace std;
int n,t[N*2];
ll ans,A[N],B=0,X=0;
struct node{int a,b,c,z;
}a[N];
bool cnt1(node a,node b){return a.a<b.a;}
bool cnt2(node a,node b){return a.b<b.b;}
void ins(int x,int y)
{for(;x<=n;x+=lowbit(x)) t[x]+=y;
}
int get(int x)
{int ans=0;for(;x;x-=lowbit(x)) ans+=t[x];return ans;
}
void divide(int l,int r)
{if(l==r) return;int m=(l+r)/2;divide(l,m);divide(m+1,r);sort(a+l,a+r+1,cnt1);sort(a+l,a+m+1,cnt2);sort(a+m+1,a+r+1,cnt2);int j=m+1;fo(i,l,m){ins(a[i].c,1);while(j<=r&&a[j].b<a[i].b) j++;while(j<=r&&a[j].b<a[i+1].b){ll c=get(a[j].c);ans-=c;A[a[j].z]+=c;j++;}}while(j<=r){ll c=get(a[j].c);ans-=c;A[a[j].z]+=c;j++;}fo(i,l,m) ins(a[i].c,-1);
}
void calc()
{memset(t,0,sizeof(t));sort(a+1,a+n+1,cnt1);fo(i,1,n){A[a[i].z]+=get(a[i].b);ins(a[i].b,1);}
}
int main()
{freopen("subset.in","r",stdin);freopen("subset.out","w",stdout);scanf("%d",&n);fo(i,1,n) scanf("%d",&a[i].a);fo(i,1,n) scanf("%d",&a[i].b);fo(i,1,n) scanf("%d",&a[i].c),a[i].z=i;ans=n;ans=ans+ans*(ans-1)/2+ans*(ans-1)*(ans-2)/3/2;sort(a+1,a+n+1,cnt1);divide(1,n);fo(i,1,n) X+=A[i]*(A[i]-1)/2;ans-=X;memset(A,0,sizeof(A));calc();fo(i,1,n) B+=A[i]*(A[i]-1)/2;fo(i,1,n) swap(a[i].b,a[i].c),A[i]=0;calc();fo(i,1,n) B+=A[i]*(A[i]-1)/2;fo(i,1,n) swap(a[i].a,a[i].c),A[i]=0;calc();fo(i,1,n) B+=A[i]*(A[i]-1)/2;ans=ans-B+3*X;printf("%lld\n",ans);
}

这篇关于三维偏序问题【NOI2018模拟3.28】Subset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012428

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx