题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数。

解法:n * Cnt[n] <= 1000*100 = 100000, 即最多10^5个人,所以枚举每个值x,求他的后面那些组中有多少数大于 k-x即可, 求有多少数大于k-x可以先求有多少数小于等于k-x,然后总数减一下即可。 可以用树状数组求。

先把所有数离散地存入一个树状数组中,然后每次枚举完一组的数后,将这组的数去掉。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #define lll __int64
  8. using namespace std;
  9. #define N 101107
  10.  
  11. int c[N],num[][],b[*N],T[];
  12.  
  13. int lowbit(int x) { return x&-x; }
  14. void modify(int x,int val)
  15. {
  16. while(x <= N-)
  17. {
  18. c[x] += val;
  19. x += lowbit(x);
  20. }
  21. }
  22.  
  23. int getsum(int x)
  24. {
  25. int res = ;
  26. while(x > )
  27. {
  28. res += c[x];
  29. x -= lowbit(x);
  30. }
  31. return res;
  32. }
  33.  
  34. int main()
  35. {
  36. int t,n,k,m,i,j;
  37. cin>>t;
  38. while(t--)
  39. {
  40. scanf("%d%d",&n,&k);
  41. int cnt = ;
  42. for(i=;i<=n;i++)
  43. {
  44. scanf("%d",&num[i][]);
  45. for(j=;j<=num[i][];j++)
  46. scanf("%d",&num[i][j]), b[++cnt] = num[i][j];
  47. sort(num[i]+,num[i]+num[i][]+);
  48. }
  49. T[n+] = ;
  50. for(i=n;i>=;i--)
  51. T[i] = T[i+] + num[i][];
  52. sort(b+,b+cnt+);
  53. memset(c,,sizeof(c));
  54. for(i=;i<=n;i++)
  55. {
  56. for(j=;j<=num[i][];j++)
  57. {
  58. int id = lower_bound(b+,b+cnt+,num[i][j])-b;
  59. modify(id,);
  60. }
  61. }
  62. lll sum = ;
  63. for(i=;i<=n;i++)
  64. {
  65. for(j=;j<=num[i][];j++)
  66. {
  67. int id = lower_bound(b+,b+cnt+,num[i][j])-b;
  68. modify(id,-);
  69. }
  70. for(j=;j<=num[i][];j++)
  71. {
  72. int now = num[i][j],id;
  73. if(k-now < ) id = ;
  74. else
  75. {
  76. id = lower_bound(b+,b+cnt+,k-now)-b;
  77. if(b[id] != k-now) id--;
  78. }
  79. sum += T[i+]-getsum(id);
  80. }
  81. }
  82. cout<<sum<<endl;
  83. }
  84. return ;
  85. }

HDU 5101 Select --离散化+树状数组的更多相关文章

  1. HDU 5862(离散化+树状数组)

    Problem Counting Intersections 题目大意 给定n条水平或竖直的线段,统计所有线段的交点个数. (n<=100000) 解题分析 首先将线段离散化. 然后将所有线段按 ...

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

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

  3. hdu 3015 Disharmony Trees (离散化+树状数组)

    Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)

    6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...

  5. CodeForces 540E - Infinite Inversions(离散化+树状数组)

    花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...

  6. Ultra-QuickSort(归并排序+离散化树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 50517   Accepted: 18534 ...

  7. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  8. poj-----Ultra-QuickSort(离散化+树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 38258   Accepted: 13784 ...

  9. Code Forces 652D Nested Segments(离散化+树状数组)

     Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

随机推荐

  1. rabbitmq学习笔记1 安装和配置

    环境 OS: CentOS Linux release 7.1.1503 (Core) kernel:3.10.0-229.el7.x86_64   安装 参考:http://www.rabbitmq ...

  2. domain规划

    user-generated content 用户产生内容 和 admin-generated content 管理员产生内容,要区分开来,便于不同的图片压缩.备份.带宽.CDN.审核方案. 图片(j ...

  3. jquery 监控文本框键盘事件(回车事件),附常用keycode值。

    $(function(){ $(".search").keydown(function(event) { ) { //执行操作 } }) ); 完整的 key press 过程分为 ...

  4. 使用WCF对外提供接口

    本篇将通过WCF以webservices的方式对外提供接口.同时使用NUnit对webservices中的方法进行单元测试. 开发契约 contract Contract项目为类库项目,该项目下会包含 ...

  5. javascript-this,call,apply,bind简述1

    最近在系统的学习面向对象方面的知识,遇到的最大拦路虎就数this的指向,call,apply,bind函数的使用,单独抽出一天时间把这几个烦人的家伙搞定,去学习更深入的内容. 首先介绍一下this的一 ...

  6. AngularJS(一)

      <!doctype html> <html ng-app=""> <!-- ng-app指令标记了AngularJS脚本的作用域 --> & ...

  7. Windows 下Apace tomcat

    java JDK安装: 1. 官方www.oracle.com 下载jdk 2. 环境变量配置 (1)新建->变量名:JAVA_HOME变量值:C:\Program Files (x86)\Ja ...

  8. nutch简介

    1.什么是 nutch Nutch 是一个开源的. Java 实现的搜索引擎.它提供了我们运行自己的搜 索引擎所需的全部工具.2.研究 nutch 的原因(1) 透明度: nutch 是开放源代码的, ...

  9. 学习Android,最简单的按钮提示文本信息

    最近都在看Android系统架构跟四大组件,刚开始自己看书看网络资料,简直就是一脸懵,今天在这里对初学者,或者自学的同学,可以跟着我来学习,Android 编码一个按钮出发事件的小案例: 当然,在此之 ...

  10. 推导大O阶方法

    用大写O()来体现算法时间复杂度的记法,我们称之为大O阶记法. O(1)叫做常数阶:O(n)叫做线性阶:O(n^2)叫做平方阶.  1.用常数1取代运行时间中的所有加法常数. 2.在修改后的运行次数函 ...