Description

话说Nan在海边等人,预计还要等上M分钟。为了打发时间,他玩起了石子。Nan搬来了N堆石子,编号为1到N,每堆

包含Ai颗石子。每1分钟,Nan会在编号在[Li,Ri]之间的石堆中挑出任意Ki颗扔向大海(好疼的玩法),如果[Li,R

i]剩下石子不够Ki颗,则取尽量地多。为了保留扔石子的新鲜感,Nan保证任意两个区间[Li,Ri]和[Lj,Rj],不会

存在Li<=Lj&Rj<=Ri的情况,即任意两段区间不存在包含关系。可是,如果选择不当,可能无法扔出最多的石子,

这时NN就会不高兴了。所以他希望制定一个计划,他告诉你他m分钟打算扔的区间[Li,Ri]以及Ki。现在他想你告诉

他,在满足前i-1分钟都取到你回答的颗数的情况下,第i分钟最多能取多少个石子。

Solution

如果把 \(m\) 个 \(K_i\) 和 \(n\) 堆石子 \(A_i\) 分别拆点 , 那么实际上就是跑一个完美匹配

假设我们钦定了这一分钟所选择的石子个数 , 判断是否合法就是判断是否存在完美匹配了

判断是否存在完美匹配一般用到 \(Hall\) 定理 , 但是问题是需要枚举 \(K_i\) 集合的所有子集

由于这个题目有很好的性质:右端点单调时,左端点也单调

那么有结论: 只需要对于所有的区间 \([l,r]\,\,l,r∈[1,m]\) 满足 \(Hall\) 定理就行了

证明分两种情况,假设有不相邻 \(i,j\) 构成子集:

1.\(i,j\) 所对应的区间不相交,那么 \(i,j\) 分别满足 \(Hall\) 定理就可以了

2.\(i,j\) 有交,那么 \([i+1,j-1]\) 一定都是被 \([L[i],R[j]]\) 包含的 , 所以实际上只需要关心中间连续的一段是否满足 \(Hall\) 定理和整个区间 \([i,j]\) 是否满足 \(Hall\) 定理就可以了

设每个时间选的石子数量为 \(B_i\) ,剩下的就是要时刻满足:

\(\sum_{i=l}^{r}B_i<=\sum_{i=L[l]}^{R[r]}A_i\)

用前缀和表示:

\(SB[r]-SB[l-1]<=SA[R[r]]-SA[L[l]-1]\)

\(SB[R]-SA[R[r]]<=SB[l-1]-SA[L[l]-1]\)

设 \(C[i]=SB[i]-SA[R[i]],D[i]=SB[i-1]-SA[L[i]-1]\)

那么就是对于所有的 \(l<=r\) 有 \(D[l]>=C[r]\)

每一个时刻能取的上界就是 \(min(D[l])-max(C[r])\)

用线段树维护一下即可,时间复杂度 \(O(M*log)\)

#include<bits/stdc++.h>
#define ls (o<<1)
#define rs (o<<1|1)
#define sqr(x) ((x)*(x))
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4e4+10;
int n,a[N],b[N],id[N],m,p[N],A[N];
struct data{int l,r,id;}q[N];
inline bool operator <(const data &p,const data &q){return p.r<q.r;}
struct seg{
int op,tr[N*4],a[N],la[N*4];
inline int Max(int x,int y){return op?max(x,y):min(x,y);}
inline void build(int l,int r,int o){
if(l==r){tr[o]=a[l];return ;}
int mid=(l+r)>>1;
build(l,mid,ls);build(mid+1,r,rs);
tr[o]=Max(tr[ls],tr[rs]);
}
inline void init(int o){op=o;build(1,m,1);}
inline void pushdown(int o){
if(!la[o])return ;
tr[ls]+=la[o];tr[rs]+=la[o];la[ls]+=la[o];la[rs]+=la[o];la[o]=0;
}
inline int qry(int l,int r,int o,int sa,int se){
if(sa<=l && r<=se)return tr[o];
int mid=(l+r)>>1;pushdown(o);
if(se<=mid)return qry(l,mid,ls,sa,se);
if(sa>mid)return qry(mid+1,r,rs,sa,se);
return Max(qry(l,mid,ls,sa,mid),qry(mid+1,r,rs,mid+1,se));
}
inline void ins(int l,int r,int o,int sa,int se,int t){
if(sa<=l && r<=se){tr[o]+=t;la[o]+=t;return ;}
int mid=(l+r)>>1;pushdown(o);
if(se<=mid)ins(l,mid,ls,sa,se,t);
else if(sa>mid)ins(mid+1,r,rs,sa,se,t);
else ins(l,mid,ls,sa,mid,t),ins(mid+1,r,rs,mid+1,se,t);
tr[o]=Max(tr[ls],tr[rs]);
}
}C,D;
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int x,y,z,P;
cin>>n>>x>>y>>z>>P;
for(int i=1;i<=n;i++)a[i]=(1ll*sqr(i-x)+sqr(i-y)+sqr(i-z))%P;
cin>>m;
if(!m)return 0;
cin>>b[1]>>b[2]>>x>>y>>z>>P;
for(int i=3;i<=m;i++)b[i]=(x*b[i-1]+y*b[i-2]+z)%P;
for(int i=1;i<=m;i++)gi(q[i].l),gi(q[i].r),q[i].id=i;
sort(q+1,q+m+1);n=0;
for(int i=1,j=1;i<=m;i++){
for(j=max(j,q[i].l);j<=q[i].r;j++)A[id[j]=++n]=a[j];
q[i].l=id[q[i].l];q[i].r=id[q[i].r];p[q[i].id]=i;
}
for(int i=1;i<=n;i++)A[i]+=A[i-1];
for(int i=1;i<=m;i++)C.a[i]=-A[q[i].r],D.a[i]=-A[q[i].l-1];
C.init(1);D.init(0);
for(int i=1;i<=m;i++){
x=p[i];
int rm=C.qry(1,m,1,p[i],m),lm=D.qry(1,m,1,1,p[i]);
int res=min(b[i],lm-rm);
printf("%d\n",res);
C.ins(1,m,1,p[i],m,res);
if(p[i]<m)D.ins(1,m,1,p[i]+1,m,res);
}
return 0;
}

