传送门

题解:
按照题意,先把所有的人放在左边,所有的桌子。,如果有完备匹配就可以,否则就不可以。

显然直接匈牙利是会超时的。考虑二分图完备匹配的充要条件是满足Hall定理。那么问题转化为:对于任意人的子集XX,连向的桌子个数≥|X|\ge |X|。

先考虑链的情况:
此时的人的子集如果没有包含某个条件的完整的aia_i,那么此可以扩展至包含这个条件的所有aia_i(因为aia_i的连边都相同),而对于任意个数的条件,如果他们连向的区间不相交且不满足HallHall定理,那么这个条件的子集也不满足HallHall定理。假设把这个条件集合分为若干个相交的区间,那么其中一定有一个不满足HallHall定理。

那么问题可以转化为对于任意桌子的区间[Li,Ri][L_i,R_i],所有他们包含的条件的aia_i和小于等于区间长度。

这个随便用个数据结构维护一下即可。

考虑环的情况:
先把链复制一遍,假设现在有不满足的区间,那么分为两种情况:
1.所有aia_i的和大于mm,这个直接特判掉。
2.一部分aia_i的和大于包含他们的区间长度。(显然这个区间不是整个mm,不然不会满足情况1)。
此时这个区间一定是首区间一段(可以为0)+尾区间一段(可以为0)的形式,证明和链的情况类似。此时把这条链倍长后一定可以判定出来。

那么这道题就可以愉快的O(nlogn)O(n\log n)解决了。

#include<bits/stdc++.h>
using namespace std;
inline int rd(){char ch=getchar();int i=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar();}return i*f;
}
const int Maxn=4e5+50;
int T,n,m,lsh[Maxn],cnt,tot,mx[Maxn<<2],tag[Maxn<<2];
struct data{int l,r,c;data(){}data(int l,int r,int c):l(l),r(r),c(c){}
}a[Maxn];
inline bool cmpr(const data &a,const data &b){return a.r<b.r||(a.r==b.r&&a.l<b.l);}
inline void add(int k,int v){mx[k]+=v;tag[k]+=v;}
inline void pd(int k){if(!tag[k])return;add(k<<1,tag[k]),add(k<<1|1,tag[k]);tag[k]=0;
}
inline void upt(int k){mx[k]=max(mx[k<<1],mx[k<<1|1]);}
inline void modify(int k,int l,int r,int L,int R,int v){if(L<=l&&r<=R){add(k,v);return;}pd(k);int mid=(l+r)>>1;if(R<=mid)modify(k<<1,l,mid,L,R,v);else if(L>mid)modify(k<<1|1,mid+1,r,L,R,v);else modify(k<<1,l,mid,L,R,v),modify(k<<1|1,mid+1,r,L,R,v);upt(k);
}
inline int querymx(int k,int l,int r,int L,int R){if(L<=l&&r<=R)return mx[k];pd(k);int mid=(l+r)>>1;if(R<=mid)return querymx(k<<1,l,mid,L,R);else if(L>mid)return querymx(k<<1|1,mid+1,r,L,R);else return max(querymx(k<<1,l,mid,L,R),querymx(k<<1|1,mid+1,r,L,R));
}
inline void solve(){n=rd(),m=rd();long long sum=0;for(int i=1;i<=n;i++)++cnt,a[cnt].l=rd(),a[cnt].r=rd(),a[cnt].c=rd(),sum+=a[cnt].c;if(sum>m){puts("No");return;} for(int i=1;i<=n;i++)if(a[i].l>a[i].r)a[i].r+=m;for(int i=1;i<=n;i++)if(a[i].r<m)a[++cnt]=data(a[i].l+m,a[i].r+m,a[i].c);for(int i=1;i<=cnt;i++)a[i].l++,a[i].r++;for(int i=1;i<=cnt;i++){lsh[++tot]=a[i].l,lsh[++tot]=a[i].r;}sort(lsh+1,lsh+tot+1);tot=unique(lsh+1,lsh+tot+1)-lsh-1;sort(a+1,a+cnt+1,cmpr);int tl=0;for(int i=1;i<=cnt;i++){int r=lower_bound(lsh+1,lsh+tot+1,a[i].r)-lsh,l=lower_bound(lsh+1,lsh+tot+1,a[i].l)-lsh;while(tl<r){++tl;modify(1,1,tot,tl,tl,lsh[tl]-1);}modify(1,1,tot,1,l,a[i].c);if(querymx(1,1,tot,max(1ll,lower_bound(lsh+1,lsh+tot+1,a[i].l-m+1)-lsh),r)>lsh[r]){puts("No");return;}}puts("Yes");
}
int main(){T=rd();while(T--){memset(tag,0,sizeof(tag));memset(mx,0,sizeof(mx));tot=0;cnt=0;solve();}
}

