BestCoder17 1002.Select(hdu 5101) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101
题目意思:给出 n 个 classes 和 Dudu 的 IQ(为k),每个classes 都有相应的人,每个人又有相应的IQ。现在要求从这些classes挑选两个人,满足IQ之和 > k,不过要满足这两个人不能来自同一个class的。
解题思路不难想出,直接所有人两两之和 > k - 同一个class 两两之和 > k 就是答案了。
不过很容易超时!!!!
用二分就可以过了。二分有两个STL函数:lower_bound 和 upper_bound。这里用到lower_bound,它一般是跟vector一起用的。看了好久终于看懂了= =,十分强大~~~呀!如果大家对这两个函数比较熟悉,可以直接略过以下注释内容(只结合自己的理解说一下lower_bound,可能有误导他人成分,希望大家多多包涵)。共同的一点就是都需要对操作数组进行排序。
/********************************************************
假设有vector<int> q,第三个参数假设用key来表示。
lower_bound(q.begin(), q.end(), key) 这个东西并不是返回一个int数值,而是vector<int>::iterator vit,假设vit = lower_bound(q.begin(), q.end(), key)(这样为了方便解说)。但是如果 vit - q.begin(),返回的是 >= key 且从左到右开始数起的第一个元素下标(int 数值),其实就是插入key的位置,如果这个数组中有和key相等的数,就插入跳过所有和key相同的数的下一位置(结合下面例子中的key = 10来看)。如果 q.end() - vit 返回的是 >= key 且从右数起的第一个元素的下标(i),但满足下标i-1 这个数是 < key的。至于 *vit 就是具体指向的数值啦,不是下标!
例如有 4,10,10,30,69,70,96,100(第一个元素下标从0开始)
vit - q.begin() q.end() - vit
key = 9, 1 7
key = 10 3(不是1,注意) 5
*****************************************/
接着结合思路来讲,先给出一组数据:
1
3 3
3 5 2 7
2 1 9
3 4 2 6
我们声明一个vector<int> p[maxn],p[0] 压入所有人的IQ ,p[i]压入对应第 i 个班里所有人的IQ,然后对p[0]~p[n] 从小到大排序(有n个class,但还有一个包含所有class的p[0])。
处理完之后 p[0]: 1 2 2 4 5 6 7 9
p[1]: 2 5 7
p[2]: 1 9
p[3]: 2 4 6
然后遍历每个class的人,假如从p[1] 的 2(用v来表示) 开刀。
LL num1 = p[0].end() - lower_bound(p[0].begin(), p[0].end(), k-v+1);
表示 >= k-v+1 从右开始数 >= (3-2+1) 的数的下标,但前一个数必须要 < 2,那么就是p[0]中数组下标为1,表示 2 这个数,跟 2,4,5,6,7,9 这些数相加可以 > k。p[1]同理。之后要相减保存到ans中。但ans 最终要除以2才是答案(这个...我也纠结了好久)
举个例子就明白了。
例如处理到6,那么 k-v+1变成负数了,返回的是数组下标 0,就是表示 6 跟其他所有数两两相加都满足 > k,有1+6,2+6,....6+7,6+9;处理到7的时候,也是返回数组下标0,于是有1+7, 2+7,...,6+7, 7+9。 6+7被选了两次!!!!所以要除以2!
最后一点就是记得将vector清空啦~~~~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; #define pb push_back
typedef __int64 LL;
const int maxn = + ;
vector<int> p[maxn]; int main()
{
int T, n, k, m, input;
while (scanf("%d", &T) != EOF)
{
while (T--)
{
p[].clear();
scanf("%d%d", &n, &k);
for (int i = ; i <= n; i++)
{
scanf("%d", &m);
p[i].clear();
for (int j = ; j < m; j++)
{
scanf("%d", &input);
p[i].pb(input);
p[].pb(input);
}
sort(p[i].begin(), p[i].end());
}
sort(p[].begin(), p[].end()); LL ans = ;
for (int i = ; i <= n; i++)
{
for (int j = ; j < p[i].size(); j++)
{
int v = p[i][j];
LL num1 = p[].end() - lower_bound(p[].begin(), p[].end(), k-v+);
LL num2 = p[i].end() - lower_bound(p[i].begin(), p[i].end(), k-v+);
ans += num1 - num2;
}
}
printf("%I64d\n", ans >> );
}
}
return ;
}
BestCoder17 1002.Select(hdu 5101) 解题报告的更多相关文章
- BestCoder20 1002.lines (hdu 5124) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5124 题目意思:给出 n 条线段,每条线段用两个整数描述,对于第 i 条线段:xi,yi 表示该条线段 ...
- BestCoder17 1001.Chessboard(hdu 5100) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目意思:有一个 n * n 的棋盘,需要用 k * 1 的瓷砖去覆盖,问最大覆盖面积是多少. ...
- BestCoder15 1002.Instruction(hdu 5083) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5083 题目意思:如果给出 instruction 就需要输出对应的 16-bit binary cod ...
- BestCoder18 1002.Math Problem(hdu 5105) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...
- BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=530 (格式有一点点问题,直接粘 ...
- BestCoder22 1002.NPY and arithmetic progression(hdu 5143) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5143 题目意思:给出 1, 2, 3, 4 的数量,分别为a1, a2, a3, a4,问是否在每个数 ...
- BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 题目意思:找出第二个最长递增子序列,输出长度.就是说,假如序列为 1 1 2,第二长递增子序列是 ...
- BestCoder12 1002.Help him(hdu 5059) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目意思:就是输入一行不多于 100 的字符串(除了'\n' 和 '\r' 的任意字符),问是否 ...
- BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 题目意思:给出 X 和 Y,求出 第 K 个 X 和 Y 的最大公约数. 例如8 16,它们的公 ...
随机推荐
- 解决vs2015使用fopen、fprintf等函数报错的问题
出现错误提示: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable ...
- Oracle单组函数
--Upper -------把字符转换成大写 SELECT Upper ('abcde') FROM dual ; --Lower ----- 把字符转换成小写 SELE ...
- BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2269 Solved: 1136 [Submit ...
- 【poj3020】 Antenna Placement
http://poj.org/problem?id=3020 (题目链接) 题意 给出一个矩阵,矩阵中只有‘*’和‘o’两种字符,每个‘*’可以向它上下左右四个方位上同为‘*’的点连一条边,求最少需要 ...
- 以一个权限系统来告别WebForm —开篇
前言: 当今是互联网的时代,我们己经阻止不了它的发展了,只有跟上脚步,才不会被抛弃,松散了这么久,该紧紧了. 背景: 我之所以说以一个权限应用系统来告别我的WebForm内部系统的生涯,是缘于我自 ...
- C++ STL之stack
因为总用vector,却忘记了有stack,今天用到栈顶的值才想起来,说起来stack很方便,也很容易用,看下边例子: #include<stack> #include<iostre ...
- Andriod Dialog 加载框 自定义,公用
怎门样,看图吧,我感觉还不错,很好,在让美工给你陪陪色,就完美了 代码呢放csnd 一份,收1分,百度网盘一份免费.我csdn 没分了,资助我下,谢谢了. http://download.csdn.n ...
- Oracle大数据常见优化查询
[转]http://www.cnblogs.com/myhappylife/p/5006774.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的 ...
- Laravel教程 四:数据库和Eloquent
Laravel教程 四:数据库和Eloquent 此文章为原创文章,未经同意,禁止转载. Eloquent Database 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方 ...
- Jsonp简单认识(后端使用的是asp.net mvc)
一.Jsonp简介:由于浏览器基于安全有同源策略(同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性)机制,所以前端无法使用Ajax来获取来获取其他域名下返回的数据,而Jsonp可 ...