bzoj 2138: stone的更多相关文章

  1. 【BZOJ 2138】stone

    Problem Description 话说 \(Nan\) 在海边等人,预计还要等上 \(M\) 分钟.为了打发时间,他玩起了石子. \(Nan\) 搬来了 \(N\) 堆石子,编号为 \(1\) ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. Hall 定理

    Hall 定理 是匈牙利算法的基础 大意是说,对于一个二分图 左边的集合记为X,右边的集合记为Y 存在完美匹配,(即匹配数目=min(|X|,|Y|))的充分必要条件是 对于任意一个X的子集,设大小为 ...

  4. BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)

    BZOJ 洛谷 低估这道神题了_(:з」∠)_ MilkyWay好狠啊(小声) \(Description\) 有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的 ...

  5. BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...

  6. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

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

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

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

随机推荐

  1. EasyUi TreeGrid/DataGrid getChecked BUG

    问题描述 步骤一,选中左边树一个节点,然后出现相应的数据,选中进行保存.如,我选中了前4个节点,上图: 步骤二,我再选tree中第二个节点,进行相应的选中和取消选中treegrid中的节点,并保存. ...

  2. 射线与平面的相交检测(Ray-Plane intersection test)【转】

    射线的定义 在欧几里德几何中,射线的定义是:直线上一点和它一旁的部分.由此可知,射线有两个性质,一是只有一个端点,二是一端无限延伸. 射线的参数方程 其中p0是射线的起点, u是射线的方向向量,t & ...

  3. [ASP.NET]uploadify简单使用讲解

    背景:在用户控件中使用html 的file控件或者ASP.NET的FileUpLoad控件都无法获取到文件,于是想到听说过的uploadify uploadify官网:www.uploadify.co ...

  4. C# 代码风格要求

    一个.cs源文件至多定义两个类型 所有命名空间.类型名称使用Pascal风格(单词首字母大写),私有方法.受保护方法,仍使用Pascal风格命名 本地变量.方法参数名称使用Camel风格(首字母小写, ...

  5. Asp.Net Web Api中使用Swagger

    关于swagger 设计是API开发的基础.Swagger使API设计变得轻而易举,为开发人员.架构师和产品所有者提供了易于使用的工具. 官方网址:https://swagger.io/solutio ...

  6. CentOS 7 - 安装Windows字体!

    1,安装cabextract: 下载地址:http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/cabe ...

  7. jzoj5928

    tj:題解裡公式是錯的 我們可以考慮每一個節點[a,a+2^b-1]對答案的貢獻 則當這個節點是左兒子時,貢獻為2^b 是右兒子時,貢獻為2n−a−2b+12^n-a-2^b+12n−a−2b+1 左 ...

  8. Django(出版社功能)

    day62 day62 2018-05-02  1. 内容回顾     Django         1. 安装             1. Django版本 1.11.xx            ...

  9. hdoj1435 Stable Match(稳定婚姻问题)

    简单稳定婚姻问题. 题目描述不够全面,当距离相同时容量大的优先选择. 稳定婚姻问题不存在无解情况. #include<iostream> #include<cstring> # ...

  10. 向 webview 添加 userScript

    添加前,网页代码如下: <!DOCTYPE html> <html> <!--<script type="text/javascript"> ...