【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
Solution
- 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理。
- 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这个时候我们可以根据霍尔定理得出满足人人有鞋子穿的时候的式子是
令\(sum[i]\)表示穿\(i\)号鞋子的人数
\]
我们把这个式子整理下:
\]
- 我们会发现右边是一个常量,那么这个式子就等价与左边的最大值小于等右边即满足,否则不满足
- 所以我们就只需要找出\(1\rightarrow n\)中最大连续子序列。
New Knowledge
- 最大连续子序列用线段树来维护,重难点在\(update\)
- 向上更新
void update(int now,int nl,int nr){
node[now].sum=node[ls(now)].sum+node[rs(now)].sum;
node[now].lmax=max(node[ls(now)].lmax,node[ls(now)].sum+node[rs(now)].lmax);
node[now].rmax=max(node[rs(now)].rmax,node[ls(now)].rmax+node[rs(now)].sum);
node[now].maxx=max( node[ls(now)].rmax+node[rs(now)].lmax ,
max( node[ls(now)].maxx , node[rs(now)].maxx) );return;
}
Code
//It is coded by ning_mew on 7.18
#include<bits/stdc++.h>
#define ls(x) (x*2)
#define rs(x) (x*2+1)
#define LL long long
using namespace std;
const int maxn=2e5+7;
int n,m,d;LL k;
struct Node{LL lmax,rmax,maxx,sum;}node[maxn*4];
void update(int now,int nl,int nr){
node[now].sum=node[ls(now)].sum+node[rs(now)].sum;
node[now].lmax=max(node[ls(now)].lmax,node[ls(now)].sum+node[rs(now)].lmax);
node[now].rmax=max(node[rs(now)].rmax,node[ls(now)].rmax+node[rs(now)].sum);
node[now].maxx=max( node[ls(now)].rmax+node[rs(now)].lmax , max( node[ls(now)].maxx , node[rs(now)].maxx) );return;
}
void build(int now,int nl,int nr){
if(nl==nr){node[now].sum=node[now].maxx=node[now].lmax=node[now].rmax=-k;return;}
int mid=(nl+nr)/2;
build(ls(now),nl,mid);build(rs(now),mid+1,nr);
update(now,nl,nr);
}
void add(int now,int nl,int nr,int pl,LL ad){
if(nl==nr&&nr==pl){
LL box=node[now].sum+ad; node[now].sum=box;node[now].maxx=box;node[now].lmax=box;node[now].rmax=box; return;
} if(nr<pl||pl<nl)return;
int mid=(nl+nr)/2;
add(ls(now),nl,mid,pl,ad);add(rs(now),mid+1,nr,pl,ad);
update(now,nl,nr);
}
int main(){
scanf("%d%d%lld%d",&n,&m,&k,&d);
build(1,1,n);
for(int i=1;i<=m;i++){
int r;LL x;scanf("%d%lld",&r,&x);
add(1,1,n,r,x);//cout<<node[1].maxx<<endl;
if(node[1].maxx>d*k)printf("NIE\n");else printf("TAK\n");
}return 0;
}
博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/Ning-Mew/,否则你会场场比赛暴0!!!
【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)的更多相关文章
- BZOJ1135:[POI2009]Lyz(线段树,Hall定理)
Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...
- bzoj 1135 [POI2009]Lyz 线段树+hall定理
1135: [POI2009]Lyz Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 573 Solved: 280[Submit][Status][ ...
- 【BZOJ1135】[POI2009]Lyz 线段树
[BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...
- 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)
bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那 ...
- [BZOJ1135][POI2009]Lyz[霍尔定理+线段树]
题意 题目链接 分析 这个二分图匹配模型直接建图的复杂度太高,考虑霍尔定理. 对于某些人组成的区间,我们只需要考虑他们的并是一段连续的区间的集合.更进一步地,我们考虑的人一定是连续的. 假设我们考虑的 ...
- BZOJ1135: [POI2009]Lyz
1135: [POI2009]Lyz Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 264 Solved: 106[Submit][Status] ...
- 【BZOJ2138】stone(线段树+hall定理)
传送门 题意: 现在有\(n\)堆石子,每堆石子有\(a_i\)个. 之后会有\(m\)次,每次选择\([l,r]\)的石子堆中的石子扔\(k\)个,若不足,则尽量扔. 现在输出\(1\)~\(m\) ...
- 一码学程 10284 排队找bug 题解 单调队列 或者 线段树RMQ
注:只是看到题目,未评测,所以不确定代码正确性,但是算法思路没有问题 描述 同学们的bug还真是多啊,orz... 春节期间大家存下的bug都来找肖老师解决了. 每个人都有bug,但是肖老师却只有一个 ...
- [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...
随机推荐
- main函数如何调用文件外的函数
- 解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
解决办法:
- SQL Server中JOIN的使用方法总结
JOIN 分为:内连接(INNER JOIN).外连接(OUTER JOIN).其中,外连接分为:左外连接(LEFT OUTER JOIN).右外连接(RIGHT OUTER JOIN).全外连接(F ...
- macbookpro 以及 surface 的技术规格
macbookpro 13.3 英寸 (对角线) LED 背光显示屏 (采用 IPS 技术):初始分辨率 x ( ppi),支持数百万色彩 15.4 英寸 (对角线) LED 背光显示屏 (采用 IP ...
- Linux 系统命令行入门基础
Linux 命令行组成结构 打包及压缩命令 tar 解压压缩包:
- Client将数据读写HDFS流程
HDFS介绍 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的. 什么是分布式文件系统 分布式文件系统(Dist ...
- python爬虫scrapy之登录知乎
下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实 ...
- python之路--操作系统介绍,进程的创建
一 . 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 所谓多道程序设计技术,就是指允许多个程序同时进入内存 ...
- C#通过Socket读取大量数据
在C#中经常会用到Socket去接收和发送数据,而且也是非常方便的,有时候我们会向服务端去请求数据,如果返回的数据量很大,比如超过10M甚至是更多,那么该怎样去接收数据呢?下面以一个在项目中用到的实例 ...
- matlab中randn(‘state’)
matlab中randn(‘state’)转载:http://www.cnblogs.com/rong86/p/3572284.html randn('state') 随机数都是由RandStream ...