[BZOJ1135][P3488][POI2009]LYZ[线段树+Hall定理]
首先从二分图匹配的角度来想这个题,只要每个人都能和一双鞋子匹配,那么溜冰鞋就是足够的。
但看范围不能用二分图匹配来做,因为边数会爆炸
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定理]相关推荐
- 【BZOJ1135】[POI2009]Lyz 线段树
[BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...
- 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1135 把鞋子和人抽象成二分图 Hall定理: 此定理使用于组合问题中,二部图G中的两部分顶点 ...
- BZOJ 1135 [POI2009]Lyz 线段树
题意:链接 方法:线段树维护子区间最值. 解析: 我们可以推出来一个式子. 就是如果满足题意的话. 那么任意一个子区间[l,r] f[i]表示穿i的鞋的人数 (r−l+1+d)∗k>=∑f[i] ...
- 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 ...
- 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这 ...
- AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)
AT2645 [ARC076D] Exhausted? 对于一个二分图左边点连接的是右边点的一个前缀和一个后缀,求解最大匹配. 首先不能直接求解最大匹配,但是我们可以利用Hall定理的推论求解 ∣U∣ ...
- Hall定理(bzoj 1135: [POI2009]Lyz)
Hall定理(二分图重要定理): 对于二分图U, V(|U|<|V|),设M(Ux)为V中可以与Ux中的点相连的点集,如果该二分图存在完美匹配 那么对于任意点集x∈U都有|M(x)|>=| ...
- BZOJ 2138 stone(霍尔定理推论,线段树)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2138 是 hydro 的 BZOJ ...
- BZOJ1135: [POI2009]Lyz
似乎是hall定理的经典模型 贪心的想,对于人的任意一个集合,肯定编号是连续的l~r一段更容易使匹配不合法 写成柿子就是∑ri=lsi>(d+r−l+1)k\sum_{i=l}^rsi>( ...
最新文章
- Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换
- 【转】我该 不该学习VULKAN
- Java多线程系列(八):ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)
- Unitest框架的使用(四)HTMLTestRunner输出测试报告
- Binutils工具集中的一些比较常用的工具
- 手动创建一个标准web工程
- ubuntu18 mysql5.6源码_Ubuntu 18.04 使用Systemd管理MySQL 5.6
- AudFree Tidable Music Converter for Mac - 音乐格式转换软件
- 开放 API 接口签名验证,让你的接口从此不再裸奔 !
- couldn't open file: data/coco.names
- JAVA学习笔记:目录
- SVN使用教程图文教程
- kafkatool 配置_kafka可视化工具安装及简单使用
- S变换介绍(附代码)
- 形式语言与自动机学习心得
- poi操作word复制表格
- 财务会计中会计科目的基础
- Java实现的快递柜管理系统(附上完整代码可用作期末课程设计)
- android 模拟器 itools,iTools安卓模拟器常见问题及解决方法
- 新的掌舵手已就位,汽车之家这艘船将驶向何方?