http://codeforces.com/gym/101149/problem/G

一开始还以为要用二分图去做,但是复杂度也太高了,O(n * m)的话直接爆炸。

考虑贪心,考虑第i个东西优先选一个能选的,而且这个东西的值尽量小。

就是如果要<3, 3>的话,我希望找到有序对<x, y>,其中x和y都最接近3, 3

那么这里就涉及到同时排序两个数,就是这两个数的优先级一样,而且二分找的时候也要同时比较两个数了

一开始还想用set的,但是这样重载运算符的set我没用过,重载成 return a < rhs.a && b < rhs.b; 这样会把有些set的元素载入不了,不知道为何,希望有大牛指点一二。

那么可以这样去想,先对x排序,如果x相同再对y排序,全部相同就按照被选的那个优先,就是m那堆数字有先。

这样做有什么好处呢?可以维护一个set,每次如果是m那堆数字的话,就扔去set那里,如果不是,就从set里面找,找的时候只需要比较y就行了,因为x已经保证严格成立了。

最后说一下set那里,自己写一个比较函数的话,就要考虑重复的元素,因为重复的元素会被自动删除的,但是我本来结构体那里就有了个id这个值,id是保证不同的了,id是我用来记录答案的,但是它还是去重了。现在试了发现,如果想id不同,就当成不同的元素的话,就要在你的cmp那里把id加上去比较,

这里坑了我太久了,一直wa9、

给个数据吧

6
2 5
4 3
4 3
4 3
4 3
4 2
6
5 6
4 3
4 3
4 2
4 3
4 3

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 5e5 + ;
struct node {
int a, b, id;
int flag;
node() {}
node(int aa, int bb, int iidd, int Orz_zk) : a(aa), b(bb), id(iidd), flag(Orz_zk) {}
bool operator < (const struct node & rhs) const {
if (a != rhs.a) return a < rhs.a;
else if (b != rhs.b) return b < rhs.b;
else return flag < rhs.flag;
}
}arr[maxn];
struct cmp {
bool operator() (struct node a, struct node b) {
if (a.b != b.b) {
return a.b < b.b;
} else if (a.a != b.a) return a.a < b.a;
else if (a.flag != b.flag) return a.flag < b.flag; //找的时候flag是0,也要处理
else return a.id < b.id; //注意,这个一定要有
}
};
set<struct node, cmp>ss;
int ans[maxn];
void work() {
int n;
cin >> n;
for (int i = ; i <= n; ++i) {
cin >> arr[i].a >> arr[i].b;
arr[i].id = i;
arr[i].flag = ;
}
int m;
cin >> m;
for (int i = ; i <= m; ++i) {
cin >> arr[i + n].a >> arr[i + n].b;
arr[i + n].flag = ;
arr[i + n].id = i;
}
sort(arr + , arr + + n + m);
// for (int i = m + n; i >= 1; --i) {
// cout << arr[i].a << " " << arr[i].b << " " << arr[i].flag << " " << arr[i].id << endl;
// }
// cout << endl;
set<struct node> :: iterator it;
for (int i = m + n; i >= ; --i) {
// for (it = ss.begin(); it != ss.end(); ++it) {
// cout << it->a << " " << it->b << " " << it->id << endl;
// }
// cout << endl;
// cout << arr[i].a << " " << arr[i].b << " " << arr[i].flag << endl;
if (arr[i].flag) {
ss.insert(arr[i]);
continue;
}
if (ss.size() == ) {
cout << - << endl;
return;
}
it = ss.lower_bound(arr[i]);
if (it == ss.end()) {
cout << - << endl;
return;
}
ans[arr[i].id] = it->id;
ss.erase(it);
}
for (int i = ; i <= n; ++i) {
if (ans[i] == ) while();
cout << ans[i] << " ";
}
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
IOS;
work();
return ;
}

G. Of Zorcs and Axes 二分 + 贪心 —— STL的用法的更多相关文章

  1. 贪心+离散化+线段树上二分。。。 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest G. Of Zorcs and Axes

    题目链接:http://codeforces.com/gym/101149/problem/G 题目大意:给你n对数字,为(a[i], b[i]),给你m对数字,为(w[i], c[i]).给n对数字 ...

  2. Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)

    Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...

  3. CF732D Exams 二分 贪心

    思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...

  4. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  5. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  6. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  7. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. $CF949D\ Curfew$ 二分/贪心

    正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...

  9. $bzoj2067\ szn$ 二分+贪心

    正解:二分+贪心 解题报告: 传送门$QwQ$ 题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长. 昂首先最少用多少条线这个还是蛮$e ...

随机推荐

  1. cannot find -lbz2 解决方法

    sudo yum install -y bzip2* 或者sudo apt-get install bzip2* 还是报错就找到libbz2.so.1,建立连接或者复制到 /usr/lib/libbz ...

  2. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

    Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ...

  3. log4j 配置文件详解

    [1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...

  4. 封装class类为jar包提供给其他项目使用

    一.完成class类的编写与测试工作 二.完善javadoc注释,生成自己的API 注释要按照标准要求进行 Project -- generate  javadoc

  5. 51nod-1119 1119 机器人走方格 V2(组合数学+乘法逆元+快速幂)

    题目链接: 1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很 ...

  6. 【CQ18高一暑假前挑战赛3】标程

    [A:LCM] #include<bits/stdc++.h> using namespace std; #define ll long long int main() { ll a,b, ...

  7. 关于yolo 模型中1X1卷积层的作用

    1X1卷积层的作用: 1.实现跨通道的交互和信息整合.2.进行卷积核通道数的降维和升维.3.就是可以在保持feature map 尺寸不变(即不损失分辨率)的前提下大幅增加非线性特性,把网络做得很de ...

  8. 关于try catch finally的执行顺序解释

    偶然遇到了被问到finally的执行问题,忽然发现一直用的都是try catch 没有用过finally的情况,所以目前总结一下. 先抛出结论: 1.try内部正常执行try的内部逻辑,异常则执行ca ...

  9. AngularJS系统学习之Factory,Service, Provider(工厂,服务,供应者)

    本文转自:http://blog.csdn.net/zcl_love_wx/article/details/51404390 我看过敲过代码之后, 有了很深的理解, 这三个东西其实都是用来返回对象的. ...

  10. 2.4 hive创建表实例讲解

    一.create table ## 员工表 create table IF NOT EXISTS default.emp( empno int, ename string, job string, m ...