题意:

n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上。

这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配。

关于hall定理及证明,栋爷博客里有:http://blog.csdn.net/werkeytom_ftd/article/details/65658944

可以推出答案为$max\{|x|-Γ(X)\}$,x为左侧点的一个子集,Γ(X)为这些点能到达的右侧点的集合。

证明:

因为二分图有完美匹配的充要条件是对于所有的x都有Γ(X)>=|x|,所以至少要再加$max\{|x|-Γ(X)\}$个点才能让这张图有完美匹配。

考虑向右侧新加$max\{|x|-Γ(X)\}$个点,与左侧所有点都有边,显然对于所有的x都有Γ(X)>=|x|,既这张图有完美匹配。

所以最少加$max\{|x|-Γ(X)\}$个点。

然后就可以枚举Γ(X),用线段树维护|x|。

#include<bits/stdc++.h>
#define N 200005
#define pd push_back
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
using namespace std;
int n,m;
vector<int>s[N];
int t[N<<2],f[N<<2];
void build(int x,int l,int r)
{
if(l==r){t[x]=l;return ;}
int mid=(l+r)>>1;build(ls);build(rs);
t[x]=max(t[x<<1],t[x<<1|1]);
}
void add(int x,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)
{
t[x]++;f[x]++;return ;
}
int mid=(l+r)>>1;
if(ll<=mid)add(ls,ll,rr);
if(rr>mid)add(rs,ll,rr);
t[x]=f[x]+max(t[x<<1],t[x<<1|1]);
}
int qur(int x,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)return t[x];
int mid=(l+r)>>1;
if(ll>mid)return f[x]+qur(rs,ll,rr);
if(rr<=mid)return f[x]+qur(ls,ll,rr);
return f[x]+max(qur(ls,ll,rr),qur(rs,ll,rr));
}
int main()
{
scanf("%d%d",&n,&m);
int ans=0;
for(int i=1;i<=n;i++)
{
int t1,t2;scanf("%d%d",&t1,&t2);s[t1].pd(t2);
}
build(1,0,m+1);
for(int i=0;i<=m;i++)
{
for(auto j:s[i])add(1,0,m+1,0,j);
ans=max(ans,qur(1,0,m+1,i+1,m+1)-i-m-1);
}
printf("%d\n",max(n-m,ans));
return 0;
}

  

AtCoder Regular Contest 076 F - Exhausted?的更多相关文章

  1. 【AtCoder Regular Contest 076 F】Exhausted (贪心)

    Description 机房里有M台电脑排成一排,第i台电脑的坐标是正整数i. 现在有N个OIer进入了机房,每个OIer需要一台电脑来学tui习ji,同时每个OIer对自己电脑所处的坐标范围有一个要 ...

  2. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  3. AtCoder Regular Contest 076

    在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...

  4. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  5. AtCoder Regular Contest 076 E - Connected?

    题目传送门:https://arc076.contest.atcoder.jp/tasks/arc076_c 题目大意: 给定一个\(R×C\)的矩阵,然后给定\(N\)对点,每对点坐标为\((X_{ ...

  6. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  7. AtCoder Regular Contest 066 F Contest with Drinks Hard

    题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...

  8. AtCoder Regular Contest 067 F - Yakiniku Restaurants

    题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...

  9. AtCoder Regular Contest 059 F Unhappy Hacking

    Description 题面 Solution 我们发现如果一个位置需要被退掉,那么是 \(0\) 或 \(1\) 都没有关系 于是我们想到把 \(0,1\) 归为一类 问题转化为每一次可以添加和删除 ...

随机推荐

  1. NB-IOT_BC95_B5常用AT指令集

    .AT+<cmd>=? 测试命令,用于向模块询问支持的设置项目. .AT+<cmd>? 读取命令,用于让模块上报某个命令代表的设置项当前的值. .AT+<cmd>= ...

  2. linux-RPM安装

    vh可写可不写

  3. Week7阅读笔记

    关于银弹: Brooks在他最著名的这篇文章里指出,在软件开发过程里是没有万能的终杀性武器的,只有各种方法综合运用,才是解决之道.而各种声称如何如何神奇的理论或方法,都不是能杀死“软件危机”这头人狼的 ...

  4. Python学习笔记 -- 第五章

    模块 使用模块可以提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块: ...

  5. SQL语句及5.7.2 mysql 用户管理

    一.用户的定义 1.1 用户名+主机域 此处为5.7.2版本的mysql当中password字段已改为authentication_string mysql> select user,host, ...

  6. Metrics.NET step by step使用Metrics监控应用程序的性能

    使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或 ...

  7. 8-Python3从入门到实战—基础之数据类型(集合-Sets)

    Python从入门到实战系列--目录 集合的定义 集合(set)和字典类似,也是一组key的集合,但不存储value:由于key不能重复,所以,在set中,没有重复的key. 创建一个set,需要提供 ...

  8. PAT 1081 检查密码

    https://pintia.cn/problem-sets/994805260223102976/problems/994805261217153024 本题要求你帮助某网站的用户注册模块写一个密码 ...

  9. Java 线程内 递归 Bug 一例

    一个线程的run方法里使用递归方法,出了Bug. private boolean ispass(String creationId){ List<Map> maps =creationSe ...

  10. Java之数组遍历

    package basic; //数组遍历方法 public class ForEach { public static void main(String[] args) { // 原始数组 Stri ...