HDU 6003 Problem Buyer
贪心题(好久不做了)
考虑最一般的,判断合法性?
经典贪心问题:左端点升序,左端点相同,右端点降序,c[i]升序
优先队列,每次选择覆盖x的右端点最小的区间。
称此方法为“区间匹配贪心”
最小的k使得任意选k个都能存在“完美匹配”?(虽然这里不用Hall定理)
对于覆盖了ci的区间设有ti个,那么ans至少是n-ti+1
一个naive的想法是,ans就是max(n-ti+1)??
但是可能不止这样,因为存在共用区间的问题
所以边找ti,边进行之前的贪心匹配。
这样,到了i,用n-q.size()+1进行更新ans,然后q.pop(),表示用右端点最小的区间匹配上c[i]
当queue是空的,显然impossible
考虑有解情况,合法性:
证明两点:
1.这样的ans是下界。首先“区间匹配贪心”这样分配是最优的。枚举x相当于最后满足的是哪个,剩下的都选择上。即使有一个可能覆盖了c[i],但是钦定匹配给了别人,
由于“区间匹配贪心”正确,所以换到c[i]一定不优。这一定是下界。
2.只要证明存在合法的分配方式,就可以证明ans也是上界。对于一个c[i],虽然可能给了一个ti的区间可能被钦定给了c[i+j]的,但是这样会在c[i+j]的位置统计到。
由于是取max,所以一定会考虑到!!
否则显然存在构造方法。
所以ans也是下界。
证毕。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
const int N=1e5+;
int n,m;
int ans;
int c[N];
priority_queue<int,vector<int>,greater<int> >q;
struct seg{
int l,r;
bool friend operator <(seg a,seg b){
if(a.l==b.l) return a.r>b.r;
return a.l<b.l;
}
}s[N];
void clear(){
while(!q.empty()) q.pop();
}
int main(){
int t;rd(t);
for(reg o=;o<=t;++o){
clear();
rd(n);rd(m);
for(reg i=;i<=n;++i){
rd(s[i].l);rd(s[i].r);
}
sort(s+,s+n+);
for(reg i=;i<=m;++i){
rd(c[i]);
}
sort(c+,c+m+);
int ptr=;
int ans=;
for(reg i=;i<=m;++i){
while(ptr<n&&s[ptr+].l<=c[i]){
if(s[ptr+].r>=c[i]) q.push(s[ptr+].r);
++ptr;
}
while(!q.empty()&&q.top()<c[i]) q.pop();
if(q.empty()) {
ans=-;break;
}
ans=max(ans,n-(int)q.size()+);
q.pop();
}
if(ans>=) printf("Case #%d: %d\n",o,ans);
else printf("Case #%d: IMPOSSIBLE!\n",o);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
鸽巢原理,但是可能不存在合法方案,就现场匹配。
为了保证最优性,利用“区间匹配贪心”
HDU 6003 Problem Buyer的更多相关文章
- HDU 6003 Problem Buyer【小根堆】
任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就 ...
- hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。
/** 题目:hdu6003 Problem Buyer 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6003 题意:给定n个区间,以及m个数,求从n个区 ...
- HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)
6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
- HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)
6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...
- HDU 5687 Problem C(Trie+坑)
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
随机推荐
- 暴力剪枝——cf1181C
暴力求长度为len时,以i,j为左上角的旗子的数量 不剪枝的话复杂度是n*n*m*n,必定超时 两个可以剪枝的地方:如果格子[i,j]可以作为长度为len的旗子的左上角,那么其必定不可以作为长度> ...
- svg实现渐变进度圆环
效果图 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="ut ...
- iOS ARC下命名规则
当我在ARC模式下写以下代码的时候,编译器报错 Semantic Issue: Property's synthesized getter follows Cocoa naming conventio ...
- Android Matrix理论与应用详解
转:http://zensheno.blog.51cto.com/2712776/513652 Matrix学习——基础知识 以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GD ...
- Spring基础面试题(一)
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方式有 ...
- idea存在包但是运行项目一直报java.lang.NoClassDefFoundError的问题
以前做spark时候遇到过,今天高flink又遇到查了半天,这里记录下 1..idea->file->project structure->libraries->(左侧对话框这 ...
- 编写main方法
- 代码风格JavaScript standard style与Airbnb style
代码风格JavaScript standard style与Airbnb style
- ie中onclick问题
代码:<button > <span onclick="xxx();">确定</span></button> 在chrome和fir ...
- 【SDOI2015】约数个数和
题面 求\(\sum_{i=1}^n\sum_{j=1}^md(ij)\) \(\leq 50000\)组数据,\(1\leq n,m\leq 50000\). 题目分析 首先,你需要知道一个结论: ...