HDU 5792 World is Exploding

news/2024/7/7 19:10:27

题意:

给出n代表序列的长度,接下来给出序列A。找出abcd满足abcd互不相等1<=a<b<c<d<=n的同时A[a]<A[b],A[c]>A[d],问这样的abcd有几个.

思路:先忽略四个数两两不相等的条件,那就是(,逆序对个数)乘上(顺序对个数)。例如{2,4,1,3},逆序对就是{(2,1),(4,1),(4,3)} ,顺序对就是{(2,4),(2,3),(1,3)},这样3*3=9,一共九个符合a<b && c>d的四元组。但其中有很多不合法的,对于t这个数,不合法情况的个数就是 (关于t的逆序对个数×关于t的顺序对个数),一一减去就是结果了。(不合法的规律多写几组便能找到)

输入:

4

2 4 1 3

4

1 2 3 4

输出:

1
0

代码:

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <vector>

#include <queue>

#include <cstring>

#include <string>

#include <algorithm>

using namespace std;

typedef  long long  ll;

typedef unsigned long long ull;

#define MM(a,b) memset(a,b,sizeof(a));

#define inf 0x7f7f7f7f

#define FOR(i,n) for(int i=1;i<=n;i++)

#define CT continue;

#define PF printf

#define SC scanf

const int mod=1000000007;

const int N=1e6+10;

int tmp[N],a[N],n,m,c[N],pos[N];

ll lmin[N],rmin[N],lmax[N],rmax[N];

 

int lowbit(int i)

{

    return i&(-i);

}

 

void add(int x)

{

    while(x<=m)

    {

      c[x]+=1;

      x+=lowbit(x);

    }

}

 

int query(int x)

{

    int res=0;

    while(x>0)

    {

        res+=c[x];

        x-=lowbit(x);

    }

    return res;

}

 

int main()

{

    while(~scanf("%d",&n))

    {

         for(int i=1;i<=n;i++)

          {

              scanf("%d",&tmp[i]);

              a[i]=tmp[i];

          }

 

         sort(tmp+1,tmp+n+1);//将tmp按从小到大排序,用于树状数组查找顺/逆序对

         m=unique(tmp+1,tmp+n+1)-tmp-1;//去重

 

         for(int i=1;i<=n;i++)

             pos[i]=lower_bound(tmp+1,tmp+m+1,a[i])-tmp;//找到原来的第i个数在排序后应在的位置

 

         MM(c,0);

         for(int i=1;i<=n;i++)//查询0-i-1之间比a[i]小的数放在lmin[i]里,在i-m之间比a[i]大的放在lmax里

         {

             lmin[i]=query(pos[i]-1);//

             lmax[i]=query(m)-query(pos[i]);

             add(pos[i]);

         }

 

 

         MM(c,0);

         for(int i=n;i>=1;i--)//逆着再来一次

         {

             rmin[i]=query(pos[i]-1);

             rmax[i]=query(m)-query(pos[i]);

             add(pos[i]);

         }

 

         ll ans=0,l=0,r=0;

         for(int i=1;i<=n;i++)  {r+=rmax[i],l+=lmax[i];};

         ans=l*r;

         for(int i=1;i<=n;i++)//去除不合法的

         {

             ans-=lmin[i]*rmin[i];

             ans-=lmax[i]*rmax[i];

             ans-=lmax[i]*lmin[i];

             ans-=rmax[i]*rmin[i];

         }

         printf("%lld\n",ans);

    }

    return 0;

}

转载于:https://www.cnblogs.com/137033036-wjl/p/5745870.html


http://www.niftyadmin.cn/n/1901368.html

相关文章

opc客户端读取数据品质是bad_OPC UA客户端 - BadCertificateHostNameInvalid - opcfoundation.org...

我们已经有一个较旧的VB .NET(Visual Studio 2013社区版)代码片段&#xff0c;当前与一个PLC通过UDP进行通信&#xff0c;其中一些很基本数据传输。OPC UA客户端 - BadCertificateHostNameInvalid - opcfoundation.org现在我们需要PLC和PC之间更紧密的耦合(PC必须能够设置一堆参…

计算几何实践2:几何物体及交叉判断

2017-12-10我们可能在程序中见到非常复杂的图形&#xff0c;但是&#xff0c;他们可以最简单的线段拼接而成。所以&#xff0c;线段是我们关注的重点&#xff0c;其次才是三角形。1 线段交叉判断线段交叉判断是最为基础的算法。最简单的场景&#xff1a;判断两个独立的线段是否…

linux安全之iptables防火墙详解2

在上篇文章中我们介绍了iptables主要的链INPUT&#xff0c;这次我们主要介绍PREROUTING POSTROUTING这两个链主要用于实现nat功能nat&#xff1a;相信学网络的人对这个应该很熟悉&#xff0c;网络地址转换&#xff0c;一般用于局域网共享上网或者特殊的端口转换服务PREROUTING…

js 参数解构_妙用ES6解构和扩展运算符让你的代码更优雅 - loop4ever - 博客园

Javascript ES6/ES2015尘埃落定&#xff0c;其中许多特性其实是为了简化代码。解构运算符&#xff0c;扩展运算符&#xff0c;和rest运算符就是其中很好的特性&#xff0c;它们可以通过减少赋值语句的使用&#xff0c;或者减少通过下标访问数组或对象的方式&#xff0c;使代码更…

Phalcon入门教程之目录结构

2019独角兽企业重金招聘Python工程师标准>>> 原文发表于&#xff1a;Phalcon入门教程之控制器 很多初学Phalcon的朋友&#xff0c;对于以Phalcon框架为基础构建的项目&#xff0c;应该如何组织目录结构有点摸不着头脑。比如多模块的项目中&#xff0c;如何共用"…

纪念一位歌手

2017-12-20从毕业后&#xff0c;我就打算着再学两门外语&#xff0c;像法语或者西班牙语等。结果&#xff0c;一路走来&#xff0c;连搞自己专业知识的时间都不够用&#xff0c;不得不想念大学时光。纵然没有时间学习新的语言&#xff0c;我仍想尽量多的接触一下&#xff0c;即…

HTML5 History API让ajax能回退到上一页

HTML5 History API提供了一种功能&#xff0c;能让开发人员在不刷新整个页面的情况下修改站点的URL。这个功能很有用&#xff0c;例如通过一段JavaScript代码局部加载页面的内容&#xff0c;你希望通过改变当前页面的URL来反应出页面内容的变化&#xff0c;这时该功能可以派上用…

Qt Vulkan支持及Qt界面技术简析

2017-12-18本来计划在Qt5.9版本支持Vulkan的&#xff0c;但是跳水了一个版本&#xff0c;放到了Qt5.10。估计是因为5.9是长期支持版&#xff0c;怕vulkan带来了不稳定性。经过了一周时间的延后&#xff0c;正式版本还是发布了。似乎Qt Vulkan支持一直是 Laszlo Agocs 负责的&am…