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

题目大意:给n个集合,求从两个不同集合里面各取一个数使得它们的和大于给定数的方案数。

ans=从所有数里面取两个数的方案数-从每个集合里面取两个数的方案数(这是关键)


如果不转换也可以这么做,离散一下,然后树状数组统计也行,具体见代码。

代码一:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <stack>
#include <string>
#include <ctime>
#include <queue>
#define mem0(a) memset(a, 0, sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define eps 0.0000001
#define lowbit(x) ((x) & -(x))
#define memc(a, b) memcpy(a, b, sizeof(b))
#define x_x(a) ((a) * (a))
#define LL long long
#define DB double
#define pi 3.14159265359
#define MD 10000007
#define INF (int)1e9
#define max(a, b) ((a) > (b)? (a) : (b))
using namespace std;
int b[];
LL solve(int a[], int n, int x)
{
LL ans = ;
for(int i = ; i <= n; i++) {
int tmp = upper_bound(a + , a + + n, x - a[i]) - a;
ans += n - tmp + ;
}
return ans;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n, k, T;
cin>> T;
while(T--) {
cin>> n>> k;
LL ans1 = , ans2 = ;
int tot = ;
for(int i = ; i <= n; i++) {
int m, a[];
cin>> m;
for(int j = ; j <= m; j++) {
scanf("%d", &a[j]);
b[++tot] = a[j];
}
sort(a + , a + + m);
ans1 += solve(a, m, k);
}
sort(b + , b + + tot);
ans2 = solve(b, tot, k);
cout<< (ans2 - ans1) / << endl;
}
return ;
}

代码二(树状数组):

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <stack>
#include <string>
#include <ctime>
#include <queue>
#define mem0(a) memset(a, 0, sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define eps 0.0000001
#define lowbit(x) ((x) & -(x))
#define memc(a, b) memcpy(a, b, sizeof(b))
#define x_x(a) ((a) * (a))
#define LL long long
#define DB double
#define pi 3.14159265359
#define MD 10000007
#define INF (int)1e9
#define max(a, b) ((a) > (b)? (a) : (b))
using namespace std;
map<int, int> hash;
int nn, tot, arr[], arr0[], c[], a[][], m[];
void init()
{
sort(arr + , arr + + tot);
arr0[] = arr[];
nn = ;
hash[arr0[]] = ;
for(int i = ; i <= tot; i++) {
if(arr[i] != arr[i - ]) {
arr0[++nn] = arr[i];
hash[arr[i]] = nn;
}
}
}
void update(int p, int x)
{
while(p <= nn) {
c[p] += x;
p += lowbit(p);
}
}
void insert(int a[], int n)
{
for(int i = ; i <= n; i++) {
int tmp = hash[a[i]];
update(tmp, );
}
}
int sum(int p)
{
int ans = ;
while(p) {
ans += c[p];
p -= lowbit(p);
}
return ans;
}
int query(int L, int R)
{
return sum(R) - sum(L - );
}
int find(int x)
{
int l = , r = nn;
while(l < r) {
int m = (l + r) >> ;
if(arr0[m] > x) r = m;
else l = m + ;
}
return l;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T;
cin>> T;
while(T--) {
hash.clear();
mem0(c);
int n, k;
cin>> n>> k;
tot = ;
for(int i = ; i <= n; i++) {
cin>> m[i];
for(int j = ; j <= m[i]; j++) {
scanf("%d", &a[i][j]);
arr[++tot] = a[i][j];
}
}
init();
insert(a[], m[]);
LL ans = ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= m[i]; j++) {
int tmp = find(k - a[i][j]);
ans += query(tmp, nn);
}
insert(a[i], m[i]);
}
cout<< ans<< endl;
}
return ;
}

[hdu5101]计数问题的更多相关文章

  1. 一些gcd计数问题

    数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...

  2. 扩展Python模块系列(四)----引用计数问题的处理

    承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...

  3. 置换群、Burnside引理与等价类计数问题

    置换群.Burnside引理与等价类计数问题 标签: 置换群 Burnside引理 置换 说说我对置换的理解,其实就是把一个排列变成另外一个排列.简单来说就是一一映射.而置换群就是置换的集合. 比如\ ...

  4. [HEOI2013]SAO ——计数问题

    题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  5. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

  6. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  7. 【LOJ6089】小Y的背包计数问题(动态规划)

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  8. Project Euler 453 Lattice Quadrilaterals 困难的计数问题

    这是一道很综合的计数问题,对于思维的全面性,解法的过渡性,代码能力,细节处理,计数问题中的各种算法,像gcd.容斥.类欧几里德算法都有考察.在省选模拟赛中做到了这题,然而数据范围是n,m小于等于100 ...

  9. Codeforces 1109D (树的计数问题)

    思路看这篇博客就行了:https://www.cnblogs.com/zhouzhendong/p/CF1109D.html, 讲的很好 今天学到了prufer编码,这是解决树上计数问题的一大利器,博 ...

随机推荐

  1. vue2.x学习笔记(十一)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12586416.html. 表单的输入绑定 表单的输入绑定是一块很重要的内容,因为所有的业务系统都离不开基础表单的录 ...

  2. React AntDesign 引入css

    React项目是用umi脚手架搭建的AntDesign,用到一个第三方表格组件Jexcel,npm install 之后组件的样式加载不上,犯了愁,翻阅各种资料,踏平两个小坑. 大家都知道,安装完成的 ...

  3. bluecms v1.6 sp1 代码审计学习

    前言 正式开始代码审计的学习,拓宽自己的知识面.代码审计学习的动力也是来自团队里的王叹之师傅,向王叹之师傅学习. 这里参考了一些前辈,师傅的复现经验和bluecms审计的心得 安装 install.p ...

  4. requets中urlencode的问题

    前言 今天团队群里有师傅问requests怎么设置不解码,这里是语误,其实师傅想说的是,如果设置不编码. 一开始我没懂,然后师傅们解答了这个问题后,我想了会儿懂了. 在一些CTF题目中,可能会碰到这样 ...

  5. [YII2] 去除自带头部以及底部右下角debug调试功能

    YII2 去除自带头部以及底部右下角debug调试功能

  6. 【考试总结】欢乐模拟赛_Day2

    \(T1\) 题目描述 在仙界中有着 \(n\) 位神仙, 每位神仙用一个 \(1 ∼ n\) 的特异编号表示, 老祖 \(ChitongZ\) 的编号为 \(1\) . 除去至尊至圣, 统管仙界的老 ...

  7. 解决利用hibernate连接mysql时无法插入汉字的问题

    1.先修改mysql数据库的配置文件my.ini,此文件放在mysql安装文件的根目录下.找到default-character-set属性,并将其值更改为utf8(不是utf-8),将default ...

  8. str_pad 和 filter_var

    这两个函数都是php内置函数,filter_var可直接过滤,比如邮箱,ip等,str_pad可补充字符串eg: 1  =>  001

  9. [Qt] 去掉QMessageBox标题栏上的图标

    msgBox.setWindowFlags(Qt::Drawer);

  10. tcpdump常用抓包命令

    主要语法 过滤主机/IP: tcpdump -i eth1 host 172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据   过滤端口: tcpdump -i ...