首先从二分图匹配的角度来想这个题,只要每个人都能和一双鞋子匹配,那么溜冰鞋就是足够的。

但看范围不能用二分图匹配来做,因为边数会爆炸

Hall定理是判定二分图是否存在完全匹配的定理。

完全匹配:是指最大匹配数为 \(min(|X|,|Y|)\) 也就是 \(X\) 或 \(Y\) 集合其中一个集合所有点都被匹配了。

设二分图\(G=\lt V\text{1,}V\text{2,}E\gt\)中 \(|V\text{1|}=m<=|V\text{2|}=n\)
, \(G\) 中存在从 \(V1\)到 \(V2\) 的完全匹配当且仅当 \(V1\) 中任意 \(k(k=1,2,...,m)\) 个顶点至少与 \(V2\) 中 \(k\) 个顶点是相邻的。
有解的条件就是任意一个人的集合的人数<=所连接的鞋子数量

当\(r_i\)是连续的时候连接的鞋子的数量最少。


所以如果连续的情况满足,其他情况一定满足。

关于为什么最坏情况不满足,其他情况就一定不满足,不是很懂,翻了好多题解都没有看到关于这个的解释。求解

上述成立的话,就是带修改维护最大子段和了

\[ \sum_{i=l}^r{\{}a\left[ i \right] \le \,\,\left( r-l+1+d \right) *k\} \]

\[\sum_{i=l}^r{\left( a\left[ i \right] -k \right) \le d*k}\]

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;bool Debug;const int mod = 1e9+7;
const int MAXN = 2e5+7;#define xx first
#define yy second
#define pb push_back
#define mp make_pair
#define iter iterator
#define sqr(a) ((a)*(a))
#define abs(a) ((a)>0?(a):(-(a)))
#define max(a, b) ((a)>(b)?(a):(b))
#define min(a, b) ((a)<(b)?(a):(b))
#define mset(a, b) memset(a, b, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(a))
#define lop(i,a,b) for(int i = (a); i <= (b); ++i)
#define dlop(i,a,b) for(int i = (a); i >= (b); --i)
#define debu(...) if (Debug) fprintf(stderr, __VA_ARGS__)
#define debug(x) if (Debug) cerr << "" #x " = " << x << endl
#define ergo(a) for(auto it = a.begin(); it != a.end(); ++it)template<typename T> T gcd(T a, T b) {T t; while(t = a % b) a = b, b = t; return b;}
template<typename T> T Pow(T a, T b, T mod) {T ret = 1; for( ; b; b >>= 1) {if (b & 1) ret = ret * 1ull * a % mod; a = a * 1ull * a % mod;} return ret%mod;}
template<typename T> void chmax(T &x, T y) {if (x < y) x = y;}
template<typename T> void chmin(T &x, T y) {if (x > y) x = y;}
template<typename T> void amod(T &x, T y) {x += y; if (x >= mod) x -= mod;}
template<typename T> void smod(T &x, T y) {x -= y; if (x < 0) x += mod;}typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef pair<int,int> pii;
typedef unsigned long long ull;
template<typename T> void read(T &x) {x = 0; int c = getchar(), f = 1;while(!isdigit(c)) (c=='-')&&(f = -1), c = getchar();while(isdigit(c)) x = x * 10 + c - '0', c = getchar();x *= f;
}
#define read2(a, b) read(a), read(b)
ll n, a[200005], m, k, d, x, y;struct Node{ll lmax, rmax, tmax, val;Node *ls, *rs;inline void pushup(){val = ls->val + rs->val;lmax = max(ls->lmax, ls->val + rs->lmax);rmax = max(rs->rmax, rs->val + ls->rmax);tmax = max(ls->tmax, max(rs->tmax, ls->rmax + rs->lmax));}
}pool[MAXN<<1], *root;
inline Node *newNode() {static int cnt = 0;return &pool[cnt++];
}Node *build(int l, int r) {Node *cur = newNode();if (l != r) {int mid = l+r>>1;cur->ls = build(l, mid);cur->rs = build(mid+1, r);cur->pushup();}else cur->val = cur->tmax = -k;return cur;
}void Modify(Node *cur, int l, int r, int x, int y) {if (l == r) {cur->val += y, cur->tmax += y; cur->lmax = cur->rmax = max(cur->val, 0);return ;}int mid = l+r>>1;if (x <= mid) Modify(cur->ls, l, mid, x, y);else Modify(cur->rs, mid+1, r, x, y);cur->pushup();
}int main() {#ifdef LOCAL_DEBUGDebug = 1;// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);#endifread2(n, m), read2(k, d);root = build(1, n);while(m--) {read2(x, y);
//    cerr << x << ' ' << y << endl;Modify(root, 1, n, x, y);if (root->tmax <= k * d) puts("TAK");else puts("NIE");}
//  cout << root->tmax;return 0;
}

