题意

题目链接

分析

  • 又是一个二分图匹配的问题,考虑霍尔定理。
  • 根据套路我们知道只需要检查 "区间的并是一段连续的区间" 这些子集。
  • 首先将环倍长。考虑枚举答案的区间并的右端点 \(r\),显然 \(r\) 应该在某个区间的右端点上。我们想要判断是否存在一个 \(l\) 使得 \(r-l+1\le m\) 且 \(\sum\limits_{l\le L_i,R_i\le r}a_i>r-l+1\) ,扫描线+线段树 即可。
  • 有一类特殊情况:区间的并是整个环,这时它在序列上的表示长度可能不是这个并的真实长度(因为可能会有同一个区间出现两次),我们此时只需要特判 \(\sum a>m\) 即可。

  • 总时间复杂度为 \(O(nlogn)\)。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
#define re(x) memset(x, 0, sizeof x)
inline int gi() {int x = 0,f = 1;char ch = getchar();while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();}while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}return x * f;
}
template <typename T> inline void Max(T &a, T b){if(a < b) a = b;}
template <typename T> inline void Min(T &a, T b){if(a > b) a = b;}
const int N = 4e5 + 7;
int T, n, m, vc;
LL adv[N << 2], mx[N << 2], V[N << 1];
#define Ls o << 1
#define Rs (o << 1 | 1)
void st1(int o, LL v) {adv[o] += v;mx[o] += v;
}
void pushdown(int o) {if(!adv[o]) return;st1(Ls, adv[o]);st1(Rs, adv[o]);adv[o] = 0;
}
void pushup(int o) {mx[o] = max(mx[Ls], mx[Rs]);
}
void build(int l, int r,int o){adv[o] = 0;if(l == r) {mx[o] = V[l];return;}int mid = l + r >> 1;build(l, mid, Ls);build(mid + 1, r, Rs);pushup(o);
}
void modify(int L, int R, int l, int r,int o, LL v) {if(L > R) return;if(L <= l && r <= R) {st1(o, v);return;}pushdown(o);int mid = l + r >> 1;if(L <= mid) modify(L, R, l, mid, Ls, v);if(R > mid)  modify(L, R, mid + 1, r, Rs, v);pushup(o);
}
int query(int L, int R, int l, int r, int o) {if(L > R) return 0;if(L <= l && r <= R) return mx[o];pushdown(o);int mid = l + r >> 1;if(R <= mid) return query(L, R, l, mid, Ls);if(L > mid)  return query(L, R, mid + 1, r, Rs);return max(query(L, R, l, mid, Ls), query(L, R, mid + 1, r, Rs));
}
struct qs {int l, r;LL a;bool operator <(const qs &rhs) const {return r < rhs.r;}
}q[N];
int main() {T = gi();while(T--) {n = gi(), m = gi();int ndc = n, sum = 0;vc = 0;rep(i, 1, n) {q[i].l = gi(), q[i].r = gi(), q[i].a = gi();sum += q[i].a;if(q[i].l <= q[i].r) q[++ndc] = (qs){ q[i].l + m, q[i].r + m, q[i].a};else q[i].r += m;}n = ndc;if(sum > m) { puts("No"); goto A;}sort(q + 1, q + 1 + n);rep(i, 1, n) V[++vc] = q[i].l, V[++vc] = q[i].r;sort(V + 1, V + 1 + vc);vc = unique(V + 1, V + 1 + vc) - V - 1;build(1, vc, 1);rep(i, 1, n) {q[i].l = lower_bound(V + 1, V + 1 + vc, q[i].l) - V;int pos = lower_bound(V + 1, V + 1 + vc, q[i].r - m + 1) - V;q[i].r = lower_bound(V + 1, V + 1 + vc, q[i].r) - V;modify(1, q[i].l, 1, vc, 1, q[i].a);LL res = query(pos, q[i].r, 1, vc, 1);if(res > V[q[i].r] + 1){ puts("No"); goto A;}}puts("Yes");A:;}return 0;
}

转载于:https://www.cnblogs.com/yqgAKIOI/p/10223371.html

[BZOJ3693]圆桌会议[霍尔定理+线段树]相关推荐

  1. 「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)

    题目描述 给出一个长度为  的数列  和一个长度为  的数列 ,求  有多少个长度为  的连续子数列能与  匹配. 两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对 ...

  2. loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树

    题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai​和ai−ja _ i-jai​−j互为相反数,若其中最小值为bib _ ibi​,则一个为bib _ ibi​一个为m−bim-b _ ...

  3. BZOJ 2138 stone(霍尔定理推论,线段树)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2138 是 hydro 的 BZOJ ...

  4. 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)

    题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这 ...

  5. 子段乘积(逆元费马小定理)+线段树做法

    题解:一开始做这个题的时候想过尺取法,但是因为没有逆元的知识,不知道该如何不断删除左端元素.其实这题并不难想,设l,r为两端开始都置为1,当长度小于k的时候不断乘右端元素并取余,当长度等于k时删除左端 ...

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

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

  7. 2019多校第九场 HDU6681 Rikka with Cake(欧拉图论定理,线段树)

    链接:HDU6681 Rikka with Cake 题意: 给出一个笛卡尔坐标系中左下角坐标为(0,0)(0,0)(0,0),右上角坐标为(n,m)(n,m)(n,m)的矩形,有K  (≤105)K ...

  8. HDU 5238 Calculator 线段树 中国剩余定理

    题意: 给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算. 有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值. 有一种修改操作:可以修改第\(p\)个运算的运算 ...

  9. 线段树区间更新 费马小定理|魔豆传奇

    程序设计:魔豆传奇 <魔豆传奇>是2004年的一部动画片.里面有很多奇怪的魔豆,具有奇特且强大的能力. 偶然间,蒜头君获得了一排已经发芽的魔豆,每株的最初高度为ai . 蒜头君每天都会选择 ...

最新文章

  1. 【数据结构】图的深度优先遍历 广度优先遍历
  2. 〖Android〗从Android Studio转为Eclipse开发项目运行程序闪退的解决方法
  3. linux c 各头文件作用总结
  4. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )
  5. Word2010-页眉中字数未满但自动换行
  6. java http的get,post请求
  7. IntelliJ IDEA下载插件超时--解决方法
  8. 0057-简单的累加
  9. python爬虫怎么挣钱-个人利用Python爬虫技术怎么挣钱
  10. 关于PHP你可能不知道的10件事
  11. checkbox选中与取消选择
  12. 为何 Emoji 能给产品设计(营销)带来如此大的数据增长?
  13. vim 复制到剪切板
  14. G415,到了徐州,车厢空了
  15. 春节期间,哪些信用卡取现不用手续费?
  16. 扩展模块已停止工作怎么解决_菲尼克斯Phoenix控制器电源模块维修检测免费
  17. Redis_Study
  18. 【赛题解读】2021 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别
  19. centos安装python及导入cv2出现的问题及踩坑记录
  20. 数据服务门槛再提升,这个“TOP1玩家”凭何再度领军?

热门文章

  1. 知识管理系统Data Solution研发日记之六 窗体设计器
  2. Velodyne收购高清地图公司 将研发更安全的ADAS系统
  3. 2019年陕西高考分数线出炉
  4. android小程序备忘录,撸一个会话备忘录的小程序
  5. java重写的特性解释
  6. 086_访问html元素
  7. 010_JavaScript变量
  8. gomarket服务器位置,ANZHI安智市场 Gomarket
  9. 伯努利分布方差_统计知识(4)——分布
  10. html中双重id标签怎么写,PHP读取HTML并处理双重ID外观