题目

好厉害的题啊

这道题不难看成一个二分图模型,但是给人一种求最大匹配的感觉,这实在不是很好求的样子,于是自闭了

但是不妨这样来考虑,对于一个需求\(k_i\),我们求一个最大的\(x\leq k_i\),使得这张图存在完美匹配就好了,这样我们就能愉快的使用hall定理了

我们把所有区间排个序,由于保证了没有包含关系,所以左、右端点都是单调的;

众所周知hall定理要求的是子集,但子集显然不是很好求的样子;而这个题的特殊性质可以使我们只考虑区间的情况,至于为什么,还是比较显然的。

设第\(i\)次实际上丢掉了\(b_i\)个石子,那么为了存在完美匹配,需要时刻满足\(\sum_{i=l}^rb_i\leq \sum_{i=fl[l]}^{fr[r]}a_i\),利用前缀和把这个狮子打开,即\(B_r-B_{l-1}\leq A_{fr[r]}-A_{fl[l]-1}\),即\(B_r-A_{fr[r]}\leq B_{l-1}-A_{fl[l]-1}\)

假设第\(i\)操作排序之后在第\(j\)个位置,那么我们如果要使得这次操作丢出\(x\)个石子,必须满足\(\forall k\geq j,t< j,B_{k}+x-A_{fr[k]}\leq B_t-A_{fl[t]-1}\),即\(x\leq \min(B_t-A_{fl[t]-1})-\max(B_{k}-A_{fr[k]})\)

于是我们维护两棵线段树,支持后缀min,前缀max以及区间加就好了

代码

#include<bits/stdc++.h>
#define re register
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=5e4+5;
struct Node{int l,r,t;}q[maxn];
inline int cmp(const Node A,const Node B) {return A.l<B.l;}
int n,X,Y,Z,P,c[maxn],b[maxn],A[maxn],pre[maxn],m,K[maxn],ti[maxn],cnt,G[maxn];
inline int max(int a,int b) {return a>b?a:b;}
inline int min(int a,int b) {return a<b?a:b;}
struct Segment_Tree {
int l[maxn<<2],r[maxn<<2],mx[maxn<<2],mn[maxn<<2],tag[maxn<<2];
inline void add(int v,int i) {tag[i]+=v;mx[i]+=v,mn[i]+=v;}
inline void pushup(int i) {
mx[i]=max(mx[i<<1],mx[i<<1|1]);
mn[i]=min(mn[i<<1],mn[i<<1|1]);
}
inline void pushdown(int i) {
if(!tag[i]) return;
add(tag[i],i<<1);add(tag[i],i<<1|1);tag[i]=0;
}
void build(int x,int y,int i) {
l[i]=x,r[i]=y;
if(x==y) {
mx[i]=mn[i]=G[x];
return;
}
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
pushup(i);
}
void change(int x,int y,int v,int i) {
if(x<=l[i]&&y>=r[i]) {add(v,i);return;}
pushdown(i);int mid=l[i]+r[i]>>1;
if(x<=mid) change(x,y,v,i<<1);
if(y>mid) change(x,y,v,i<<1|1);
pushup(i);
}
int query_mn(int x,int y,int i) {
if(x<=l[i]&&y>=r[i]) return mn[i];
pushdown(i);int mid=l[i]+r[i]>>1;
if(y<=mid) return query_mn(x,y,i<<1);
if(x>mid) return query_mn(x,y,i<<1|1);
return min(query_mn(x,y,i<<1),query_mn(x,y,i<<1|1));
}
int query_mx(int x,int y,int i) {
if(x<=l[i]&&y>=r[i]) return mx[i];
pushdown(i);int mid=l[i]+r[i]>>1;
if(y<=mid) return query_mx(x,y,i<<1);
if(x>mid) return query_mx(x,y,i<<1|1);
return max(query_mx(x,y,i<<1),query_mx(x,y,i<<1|1));
}
}T[2];
int main() {
n=read(),X=read(),Y=read(),Z=read(),P=read();
for(re long long i=1;i<=n;i++)
A[i]=(1ll*(i-X)*(i-X)%P+1ll*(i-Y)*(i-Y)%P+1ll*(i-Z)*(i-Z)%P)%P;
m=read(),K[1]=read(),K[2]=read(),X=read(),Y=read(),Z=read(),P=read();
for(re int i=3;i<=m;i++) K[i]=(1ll*K[i-1]*X%P+1ll*K[i-2]*Y%P+Z)%P;
for(re int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].t=i;
if(!m) return 0;
std::sort(q+1,q+m+1,cmp);
for(re int i=1;i<=m;i++) c[q[i].l]++,c[q[i].r+1]--,ti[q[i].t]=i;
for(re int i=1;i<=n;i++) {
c[i]+=c[i-1];
if(c[i]) b[++cnt]=i;
}
for(re int i=1;i<=cnt;i++) pre[i]=pre[i-1]+A[b[i]];
for(re int i=1;i<=m;i++)
q[i].l=std::lower_bound(b+1,b+cnt+1,q[i].l)-b,q[i].r=std::lower_bound(b+1,b+cnt+1,q[i].r)-b;
for(re int i=1;i<=m;i++) G[i]=-pre[q[i].r];T[0].build(1,m,1);
for(re int i=0;i<m;i++) G[i]=-pre[q[i+1].l-1];T[1].build(0,m-1,1);
for(re int i=1;i<=m;i++) {
int x=ti[i],nw;
nw=T[1].query_mn(0,x-1,1)-T[0].query_mx(x,m,1);
nw=min(K[i],nw);
T[0].change(x,m,nw,1);T[1].change(x,m-1,nw,1);
printf("%d\n",nw);
}
}

