根据Hall定理,若存在一个区间满足内部需求数$>$内部石子数,则不存在完美匹配。

由于区间互不包含,所以设:

$a[i]$表示右端点$\leq i$的区间的容量之和。

$b[i]$表示左端点$\leq i$的区间的容量之和。

$s[i]$表示前$i$个位置的石子数之和。

则区间$[l,r]$的:

石子数$=s[r]-s[l-1]$。

需求数$=a[r]-b[l-1]$。

即对于任意$0\leq i<j\leq n$,要满足:

$\min((s[j]-a[j])-(s[i]-b[i]))\geq 0$

$f[i]=s[i]-a[i]$

$g[i]=s[i]-b[i]$

考虑$[l,r]$区间需求数为$k$时对匹配的影响:

$f[r..n]-=k$

$g[l..n]-=k$

那么当$k$取$\min(f[\geq r])-\max(g[<l])$时刚好满足所有限制。

线段树维护即可。

时间复杂度$O(m\log n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=40010,M=131100,inf=~0U>>1;
int n,m,i,x,y,z,P,a[N],f[M],g[M],tf[M],tg[M];
inline void tagf(int x,int y){f[x]+=y;tf[x]+=y;}
inline void tagg(int x,int y){g[x]+=y;tg[x]+=y;}
inline void pb(int x){
if(tf[x])tagf(x<<1,tf[x]),tagf(x<<1|1,tf[x]),tf[x]=0;
if(tg[x])tagg(x<<1,tg[x]),tagg(x<<1|1,tg[x]),tg[x]=0;
}
inline void up(int x){
f[x]=min(f[x<<1],f[x<<1|1]);
g[x]=max(g[x<<1],g[x<<1|1]);
}
void build(int x,int a,int b){
if(a==b){f[x]=g[x]=::a[a];return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
up(x);
}
void changef(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){tagf(x,-p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)changef(x<<1,a,mid,c,d,p);
if(d>mid)changef(x<<1|1,mid+1,b,c,d,p);
up(x);
}
void changeg(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){tagg(x,-p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)changeg(x<<1,a,mid,c,d,p);
if(d>mid)changeg(x<<1|1,mid+1,b,c,d,p);
up(x);
}
int askf(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return f[x];
pb(x);
int mid=(a+b)>>1,t=inf;
if(c<=mid)t=askf(x<<1,a,mid,c,d);
if(d>mid)t=min(t,askf(x<<1|1,mid+1,b,c,d));
return t;
}
int askg(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return g[x];
pb(x);
int mid=(a+b)>>1,t=-inf;
if(c<=mid)t=askg(x<<1,a,mid,c,d);
if(d>mid)t=max(t,askg(x<<1|1,mid+1,b,c,d));
return t;
}
int main(){
scanf("%d%d%d%d%d",&n,&x,&y,&z,&P);
for(i=1;i<=n;i++)a[i]=(1LL*(i-x)*(i-x)+1LL*(i-y)*(i-y)+1LL*(i-z)*(i-z))%P,a[i]+=a[i-1];
build(1,0,n);
scanf("%d%d%d%d%d%d%d",&m,&a[1],&a[2],&x,&y,&z,&P);
for(i=3;i<=m;i++)a[i]=(1LL*x*a[i-1]+1LL*y*a[i-2]+z)%P;
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",z=min(askf(1,0,n,y,n)-askg(1,0,n,0,x-1),a[i]));
changef(1,0,n,y,n,z);
changeg(1,0,n,x,n,z);
}
return 0;
}

  

BZOJ2138 : stone的更多相关文章

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

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

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

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

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

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

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

    [BZOJ2138]stone(线段树,Hall定理) 题面 BZOJ 题解 考虑一个暴力. 我们对于每堆石子和每个询问,显然是匹配的操作. 所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\ ...

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

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

  6. 【BZOJ2138】stone

    题目 好厉害的题啊 这道题不难看成一个二分图模型,但是给人一种求最大匹配的感觉,这实在不是很好求的样子,于是自闭了 但是不妨这样来考虑,对于一个需求\(k_i\),我们求一个最大的\(x\leq k_ ...

  7. POJ1740A New Stone Game[组合游戏]

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5769   Accepted: 3158 ...

  8. timus 1180. Stone Game 解题报告

    1.题目: 1180. Stone Game Time limit: 1.0 secondMemory limit: 64 MB Two Nikifors play a funny game. The ...

  9. HDU 4048 Zhuge Liang's Stone Sentinel Maze

    Zhuge Liang's Stone Sentinel Maze Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/327 ...

随机推荐

  1. windows客户端走代理上网

    前提:在大型网络中,由于众多服务器及安全性考虑,内网服务器是不能上外网的,但是为了满足某些服务的需要,一定会搭建代理服务器的. 以下是windows客户端走代理服务器的操作:       两下确定就可 ...

  2. python基础知识之zip

    names =['zhangning','lsl','lyq','xww']age = [1,2,3,4]for a,b in zip(names,age): print(a,b)S = 'abcde ...

  3. 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化,而报【远程服务器返回错误: (500) 内部服务器错误】

    1. 修改web.config文件可以改变这个默认值(上传1个G) <configuration> <system.web> <httpRuntime maxReques ...

  4. Python_面向对象_类1

    面向对象:减少重复代码,提高效率,比函数式编程更高效 类的创建: 实例属性又称:成员变量,成员属性(或者字段) 面向对象的三大特性: 一.封装 把客观事物封装为抽象的类,并对外只暴露一个可用接口 使用 ...

  5. 怎样把linux客户端用户禁止用 su命令来切换用户

    系统中有一个组叫做“wheel”,我们可以利用该组实现一些特殊的功能.我们可以将拥有su使用权限的用户加入到wheel组中并且对该组进行限制,那么只有在该组中的用户才有su的使用权限. 如要实现该功能 ...

  6. net core体系-web应用程序-4net core2.0大白话带你入门-3asp.net core项目架构和配置文件解读

    asp.net core web项目目录解读   Connected Services 和传统.net web项目相比,它的功能类似于添加webservice或者wcf service的引用.暂时用不 ...

  7. Codeforces 442D Adam and Tree dp (看题解)

    Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...

  8. js写三级联动

    <!DOCTYPE HTML> <html> <head> <title>联动菜单</title> <meta charset=&qu ...

  9. 关于window.open窗口的resize事件

    jQuery 事件 - resize() 方法 当调整浏览器窗口的大小时,发生 resize 事件. resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数. & ...

  10. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...