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,它们的公 ...
随机推荐
- BZOJ1083 繁忙的都市
Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口 ...
- Bzoj3893 [Usaco2014 Dec]Cow Jog
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 302 Solved: 157 Description The cows are out exerci ...
- CSU 1115 最短的名字
传送门 Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description 在一个奇怪的 ...
- Eclipse学习总结(02)-动态项目部署到到本地Tomcat
一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...
- 使用Tengine替代Nginx作为负载均衡服务器
Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...
- 命令行编译vs2013项目
echo off path %SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\ msbuild.exe .\src\ElectricManagement. ...
- zabbix 汉化
zabbix2.x的版本自带汉化,3.x的版本也可以通过修改配置文件强制使用自带的汉化,但是不管哪种,翻译的精准度令人费解:偶然发现一个专门翻译zabbix的网站https://www.zabbix. ...
- DedeCMS全版本通杀SQL注入漏洞利用代码
EXP: Exp:plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\' or mid=@`\'` /*!50000u ...
- Solr之搭建Solr5.2.1服务并从Mysql上导入数据
原文地址:http://www.bkjia.com/webzh/1026243.html
- linux 的终端字体色和背景色的修改方法(二)
Linux终端下的颜色设置 2013-08-31 22:57:15 分类: LINUX 在 ANSI 兼容终端(例如 xterm.rxvt.konsole 等)里, 可以用彩色显示文本而不仅仅是 ...