PAT-TL 1009. Triple Inversions

本文介绍了一种高效计算数组中三元逆序对数量的方法。利用树状数组来快速统计每个元素前后特定条件下的元素数量,进而求得所有三元逆序对的总数。该算法避免了重复计算,适用于数据规模较小的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、知识点:逆序数
2、思路:求中间节点arr[i]前面比它大的数left_big_num[i],后面比它小的数right_small_num[i],答案就是对left_big_num[i]*right_small_num[i]求和, i从2到n-1。用树状数组计算left_big_num[i],right_small_num[i]可以用一个小技巧间接求得,没必要重复计算。看了网上几篇博文,发现有人用排序离散化,其实由于本题n<10^5,可以不用。

/*用途:
**说明:
**算法:
*/

#define LOCAL
#include <cstdio>
#include <string.h>
using namespace std;
#define MAXN 100000+10
typedef long long LL;

int N;
int arr[MAXN];
int tree_arr[MAXN]; 
LL left_big_num[MAXN];
LL right_small_num[MAXN];

int low_bit(int a);
int get_sum(int ind);
void insert(int ind, int val);
int main()
{
#ifdef LOCAL
    freopen("1009_Triple_Inversions.in", "r", stdin);
    freopen("1009_Triple_Inversions.out", "w", stdout);
#endif
    scanf("%d", &N);
    for(int i=1; i<=N; i++)
        scanf("%d", &(arr[i]));

    if(N < 3){
        printf("0");
        return 0;
    }

    for(int i=1; i<=N; i++){
        int ls = get_sum(arr[i]);//出现在arr[i]前面且比arr[i]小的数的个数
        left_big_num[i] = i-1 - ls;//arr[i]前面出现的所有数的个数减去ls(因为在树状数组中,比arr[i]大的数都插到的arr[i]后面了)
        right_small_num[i] = arr[i]-1-ls;//总共比arr[i]小的数减去左边比它小的数 
        insert(arr[i], 1);//以arr[i]的值为下标插入  
    }

    LL ans = 0;
    for(int i=2; i<=N-1; i++)
        ans += left_big_num[i] * right_small_num[i];

    printf("%lld", ans);

    return 0;
}

inline int low_bit(int a)
{
    return a&(-a);
}

inline int get_sum(int ind)
{
    int sum=0;
    while(ind){
        sum += tree_arr[ind];
        ind -= low_bit(ind);
    }
    return sum;
}

inline void insert(int ind, int val)
{   
    while(ind <= N){
        tree_arr[ind] += val;
        ind += low_bit(ind);
    }
}
22:02:03:343 INFO 17028 --- [erverWorker-5-2] o.a.d.r.t.netty4.NettyChannelHandler : [DUBBO] The connection [id: 0xec5dea40, L:/10.44.85.106:50053 - R:/10.44.85.106:10457] of 10.44.85.106:10457 -> 10.44.85.106:50053 is established., dubbo version: 3.3.0, current host: 10.44.85.106 22:02:03:417 DEBUG 17028 --- [erverWorker-5-2] .a.d.r.p.t.r.m.RestRequestHandlerMapping : [DUBBO] Received http request: ServletHttpRequestAdapter{method='POST', uri='/carts', contentType='application/json;charset=UTF-8'}, dubbo version: 3.3.0, current host: 10.44.85.106 22:02:03:417 DEBUG 17028 --- [erverWorker-5-2] .a.d.r.p.t.r.m.RestRequestHandlerMapping : [DUBBO] No handler found for http request: ServletHttpRequestAdapter{method='POST', uri='/carts', contentType='application/json;charset=UTF-8'}, dubbo version: 3.3.0, current host: 10.44.85.106 22:02:03:419 INFO 17028 --- [erverWorker-5-2] .r.p.t.h.AbstractServerTransportListener : [DUBBO] An error occurred while processing the http request with DefaultHttp11ServerTransportListener, Http1Request{method='POST', path='/carts', contentType='application/json;charset=UTF-8'}, dubbo version: 3.3.0, current host: 10.44.85.106 org.apache.dubbo.remoting.http12.exception.HttpStatusException: Invoker not found at org.apache.dubbo.rpc.protocol.tri.h12.AbstractServerTransportListener.doRoute(AbstractServerTransportListener.java:127) ~[dubbo-3.3.0.jar:3.3.0] at org.apache.dubbo.rpc.protocol.tri.h12.AbstractServerTransportListener.onBeforeMetadata(AbstractServerTransportListener.java:121) ~[dubbo-3.3.0.jar:3.3.0] at org.apache.dubbo.rpc.protocol.tri.h12.AbstractServerTransportListener.onMetadata(AbstractServerTransportListener.java:88) ~[dubbo-3.3.0.jar:3.3.0] at org.apache.dubbo.rpc.protocol.tri.h12.AbstractServerTransportListener.onMetadata(AbstractServerTransportListener.java:53) ~[dubbo-3.3.0.jar:3.3.0] at org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1ConnectionHandler.channelRead0(NettyHttp1ConnectionHandler.java:56) ~[dubbo-3.3.0.jar:3.3.0] at org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1ConnectionHandler.channelRead0(NettyHttp1ConnectionHandler.java:29) ~[dubbo-3.3.0.jar:3.3.0] at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1Codec.channelRead(NettyHttp1Codec.java:49) ~[dubbo-3.3.0.jar:3.3.0] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:266) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:537) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) ~[netty-codec-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1407) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994) ~[netty-common-4.1.112.Final.jar:4.1.112.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.112.Final.jar:4.1.112.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.112.Final.jar:4.1.112.Final] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] 22:02:03:445 DEBUG 17028 --- [erverWorker-5-2] .d.r.h.AbstractServerHttpChannelObserver : [DUBBO] Http response body sent: '{"message":"Invoker not found","status":"404"}' by [org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1Channel@9b93704], dubbo version: 3.3.0, current host: 10.44.85.106 22:02:03:449 DEBUG 17028 --- [erverWorker-5-2] .d.r.h.AbstractServerHttpChannelObserver : [DUBBO] Http response headers sent: NettyHttp1HttpHeaders{headers=DefaultHttpHeaders[content-type: application/json, alt-svc: h2=":50053", content-length: 46]}, dubbo version: 3.3.0, current host: 10.44.85.106
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值