题意:给一个数列,求四个各不相同的数,一个逆序对,一个正序对,求多少组这样的四个数。

题解:辣鸡如我,还是上官方题解了。

rg(i)就是i右边比i大的数的个数,rs(i)就是i右边比i小的数的个数。

lg(i)就是i左边比i大的数的个数,ls(i)就是i左边比i小的数的个数。

allg就是所有逆序对的个数,∑rs(i)或者∑lg(i)都可以。

然后答案就是对于每一个数,当它为正序对中较小的那个数时的答案相加。

这样算会有重复,就是那个正序对中较大的数也被算入了逆序对中,所以再减去每个数字作为正序对较大的数时的它所可能的逆序对数量。

注意用会超int 用long long

  1. // 2016多校5-1012/hdu5792
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <queue>
  7. #include <vector>
  8. #include <cmath>
  9. using namespace std;
  10. #define PF(x) cout << "debug:" << x << " ";
  11.  
  12. const int N = ;
  13. typedef long long ll;
  14. int a[N], b[N];
  15. int lg[N], ls[N], rg[N], rs[N];
  16.  
  17. int bit[N];
  18.  
  19. int lowbit(int x) { return x&-x; }
  20.  
  21. void add(int p, int v, int n)
  22. {
  23. while (p <= n) {
  24. bit[p] += v;
  25. p += lowbit(p);
  26. }
  27. }
  28.  
  29. ll sum(int p)
  30. {
  31. ll ans = ;
  32. while (p > ) {
  33. ans += bit[p];
  34. p -= lowbit(p);
  35. }
  36. return ans;
  37. }
  38.  
  39. int main(int argc, char const *argv[])
  40. {
  41. freopen("in", "r", stdin);
  42. int n;
  43. while (~scanf("%d", &n)) {
  44. for (int i = ; i <= n; ++i) {
  45. scanf("%d", a+i);
  46. b[i] = a[i];
  47. }
  48. //离散话
  49. sort(a+, a+n+);
  50. int tot = unique(a+, a+n+) - a;
  51. for (int i = ; i <= n; ++i) {
  52. b[i] = lower_bound(a, a+tot, b[i]) - a;
  53. }
  54. //for (int i = 1; i <= n; ++i) printf("%d\n", b[i]);
  55. //求lg ls
  56. memset(bit, , sizeof bit);
  57. for (int i = ; i <= n; ++i) {
  58. ls[i] = sum(b[i]-);
  59. lg[i] = i - - sum(b[i]);
  60. add(b[i], , n);
  61. }
  62. //求rg rs
  63. memset(bit, , sizeof bit);
  64. for (int i = n; i > ; --i) {
  65. rs[i] = sum(b[i]-);
  66. rg[i] = n - i - sum(b[i]);
  67. add(b[i], , n);
  68. }
  69. // cout << "ls "; for (int i = 1; i <= n; ++i) printf("%d ", ls[i]); printf("\n");
  70. // cout << "lg "; for (int i = 1; i <= n; ++i) printf("%d ", lg[i]); printf("\n");
  71. // cout << "rs "; for (int i = 1; i <= n; ++i) printf("%d ", rs[i]); printf("\n");
  72. // cout << "rg "; for (int i = 1; i <= n; ++i) printf("%d ", rg[i]); printf("\n");
  73. //求allg
  74. ll allg = ;
  75. for (int i = ; i <= n; ++i) allg += lg[i];
  76. //PF(allg);
  77. ll ans = ;
  78. for (int i = ; i <= n; ++i) {
  79. ans += (ll)rg[i] * (allg - lg[i] - rs[i]);
  80. }
  81. for (int i = ; i <= n; ++i) {
  82. ans -= (ll)ls[i] * (lg[i] + rs[i]);
  83. }
  84. cout << ans << endl;
  85. }
  86. return ;
  87. }

hdu5792--World is Exploding的更多相关文章

  1. hdu-5792 World is Exploding(容斥+树状数组)

    题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Jav ...

  2. HDU5792 World is Exploding(树状数组)

    一共6种情况,a < b且Aa < Ab, c < d 且Ac > Ad,这两种情况数量相乘,再减去a = c, a = d, b = c, b = d这四种情况,使用树状数组 ...

  3. HDU-5792 World is Exploding(树状数组)

    题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d:条件2:<a,b>组成一个顺序对,<c,d> ...

  4. hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...

  5. World is Exploding(hdu5792)

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

  6. HDU 5792---2016暑假多校联合---World is Exploding

    2016暑假多校联合---World is Exploding Problem Description Given a sequence A with length n,count how many ...

  7. 2016 Multi-University Training Contest 5 World is Exploding

    转载自:http://blog.csdn.net/queuelovestack/article/details/52096337 [题意]给你一个序列A,选出四个下标不同的元素,下标记为a,b,c,d ...

  8. HDU 5792 World is Exploding 树状数组+枚举

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ...

  9. 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]< ...

  10. HDU 5792 World is Exploding (树状数组)

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

随机推荐

  1. Emoji表情符号兼容方案(适用ios,android,wp等平台)

    http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案 一 什么是Emoji emoji就是表情符号:词义来自日语(え ...

  2. php简单文件上传类

    <?php header("Content-Type:text/html; charset=utf-8"); if($_POST['submit']){ $upfiles = ...

  3. laravel5的坑

    以此记录学习laravel的一些问题 问题:laravel转移文件夹到另外一pc或者环境后访问出现500 设置权限为777 问题: 设置路由后页面总是404 not found 解决:需要在apach ...

  4. 关于C的一些理解

    关于字符数组和字符指针 关于相互赋值问题一只有疑问,其实是自己搞不清指针和地址的关系.地址可以指向一块内存但是不一定存在于内存,比如字符数组名,数组名是地址,但是不实际存在于内存中,无法修改,而字符指 ...

  5. 一步一步制作yaffs/yaffs2根文件系统(四)---构建etc、dev等剩余目录

    开发环境:Ubuntu 12.04 开发板:mini2440  256M NandFlash   64M SDRAM 交叉编译器:arm-linux-gcc 4.4.3点此可下载 BusyBox版本: ...

  6. JavaScript DOM高级程序设计 3.-DOM2和HTML2--我要坚持到底!

    由一个HTML进行说明,我就不敲了,直接copy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...

  7. 解锁windowsphone设备遇到的错误:检查Miscrosoft账户凭据、请重新注册 0x80004005 解决方案

    本篇文章主要讲在解锁windowsphone设备时遇到的错误 Error1:登录windowsphone开发人员中心时出错,请检查您的miscrosoft账户凭据 Error2:注册您的手机时出现未知 ...

  8. net remoting 服务器端订阅客户端(附源代码)

    remoting 在分布式应用中逐渐在企业级应用发展开来,最初提出分布式应用,主要目的是为了降低服务器的压力,将耗性能的处理放在另外一个程序中,然后将计算结果发送到另外一个应用中.而remoting就 ...

  9. 原创js模型驱动

    使用ajax方式请求数据,向页面展示一个对象的时候,往往让人头疼的是一大堆 .val()  .text()方法,这样做固然不会出错,但是效率太低 以下提供一个自己编写的Jquery模型驱动插件,正在测 ...

  10. SpringContextHolder 静态持有SpringContext的引用(如何取得Spring管理的bean )

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...