Codeforces 597B Restaurant(离散化 + 贪心)
题目链接 Restaurant
题目意思就是在$n$个区间内选出尽可能多的区间,使得这些区间互不相交。
我们先对这$n$个区间去重。
假如有两个区间$[l1, r1],[l2, r2]$
若满足$l1 >= l2$且 $r1 <= r2$,那么$[l2, r2]$就是可以被去掉的。
因为这两个区间里我们显然最多只能选择一个。
如果我们在答案里选择了$[l2, r2]$,那么我们如果把$[l2, r2]$换成$[l1, r1]$的话
这个答案肯定还是满足题意的。
甚至可能腾出了可以放下其他区间的空间。
那么我们去重之后进行离散化,接下来就是贪心的过程。
我们把这些处理好的区间以左端点为关键字升序排序。
排好序的区间,右端点肯定也是升序的。
我们预处理出$f[i]$为右端点小于等于$i$的所有区间的编号的最大值。
我们从最后一个区间开始选,
对于当前我们可以选择的范围肯定要选择编号更大的。
因为编号越大说明左端点越大,给其他区间留出的空间越多。
于是我们从最后一个区间开始选,依次贪心,这样就可以了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int inf = 1e9 + 1;
const int N = 1e6 + 10;
const int A = 22; struct node{
int x, y, s, t;
friend bool operator < (const node &a, const node &b){
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
} a[N], c[N]; int b[N << 2], d[N << 2];
int cnt, tot, now;
int n, m, et;
int mx;
int st[N << 1][A];
int ans; bool cmp(const node &a, const node &b){
return a.s == b.s ? a.t > b.t : a.s < b.s;
} int main(){ scanf("%d", &n);
cnt = 0;
rep(i, 1, n){
int x, y;
scanf("%d%d", &a[i].x, &a[i].y);
a[i].s = a[i].y;
a[i].t = a[i].x + inf;
} sort(a + 1, a + n + 1, cmp); cnt = 0;
for (int i = 1, j; i <= n;){
j = i + 1;
while (j <= n && a[j].t <= a[i].t) ++j;
c[++cnt] = a[i];
i = j;
} et = 0;
rep(i, 1, cnt){
b[++et] = c[i].x;
b[++et] = c[i].y;
} rep(i, 1, et) d[i] = b[i];
sort(d + 1, d + et + 1);
tot = unique(d + 1, d + et + 1) - d - 1;
rep(i, 1, et) b[i] = lower_bound(d + 1, d + tot + 1, b[i]) - d;
et = 0;
rep(i, 1, cnt){
c[i].x = b[++et];
c[i].y = b[++et];
} mx = c[cnt].y; rep(i, 1, mx){
if (i < c[1].y) continue;
int l = 1, r = cnt;
while (l + 1 < r){
int mid = (l + r) >> 1;
if (c[mid].y <= i) l = mid;
else r = mid - 1;
} if (c[r].y <= i) st[i][0] = r;
else st[i][0] = l; } now = mx;
ans = 0;
for (; now > 0; ){
int fl = st[now][0];
if (fl == 0) break;
++ans;
now = c[fl].x - 1;
} printf("%d\n", ans);
return 0; }
Codeforces 597B Restaurant(离散化 + 贪心)的更多相关文章
- codeforces 597B Restaurant
题目链接:http://codeforces.com/contest/597/problem/B 题目分类:贪心 题目分析:经典的看节目问题(挑战程序设计page 40) 代码: #include&l ...
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- [Codeforces 1199C]MP3(离散化+二分答案)
[Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...
- Codeforces Round #650 (Div. 3) F1. Flying Sort (Easy Version) (离散化,贪心)
题意:有一组数,每次操作可以将某个数移到头部或者尾部,问最少操作多少次使得这组数非递减. 题解:先离散化将每个数映射为排序后所对应的位置,然后贪心,求最长连续子序列的长度,那么最少的操作次数一定为\( ...
- Codeforces Round #545 (Div. 2) C. Skyscrapers 离散化+贪心
题目链接 给你一个n∗m的矩阵res,让你输出一个n∗m的矩阵a,这个矩阵满足:给你一个n*m的矩阵res,让你输出一个n*m的矩阵a,这个矩阵满足:给你一个n∗m的矩阵res,让你输出一个n∗m的矩 ...
- Codeforces 161 B. Discounts (贪心)
题目链接:http://codeforces.com/contest/161/problem/B 题意: 有n个商品和k辆购物车,给出每个商品的价钱c和类别t(1表示凳子,2表示铅笔),如果一辆购物车 ...
- CodeForces 176A Trading Business 贪心
Trading Business 题目连接: http://codeforces.com/problemset/problem/176/A Description To get money for a ...
- Codeforces Gym 100803C Shopping 贪心
Shopping 题目连接: http://codeforces.com/gym/100803/attachments Description Your friend will enjoy shopp ...
随机推荐
- hive sql 学习笔记
1.coalesce 语法: COALESCE ( expression [ ,...n ] ) 参数: expression 任何类型的表达式. 返回类型: 返回数据类型优先级最高的 express ...
- java做http接口
问题描述 我要对外提供一个http接口给别人调用...但是我不知道用java怎么做这个接口.请大家详细给我讲讲.从开发到如何发布到服务器.谢谢了 解决方案 如果你这个很简单的话,而且数量也很少,建议直 ...
- leetcode-5-basic
解题思路: 设两个变量land和sink,land的值是1的数量,sink表示内部的边.result = land*4-sink*2.按行扫描得到land, 同时得到同一行中内部边的数目:然后按列扫描 ...
- ProC第三弹
一.前言 我们上面已经了解Windows和Linux下的ProC开发环境,这里我们更进一步去简要介绍下ProC的预编译参数. 二.什么是预编译 预编译过程中,Pro*C/C++会自动生成C或者C++的 ...
- poj3617 best cow line(贪心题)
Best Cow Line Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32687 Accepted: 8660 De ...
- SpringDataJpa错误
在运行项目的时候出现的错误如下: would dispatch back to the current handler URL [/save] again. Check your ViewResolv ...
- luogu1242 新汉诺塔
就是一步一步把大的往目标地放. #include <iostream> #include <cstdio> using namespace std; int fro[55], ...
- luogu2865 [USACO06NOV]路障Roadblocks 次短路
注意:如果是这么个写法,堆数组要开成n+m的. 为什么呢?设想一下从1到2有m条长度递减的路,这岂不是要入队m次-- #include <algorithm> #include <i ...
- 和为s的两个数字 【微软面试100题 第十四题】
题目要求: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 例如输入数组{1,2,4,7,11,15}和数字15.由于4+1 ...
- 微信小程序开发 -- 获取当前页面路径
Page.prototype就是this: 你在任何一个Page里面都可以使用route字段和setData()函数: 示例代码: /** * 生命周期函数--监听页面加载 */ onLoad: fu ...