【BZOJ2138】stone(线段树,Hall定理)

题面

BZOJ

题解

考虑一个暴力。

我们对于每堆石子和每个询问,显然是匹配的操作。

所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\)个,这样就是每次进行一次二分图的匹配。

当然可以用网络流+线段树优化连边来做,但是这样复杂度太高。

还是回到二分图的匹配问题,我们现在要验证的就是是否存在对于当前询问点的完美匹配。

关于完美匹配,有\(Hall\)定理,如果存在完美匹配,假设左侧的点有\(|X|\)个,那么这些点连向右边的点的点集的并\(Y\),满足\(|X|\le |Y|\)

因为询问点拆开后,每个点的连向右边的点集都是一样的,所以相当于就是\(K_i\le|Y|\)

只提取出所有有用的石子,按顺序编号。设\(s_i\)表示前\(i\)堆石子的个数和。

如果存在完美匹配,那么在任意时刻,所有存在于区间\([L,R]\)之内的询问的石子个数的总和\(T[L,R]\)一定小于区间\([L,R]\)之内的石子的总和。

也就是\(s_R-s_{L-1}\ge T[L,R]\),发现题目中的性质,任何询问不存在包含关系。

那么我们假设\(TL_i\)表示左端点在\([1,i]\)中的询问的总和,\(TR_i\)表示右端点在\([1,i]\)中的询问的总和。

那么因为\(T[L,R]=TR_R-TL_{L-1}\),所以我们也可以很容易的表示出\(T\)来。

所以,现在的不等式表达为\(s[R]-s[L-1]\ge TR[R]-TL[L-1]\)

所以\(s[R]-TR[R]\ge s[L-1]-TL[L-1]\)

设\(f[i]=s[i]-TR[i],g[i]=s[i]-TL[i]\),所以是\(f[R]\ge g[L-1]\)

我们发现,如果从\([L,R]\)区间中拿走若干石头,在不等式中变化的只有\(TR[R]\)

也就是只有\(f[i]\)会减小。所以我们能够拿走的数量为\(min(K[i],f[R]-g[L-1])\)

对于当前询问区间\([L,R]\),会对于所有的\(x\in [1,L],y\in [R,n],[x,y]\)产生影响

也就是任何包含当前区间的区间也需要满足\(Hall\)定理,在本题中也就是\(f[y]\ge g[x]\)

那么当前步的答案就是所有的\(min(K[i],f[y]-g[x])\),那么取后缀\(f\)最小值,前缀\(g\)最大值即可。

每次拿线段树区间更新一下即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define RG register
#define MAX 40040
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,a[MAX],K[MAX],s[MAX];
struct SegMentTree_Max
{
int t[MAX<<2],tag[MAX<<2];
void puttag(int now,int w){t[now]+=w;tag[now]+=w;}
void pushdown(int now,int l,int r){puttag(lson,tag[now]);puttag(rson,tag[now]);tag[now]=0;}
void Build(int now,int l,int r)
{
if(l==r){t[now]=s[l];return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
t[now]=max(t[lson],t[rson]);
}
void Modify(int now,int l,int r,int L,int R,int w)
{
if(L<=l&&r<=R){puttag(now,w);return;}
int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R,w);
if(R>mid)Modify(rson,mid+1,r,L,R,w);
t[now]=max(t[lson],t[rson]);
}
int Query(int now,int l,int r,int L,int R)
{
if(L>R)return 0;if(L<=l&&r<=R)return t[now];
int mid=(l+r)>>1,ret=0;pushdown(now,l,r);
if(L<=mid)ret=max(ret,Query(lson,l,mid,L,R));
if(R>mid)ret=max(ret,Query(rson,mid+1,r,L,R));
return ret;
}
}G;
struct SegMentTree_Min
{
int t[MAX<<2],tag[MAX<<2];
void puttag(int now,int w){t[now]+=w;tag[now]+=w;}
void pushdown(int now,int l,int r){puttag(lson,tag[now]);puttag(rson,tag[now]);tag[now]=0;}
void Build(int now,int l,int r)
{
if(l==r){t[now]=s[l];return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
t[now]=min(t[lson],t[rson]);
}
void Modify(int now,int l,int r,int L,int R,int w)
{
if(L<=l&&r<=R){puttag(now,w);return;}
int mid=(l+r)>>1;pushdown(now,l,r);
if(L<=mid)Modify(lson,l,mid,L,R,w);
if(R>mid)Modify(rson,mid+1,r,L,R,w);
t[now]=min(t[lson],t[rson]);
}
int Query(int now,int l,int r,int L,int R)
{
if(L>R)return 0;if(L<=l&&r<=R)return t[now];
int mid=(l+r)>>1,ret=1e9;pushdown(now,l,r);
if(L<=mid)ret=min(ret,Query(lson,l,mid,L,R));
if(R>mid)ret=min(ret,Query(rson,mid+1,r,L,R));
return ret;
}
}F;
int main()
{
freopen("stone.in","r",stdin);
freopen("stone.out","w",stdout);
n=read();int X=read(),Y=read(),Z=read(),P=read();
for(int i=1;i<=n;++i)s[i]=a[i]=(1ll*(i-X)*(i-X)%P+1ll*(i-Y)*(i-Y)%P+1ll*(i-Z)*(i-Z)%P)%P;
for(int i=1;i<=n;++i)s[i]+=s[i-1];
m=read();K[1]=read(),K[2]=read(),X=read(),Y=read(),Z=read(),P=read();
for(int i=3;i<=m;++i)K[i]=(1ll*K[i-1]*X%P+1ll*K[i-2]*Y%P+Z)%P;
if(!m)return 0;G.Build(1,1,n);F.Build(1,1,n);
for(int i=1;i<=m;++i)
{
int l=read(),r=read();
K[i]=min(K[i],F.Query(1,1,n,r,n)-G.Query(1,1,n,1,l-1));
F.Modify(1,1,n,r,n,-K[i]);G.Modify(1,1,n,l,n,-K[i]);
printf("%d\n",K[i]);
}
return 0;
}

【BZOJ2138】stone(线段树,Hall定理)的更多相关文章

