[hdu5101]计数问题
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]计数问题的更多相关文章
- 一些gcd计数问题
数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...
- 扩展Python模块系列(四)----引用计数问题的处理
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...
- 置换群、Burnside引理与等价类计数问题
置换群.Burnside引理与等价类计数问题 标签: 置换群 Burnside引理 置换 说说我对置换的理解,其实就是把一个排列变成另外一个排列.简单来说就是一一映射.而置换群就是置换的集合. 比如\ ...
- [HEOI2013]SAO ——计数问题
题目大意: Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- cojs 二分图计数问题1-3 题解报告
OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...
- LOJ #6089. 小 Y 的背包计数问题
LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...
- 【LOJ6089】小Y的背包计数问题(动态规划)
[LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...
- Project Euler 453 Lattice Quadrilaterals 困难的计数问题
这是一道很综合的计数问题,对于思维的全面性,解法的过渡性,代码能力,细节处理,计数问题中的各种算法,像gcd.容斥.类欧几里德算法都有考察.在省选模拟赛中做到了这题,然而数据范围是n,m小于等于100 ...
- Codeforces 1109D (树的计数问题)
思路看这篇博客就行了:https://www.cnblogs.com/zhouzhendong/p/CF1109D.html, 讲的很好 今天学到了prufer编码,这是解决树上计数问题的一大利器,博 ...
随机推荐
- PHP函数:fwrite
fwrite() - 写入文件(可安全用于二进制文件) 说明: fwrite ( resource $handle , string $string [, int $length ] ) : int ...
- Mybatis Generator通用Join的实现
通常,我们使用Mybatis实现join表关联的时候,一般都是通过在xml或注解里写自定义sql实现. 本文通过Mybatis Generator的插件功能新增一个JoinPlugin插件,只要在配置 ...
- python爬取优美图库海量图片,附加代码,一键爬取
优美高清图片为大家提供高清美女套图赏析,非高清不录入,大家的网速要给力. 今天教大家爬取优美图库网站中高质量的图片!! 简单易上手哦~ 使用工具: Python 3.6 pycharm 相关环境: r ...
- SMTP发邮件(直接可用)实例
string file = "邮件测试.txt";//放在Debug下的一个txt文件. MailAddress from = new MailAddress("自己的邮 ...
- Python flask 构建可扩展的restful ap
Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持. Flask-RESTful通过最少的设置鼓励最佳的实践. pip install flask-restfulFl ...
- 百度云BCH配置说明
百度云虚拟空间(BCH) 来源:https://www.cnblogs.com/llll/p/7930029.html 参考资料:https://cloud.baidu.com/doc/BCH/Ge ...
- 微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- DZ的CURD
Discuz二次开发-MySQL插入数据(insert) DB::insert($tableName,$data,$flag); $tableName:表名 $data:插入数据,以字段为键值的关联数 ...
- openssl查看证书细节 [转载]
openssl x509部分命令 打印出证书的内容: openssl x509 -in cert.pem -noout -text 打印出证书的系列号 openssl x509 -in cert.pe ...
- Python3的日期和时间
2019独角兽企业重金招聘Python工程师标准>>> python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一 ...