BZOJ3693:圆桌会议(Hall定理)相关推荐

  1. [BZOJ3693]圆桌会议[霍尔定理+线段树]

    题意 题目链接 分析 又是一个二分图匹配的问题,考虑霍尔定理. 根据套路我们知道只需要检查 "区间的并是一段连续的区间" 这些子集. 首先将环倍长.考虑枚举答案的区间并的右端点 \ ...

  2. TCO 2015 1A Hard.Revmatching(Hall定理)

    \(Description\) 给定一个\(n\)个点的二分图,每条边有边权.求一个边权最小的边集,使得删除该边集后不存在完备匹配. \(n\leq20\). \(Solution\) 设点集为\(S ...

  3. AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)

    AT2645 [ARC076D] Exhausted? 对于一个二分图左边点连接的是右边点的一个前缀和一个后缀,求解最大匹配. 首先不能直接求解最大匹配,但是我们可以利用Hall定理的推论求解 ∣U∣ ...

  4. 【TC10738】TheContest【Hall 定理】【贪心】【二分图匹配】

    题意:给 n×mn\times mn×m 的表格填入 [1,max⁡(n,m)][1,\max(n,m)][1,max(n,m)] 的数,每行每列不能重复,且字典序最小. n,m≤50n,m\leq ...

  5. AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出nnn个点和n−1n-1n−1个点集UiU_iUi​,每个点集中选择两个点连边使得该图是一 ...

  6. [BZOJ1135][P3488][POI2009]LYZ[线段树+Hall定理]

    首先从二分图匹配的角度来想这个题,只要每个人都能和一双鞋子匹配,那么溜冰鞋就是足够的. 但看范围不能用二分图匹配来做,因为边数会爆炸 Hall定理是判定二分图是否存在完全匹配的定理. 完全匹配:是指最 ...

  7. Hall定理(bzoj 1135: [POI2009]Lyz)

    Hall定理(二分图重要定理): 对于二分图U, V(|U|<|V|),设M(Ux)为V中可以与Ux中的点相连的点集,如果该二分图存在完美匹配 那么对于任意点集x∈U都有|M(x)|>=| ...

  8. 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1135 把鞋子和人抽象成二分图 Hall定理: 此定理使用于组合问题中,二部图G中的两部分顶点 ...

  9. Hall定理及其充要性证明

    Hall定理: 若二分图GGG中两部分的点的集合分别为X,YX,YX,Y下设∣X∣≤∣Y∣|X| \leq |Y|∣X∣≤∣Y∣ 则二分图存在完备匹配当且仅当XXX中的任意kkk个点至少与YYY中的k ...

最新文章

  1. layer.open嵌入地址链接
  2. 爬虫scrapy框架中间件的使用
  3. 关于server 2008 r2中文版安装多国语言用户界面包(英文)
  4. JavaScript 易错知识点整理
  5. pci规划的三个原则_NR PCI规划
  6. erlang在NotePad++下的高亮
  7. 理解linux虚拟文件系统VFS - 概述
  8. java环境变量配置(win7)
  9. @请注意查收:《史上最全的AI论文资料》.pdf
  10. Python基础(10) - 异常
  11. 10月Web服务器调查:Apache下降 Ngnix攀升
  12. 2021 年 9 月 TIOBE 指数 C# 同比增长突破 1.2%
  13. sql开启mysql远程连接_SQLServer2008设置开启远程连接
  14. 关于gcc -o 的使用问题
  15. visualbox 安装 ubuntu 18.04 后续操作:设置ip、换源、安装LAMP、phpmyadmin
  16. java判断枚举是否包含_java判断枚举是否包含
  17. SQL Server SQL语句调优技巧
  18. ubuntu12.04完美安装QQ2012、QQMusic、Foxmail等
  19. 经典脑成像研究的元分析示例(决策篇)
  20. html字体外颜色轮廓,文字轮廓效果

热门文章

  1. 多线程 - 线程同步
  2. 中国农产品流通市场运营状况与发展前景预测报告2022-2027年
  3. JAVA学习-JDK8环境的安装与卸载
  4. 电视剧中一看就崩溃的镜头
  5. Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值
  6. 看懂IPv6+,这篇就够了
  7. java斗地主发牌代码_[Java源码]扑克牌——斗地主发牌实现
  8. MySQL DDL--ghost工具学习
  9. FineBI 取日期的最大max、最小值min
  10. 1.已知长方形的长和宽,求长方形的周长和面积。