博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CCPC E Problem Buyer
阅读量:5768 次
发布时间:2019-06-18

本文共 1261 字,大约阅读时间需要 4 分钟。

题目描述

有一些区间,还有一些点。

问最小的k使得选出任意k个区间,每个点都可以匹配上区间,一个区间只能匹配一次。

题解

考虑对于每一个点,我们有\(x\)个区间包含它,那么答案的一个下界是\(n-x+1\)

但是这样没有考虑到一个区间被两个点匹配的情况。

那么我们从左到右做,没到一个点,就把右端点最靠左的合法区间删掉,可以证明这也是下界且可以达到。

代码

#include
using namespace std;#define N 100002typedef long long ll;int c[N],n,m;int cnt;inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}struct node{ int l,r; inline bool operator <(const node &b)const{ return r>b.r; }}a[N];priority_queue
q;inline bool cmp(node a,node b){ if(a.l!=b.l)return a.l
b.r; }inline void solve(){ while(!q.empty())q.pop(); n=rd();m=rd(); for(int i=1;i<=n;++i){ a[i].l=rd();a[i].r=rd(); } for(int i=1;i<=m;++i)c[i]=rd(); sort(c+1,c+m+1); sort(a+1,a+n+1,cmp); int p=0; int ans=0; for(int i=1;i<=m;++i){ while(p
<=c[i])p++,q.push(a[p]); while(!q.empty()&&q.top().r
n)printf("Case #%d: IMPOSSIBLE!\n",cnt); else printf("Case #%d: %d\n",cnt,ans);}int main(){ int T=rd(); while(T--)solve(); return 0;}

转载于:https://www.cnblogs.com/ZH-comld/p/11004987.html

你可能感兴趣的文章
Express 结合 Webpack 实现HMRwi
查看>>
基于protobuf的RPC实现
查看>>
HAProxy负载均衡原理及企业级实例部署haproxy集群
查看>>
Win 8创造颠覆性体验:预览版关键更新
查看>>
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
CString、Char* ,char [20]、wchar_t、unsigned short转化
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
excel进行矩阵计算
查看>>
基于Android平台的动态生成控件和动态改变控件位置的方法
查看>>
BOM
查看>>
iOS: Block的循环引用
查看>>