题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5792

World is Exploding

Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
#### 问题描述
>![](http://images2015.cnblogs.com/blog/809202/201608/809202-20160807150517450-1373867798.png)
#### 输入
> The input consists of multiple test cases.
> Each test case begin with an integer n in a single line.
>
> The next line contains n integers A1,A2⋯An.
> 1≤n≤50000
> 0≤Ai≤1e9

输出

For each test case,output a line contains an integer.

样例

sample input

4

2 4 1 3

4

1 2 3 4

sample output

1

0

题解

数据给的50000,枚举两个点是不可能了,但题目只是要四元组的个数,并没有问每个四元组长什么样,那么我们可以考虑预处理统计一些值出来,枚举一个点尝试一下。

我们预处理出四个数组:ls[i],lg[i],rs[i],rg[i]。分别表示i左边比它小的,比它大的;i右边比它小的,比它大的个数。然后我们每次枚举左下角的点去做,再扣去算出来是三个点(一个点算重了,注意:不可能有两个点都算重)的情况,就可以了。具体的统计公式看代码。

代码

  1. #include<map>
  2. #include<cmath>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstdio>
  6. #include<string>
  7. #include<cstring>
  8. #include<iostream>
  9. #include<algorithm>
  10. #define X first
  11. #define Y second
  12. #define mkp make_pair
  13. #define lson (o<<1)
  14. #define rson ((o<<1)|1)
  15. #define mid (l+(r-l)/2)
  16. #define pb(v) push_back(v)
  17. #define sz() size()
  18. #define all(o) (o).begin(),(o).end()
  19. #define clr(a,v) memset(a,v,sizeof(a))
  20. #define bug(a) cout<<#a<<" = "<<a<<endl
  21. #define rep(i,a,b) for(int i=a;i<(b);i++)
  22. using namespace std;
  23. typedef long long LL;
  24. typedef vector<int> VI;
  25. typedef pair<int,int> PII;
  26. typedef vector<pair<int,int> > VPII;
  27. const int INF=0x3f3f3f3f;
  28. const LL INFL=0x3f3f3f3f3f3f3f3fLL;
  29. const double eps=1e-8;
  30. //start----------------------------------------------------------------------
  31. const int maxn = 5e4+10;
  32. const int mod=21092013;
  33. int n;
  34. int ls[maxn],lg[maxn],rs[maxn],rg[maxn];
  35. int arr[maxn],arr2[maxn];
  36. VI ha;
  37. int sumv[maxn];
  38. void add(int x,int v){
  39. while(x<=n){
  40. sumv[x]+=v;
  41. x+=x&(-x);
  42. }
  43. }
  44. int sum(int x){
  45. int ret=0;
  46. while(x>0){
  47. ret+=sumv[x];
  48. x-=x&(-x);
  49. }
  50. return ret;
  51. }
  52. void init(){
  53. ha.clear();
  54. clr(ls,0);
  55. clr(lg,0);
  56. clr(rs,0);
  57. clr(rg,0);
  58. clr(sumv,0);
  59. }
  60. int main() {
  61. while(scanf("%d",&n)==1&&n){
  62. init();
  63. rep(i,0,n){
  64. scanf("%d",&arr[i]);
  65. arr2[i]=arr[i];
  66. ha.pb(arr[i]);
  67. }
  68. sort(arr2,arr2+n);
  69. sort(all(ha));
  70. ha.erase(unique(all(ha)),ha.end());
  71. LL sums=0;
  72. rep(i,0,n){
  73. int id=lower_bound(all(ha),arr[i])-ha.begin()+1;
  74. ls[i]=sum(id-1); lg[i]=sum(n)-sum(id);
  75. int p1=lower_bound(arr2,arr2+n,arr[i])-arr2;
  76. int p2=upper_bound(arr2,arr2+n,arr[i])-arr2;
  77. rs[i]=p1-ls[i]; rg[i]=n-p2-lg[i];
  78. sums+=rs[i];
  79. add(id,1);
  80. }
  81. LL ans=0;
  82. rep(i,0,n){
  83. ans+=rg[i]*(sums-rs[i]-lg[i]);
  84. }
  85. rep(i,0,n){
  86. ans-=ls[i]*(rs[i]+lg[i]);
  87. }
  88. printf("%lld\n",ans);
  89. }
  90. return 0;
  91. }
  92. //end-----------------------------------------------------------------------

HDU 5792 World is Exploding 树状数组+枚举的更多相关文章

  1. hdu 5792 World is Exploding 树状数组

    World is Exploding 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...

  2. hdu 5792 World is Exploding 树状数组+离散化+容斥

    World is Exploding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  4. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  6. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  7. HDU 5862 Counting Intersections (树状数组)

    Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...

  8. hdu 5592 ZYB's Game 树状数组

    ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...

  9. HDU 1394 Minimum Inversion Number (树状数组求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

随机推荐

  1. 软件工程 speedsnail 冲刺6

    2015-5-10 完成任务:学习了黑马android教学视频13.14.15集,记分功能: 遇到问题: 问题1 android native method not found 解决1 没有解决 明日 ...

  2. 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的

    异常原因: 1.写了一个死循环,这个可能性最大. 2.进行大数据量的运算,导致假死状况. 解决办法:Debug -> Exceptions -> Managed Debug Assista ...

  3. asp.net跨页面传值

    a.aspx.cs //获取a中的id HttpCookie objCookie = new HttpCookie("myCookie", id); Response.Cookie ...

  4. .net IL 指令速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  5. mysql存储引擎(mysql学习六)

    存储引擎 现在只有InnoDB支持外键 上接着学习笔记五 class表中有外键,所以不能修改存储引擎 表类型   默认的服务器表类型,通过my.ini可以配置    Default-storage-e ...

  6. Storm入门学习随记

    推荐慕课网视频:http://www.imooc.com/video/10055 ====Storm的起源. Storm是开源的.分布式.流式计算系统 什么是分布式呢?就是将一个任务拆解给多个计算机去 ...

  7. javascript中方法调用与方括号[]

    看jquery时遇到一行: $(this)["removeClass"]("selected"); 这一行等同于下面的一行: $(this).removeCla ...

  8. Html5 Canvas一个简单的画笔例子

    相比了下Qt quick的canvas和HTML5的canvas,发现HTML5 Canvas在同样绘制绘制操作下性能比Qt的canvas强很多,附上一个HTML5 canvas画笔一例子 var D ...

  9. JavaWeb之 JSP基础

    什么是JSP JSP的全称是java server page, java服务页面.是提供java服务的页面~ 那么和Servlet有什么区别呢?JSP的页面既可以写java代码~也可以写html代码哦 ...

  10. 包装类(Wrapper Class)

    1)包装类.针对于原生数据类型的包装.所有的包装类(8个)对位于java.lang包下.java中的8个包装类分别是:Byte,Short,Integer,Long,Float.Double,Char ...