  1. 【BZOJ2138】stone(线段树+hall定理)

    传送门 题意: 现在有\(n\)堆石子,每堆石子有\(a_i\)个. 之后会有\(m\)次,每次选择\([l,r]\)的石子堆中的石子扔\(k\)个,若不足,则尽量扔. 现在输出\(1\)~\(m\) ...

  2. BZOJ1135:[POI2009]Lyz(线段树,Hall定理)

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

  3. bzoj 1135 [POI2009]Lyz 线段树+hall定理

    1135: [POI2009]Lyz Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 573  Solved: 280[Submit][Status][ ...

  4. BZOJ 1135 P3488 LYZ-Ice Skates 线段树+Hall

    https://www.luogu.org/problem/P3488 根据Hall定理 左边任意一个区间L-R a[i]的和sum[l~r] 都要<= (R-L+1+d)*K 把(R-L+1) ...

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

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

  6. 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)

    bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那 ...

  7. 【BZOJ2138】stone Hall定理+线段树

    [BZOJ2138]stone Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆包含Ai颗石子.每1分钟,Nan会 ...

  8. [BZOJ2138]stone(Hall定理,线段树)

    Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆 包含Ai颗石子.每1分钟,Nan会在编号在\([L_i,R_i] ...

  9. [BZOJ2138]stone[霍尔定理+线段树]

    题意 一共有 \(n\) 堆石子,每堆石子有一个数量 \(a\) ,你要进行 \(m\) 次操作,每次操作你可以在满足前 \(i-1\) 次操作的回答的基础上选择在 \([L_i,R_i]\) 区间中 ...

随机推荐

  1. log4net始终占用日志文件的问题

    在appender 下面加 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

  2. The filename 未命名.ipa in the package contains an invalid character(s). The valid characters are: A-Z, a-z, 0-9, dash, period, underscore, but the name cannot start with a dash, period, or underscore

    The filename 未命名.ipa in the package contains an invalid character(s).  The valid characters are: A-Z ...

  3. linux下汇编语言开发总结

    汇编语言是直接对应系统指令集的低级语言,在语言越来越抽象的今天,汇编语言并不像高级语言那样使用广泛,仅仅在驱动程序,嵌入式系统等对性能要求苛刻的领域才能见到它们的身影.但是这并不表示汇编语言就已经没有 ...

  4. CentOS安装输入法及kDE桌面

    参考教程:https://jingyan.baidu.com/article/154b46317fdfce28ca8f419e.html

  5. html5新特性localStorage和sessionStorage

    HTML5 提供了两种在客户端存储数据的新方法: localStorage: (1)它的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失. (2)它的容量大小是5M作用 ...

  6. Phaser3游戏三角学应用--一只跟随屏幕点击位置游动的鱼

    fish fish 资源图: fish-136x80.png undersea-bg.png 代码 var config = { type: Phaser.AUTO, parent: 'iFiero' ...

  7. 天下武功,无快不破,Python开发必备的6个库

    01 Python 必备之 PyPy PyPy 主要用于何处? 如果你需要更快的 Python 应用程序,最简单的实现的方法就是通过 PyPy ,Python 运行时与实时(JIT)编译器.与使用普通 ...

  8. Teaching Machines to Understand Us 让机器理解我们 之一 引言

    Teaching Machines to Understand Us   By Tom Simonite  MIT Technology Review Vol.118 No.5 2015 让机器理解我 ...

  9. RedHat yum源配置

    RedHat yum源配置 原本以为Redhat7 和Centos7是完全一样的,可是安装完Redhat7以后,使用yum安装软件,提示红帽操作系统未注册.在网上搜索教程,最后成功解决,解决方式是将y ...

  10. less 语法特性翻译稿 - 特性快速预览部分

    原文地址 http://lesscss.cn/features/ 概述 作为CSS的一种扩展语法,Less不仅仅向后兼容CSS,新的特性也是基于CSS现有语法.这使得学习Less变得容易,如果你有所怀 ...