【BZOJ2138】stone的更多相关文章

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

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

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

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

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

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

  4. 【LeetCode】动态规划(下篇共39题)

    [600] Non-negative Integers without Consecutive Ones [629] K Inverse Pairs Array [638] Shopping Offe ...

  5. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  6. 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)

    [题目] Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2, ...

  7. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. 【POJ1113】Wall(凸包)

    [题目] Description Once upon a time there was a greedy King who ordered his chief Architect to build a ...

  9. 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶

    虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...

随机推荐

  1. BUUCTF--刮开有奖

    文件链接:https://buuoj.cn/files/abe6e2152471e1e1cbd9e5c0cae95d29/8f80610b-8701-4c7f-ad60-63861a558a5b.ex ...

  2. 【学习总结】GirlsInAI ML-diary day-20-初识 Kaggle

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day20 初识kaggle 1-注册一个账号(由于被谷歌收购,因此可能需要梯子) 2-Competition - 学会看一 ...

  3. web笔记全

    1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...

  4. 廖雪峰Python电子书总结

    函数 1.注意:函数的默认参数必须指向不可变对象 未修改前: def add_end(L=[]): L.append('END') return L 存在的问题:如果连续调用多次,会出现多个 'END ...

  5. 源码分析--HashMap(JDK1.8)

    在JDK1.8中对HashMap的底层实现做了修改.本篇对HashMap源码从核心成员变量到常用方法进行分析. HashMap数据结构如下: 先看成员变量: 1.底层存放数据的是Node<K,V ...

  6. 解析天启rk3288源码 /kernel/drivers/char/virtd

    virtd为编译后产生的中间文件,可使用ELF格式逆向 1.ELF文件内容解析readelf: 可解析ELF文件的所有内容;strings: 查看ELF文件中的字符串;file   : 查看ELF文件 ...

  7. vue+element-ui 实现分页(根据el-table内容变换的分页)

    官方例子 官方提示: 设置layout,表示需要显示的内容,用逗号分隔,布局元素会依次显示.prev表示上一页,next为下一页,pager表示页码列表,除此以外还提供了jumper和total,si ...

  8. win7系统下IIS7.5配置MVC5环境注意事项与CentOS的MVC5设置

    注意事项: 1.IIS程序应用池更换为4.0net集成 2.网站目录加入IIS帐号的权限(基本设置里是administrators组帐号)注:服务器拒绝时是这里的问题 3.在“ISAPI和CGI限制” ...

  9. instanceof是Java的一个二元操作符(运算符)

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  10. note2