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,它们的公 ...
随机推荐
- NOI题库
07:机器翻译 总时间限制: 1000ms 内存限制: 65536kB 描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个 ...
- 以一个权限系统来告别WebForm —(一)项目整休架构设计与数据库设计
在本节我想与大家与分享一下,我所将要做的权限系统的架构和数据库的表的设计.请各位大神们对我项目中设计的不足之处进行指导,让我得以更好的写完它,留给需要它的人. 我的项目架构如下图所示: 如上图所示,在 ...
- javascript的字符串模板
在其他语言存在字符串内插(string interpolation)或者叫变量内插(Variable interpolation).ES6中的称为template string. 模板字符串使用反引号 ...
- php网站验证码的生成
<?php header("Content-type:text/html;charset=utf-8"); header("Content-type:image/p ...
- Mac 鼠须管 合并词库 简单使用
之前一直没用过合成词库这功能,有个同步用户数据的选项,点它后,生成一个文件夹,里面就有当前的一些配置,词库之类的 /Users/dfpo/Library/Rime/sync 这样我们就得到了一个装着用 ...
- Shell脚本获得变量值作为新变量一部分的值
最近使用shell写一个发布脚本时,由于shell编程是边学便用的缘故,经验不足,中间遇到一个问题,一个变量的值作为一个新变量的一部分,而我要根据变量获得新变量的值,以前没有遇到过.网络搜索一番,最后 ...
- C#中的volatile用法
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进 ...
- linux命令别名的使用
语 法:alias[别名]=[指令名称] 1,查看该用户下的别名: alias 2,有的系统里没有ll这个命令,原因就是没有定义ll='ls -l --color=tty'这个别名 如果想永久生效,就 ...
- matlab 之cov 协方差
COV 1.cov(x) 如果x为向量,返回x的方差 计算方法为: S为方差. 2.cov(X) 如果X为矩阵,把矩阵X的行作为观察值,把列作为变量,返回X的协方差矩阵: diag(cov(X))是每 ...
- 第三方平台正式支持接入微信公众平台JS-SDK
之前微信公众平台面向开发者开放微信内网页开发工具包,现在第三方平台也能正式支持接入微信公众平台JS-SDK了,第三方平台可以在获得公众号的授权后,通过JS-SDK帮助公众号开发和实现网页业务. 公众号 ...