转载于:https://www.cnblogs.com/storz/p/10191149.html

[BZOJ1135][P3488][POI2009]LYZ[线段树+Hall定理]相关推荐

  1. 【BZOJ1135】[POI2009]Lyz 线段树

    [BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...

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

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

  3. BZOJ 1135 [POI2009]Lyz 线段树

    题意:链接 方法:线段树维护子区间最值. 解析: 我们可以推出来一个式子. 就是如果满足题意的话. 那么任意一个子区间[l,r] f[i]表示穿i的鞋的人数 (r−l+1+d)∗k>=∑f[i] ...

  4. BZOJ[1135][POI2009]Lyz 线段树

    传送门ber~ 如果某时不合法,那一定存在某段满足 (r−l+1+d)∗k<Σl≤i≤rnumi(r−l+1+d)∗k<Σl≤i≤rnumi (r-l+1+d)*k (其中 numinum ...

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

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

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

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

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

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

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

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

  9. BZOJ1135: [POI2009]Lyz

    似乎是hall定理的经典模型 贪心的想,对于人的任意一个集合,肯定编号是连续的l~r一段更容易使匹配不合法 写成柿子就是∑ri=lsi>(d+r−l+1)k\sum_{i=l}^rsi>( ...

最新文章

  1. Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换
  2. 【转】我该 不该学习VULKAN
  3. Java多线程系列(八):ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)
  4. Unitest框架的使用(四)HTMLTestRunner输出测试报告
  5. Binutils工具集中的一些比较常用的工具
  6. 手动创建一个标准web工程
  7. ubuntu18 mysql5.6源码_Ubuntu 18.04 使用Systemd管理MySQL 5.6
  8. AudFree Tidable Music Converter for Mac - 音乐格式转换软件
  9. 开放 API 接口签名验证,让你的接口从此不再裸奔 !
  10. couldn't open file: data/coco.names
  11. JAVA学习笔记:目录
  12. SVN使用教程图文教程
  13. kafkatool 配置_kafka可视化工具安装及简单使用
  14. S变换介绍(附代码)
  15. 形式语言与自动机学习心得
  16. poi操作word复制表格
  17. 财务会计中会计科目的基础
  18. Java实现的快递柜管理系统(附上完整代码可用作期末课程设计)
  19. android 模拟器 itools,iTools安卓模拟器常见问题及解决方法
  20. 新的掌舵手已就位,汽车之家这艘船将驶向何方?

热门文章

  1. Spark源码系列(四)图解作业生命周期
  2. vnc报错 font catalog is not properly configured
  3. 如何使用数据库可移植性将邮箱数据库还原到新服务器
  4. 【补充一则】身份证校验的c#代码
  5. centos安装最新版的docker-ce(二进制安装)
  6. Asp.net Ajax 的 PageRequestManager类的事件
  7. Jmeter 抓app包 抓到一半不好用了
  8. tf:'hello tensorflow'
  9. Restful的理解,Restful 优缺点
  10. Oracle Real Application Testing diagram