【JZOJ6223】【20190617】互膜
题目
小\(A\)和小\(B\)在一个长度为\(2n\)的数组上面博弈,初始时奇数位置为A,偶数位置为B
小\(A\)先手,第\(i\)次操作的人可以将\(i\)或者\(i+1\)位置的值反转(也可以不做任何操作)
\(n-1\)次操作结束后,小\(A\)得分为所有\(A\)位置的权值和,小\(B\)同理
每次会把一个权值改小,询问每次小A得到的和
$n \le 200000 $,权值为非负数
题解
设\(f_{i,0/1}\)表示从\(i\)位置向后考虑,\(i\)位置有没有反转,当前操作的人和另一个人得分差值的最大值
\[\begin{align}
&\begin{cases}
f_{i,0} \ &= \ max \{ s_i - f_{i+1,0} , s_i - f_{i+1,1} \} \\
f_{i,1} \ &= \ max \{ s_i - f_{i+1,0} ,-s_i - f_{i+1,1} \} \\
\end{cases}\\
&设\Delta _i = f_{i,0} - f_{i,1} \\
&由于s_i\ge 0 显然\Delta_i \ge 0\\
&\begin{cases}
f_{i,0} \ &= s_i - f_{i+1,1} \\
f_{i,1} \ &= max \{ 2s_i - \Delta_{i+1} , 0 \} - s_i - f_{i+1,1} \\
\Delta_i\ &= min \{ 2s_i , \Delta_{i+1} \}
\end{cases}\\
&\Delta_n=2s_n 维护 \Delta_i 也就是对2s_i 取后缀min \\
&f_{1,0} = \sum_{i=1}^{n}(-1)^{i-1}s_i + \sum_{i=2}^{n} (-1)^i \Delta_{i} \\
\end{align}
\]维护后缀\(min\)值只有改小的话可以在线段树上先二分再修改,时间复杂度\(O(n \ log \ n)\)
没有这个条件可以用线段树维护从前往后递增的单调栈
具体来说每段区间维护最小值\(mn\)和区间答案\(sum\)
考虑当前区间\(K\)的左右儿子为\(L,R\),左儿子\(L\)的左右儿子为\(l,r\)
如果 $mn_{R} \lt mn_{r} $ ,右区间的贡献都为\(mn_R\),直接统计,并递归\(l\)
如果 $ mn_R \ge mn_r $ ,记录$ add_K \(表示用\)K\(的左儿子的mn走右儿子的答案,直接统计\)add_K \(并递归\)r$
时间复杂度:$O(n \log ^2n ) $
#include<bits/stdc++.h>
#define ll long long
#define ls (k<<1)
#define rs (k<<1|1) using namespace std; char gc(){
static char*p1,*p2,s[1000000];
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
return x;
} const int N=200010;
int n,m,s[N];
ll tmp,Mn,mn[N<<2],sum[N<<2],add[N<<2],ans; ll sg(int l,int r,int x){return ((r-l)&1)?0:l&1?-x:x;}
void mfy(int k,int l){mn[k]=s[l];sum[k]=l&1?-s[l]:s[l];}
void cal(int k,int l,int r){
if(l==r){tmp+=sg(l,r,min(Mn,mn[k]));return;}
int mid=(l+r)>>1;
if(Mn<mn[rs])tmp+=sg(mid+1,r,Mn),cal(ls,l,mid);
else tmp+=add[k],cal(rs,mid+1,r);
}
void pushup(int k,int l,int r){
mn[k]=min(mn[ls],mn[rs]);
int mid=(l+r)>>1;
tmp=0;Mn=mn[rs];
cal(ls,l,mid);
sum[k]=sum[rs]+(add[k]=tmp);
}
void build(int k,int l,int r){
if(l==r){mfy(k,l);return;}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(k,l,r);
}
void update(int k,int l,int r,int x){
if(l==r){mfy(k,l);return;}
int mid=(l+r)>>1;
if(x<=mid)update(ls,l,mid,x);
else update(rs,mid+1,r,x);
pushup(k,l,r);
}
int main(){
freopen("flip.in","r",stdin);
freopen("flip.out","w",stdout);
n=rd();
for(int i=1;i<=n;++i){s[i]=rd();if(i&1)ans+=s[i];}
build(1,2,n);
printf("%lld\n",ans+sum[1]);
m=rd();
for(int i=1;i<=m;++i){
int x=rd(),y=rd();
if(x&1)ans-=s[x];
s[x]-=y;if(x&1)ans+=s[x];
if(x>1)update(1,2,n,x);
printf("%lld\n",ans+sum[1]);
}
return 0;
}
【JZOJ6223】【20190617】互膜的更多相关文章
- thusc2016游记&&滚粗记&&酱油记
#include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...
- NOIP2016呵呵记
经过了一年的想象和臆测,经历了学长们的几次考试,通过老师的言语莫名感受过了所谓oi式压力之后,自己的考试也终于到来了. 考前的生活也没有想象中的那么充实,无非跟着神犇刷刷题,讨论算法,学点新技巧,然后 ...
- 出题人的RP值(牛客练习赛38--A题)(排序)
链接:https://ac.nowcoder.com/acm/contest/358/A来源:牛客网 题目描述 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而 ...
- Before NOIP 2018
目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...
- thusc2018酱油记
day-1 打点行囊,从学校出发去火车站 day0 在火车上一觉醒来便快到了北京,直接前往了宾馆安置 下午报道,一脸向往地第一次走入清华园,感觉十分的梦幻,心里一直喃喃:"希望以后也能经常在 ...
- A.出题人的RP值
链接:https://ac.nowcoder.com/acm/contest/358/A 题意: 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而当你膜别人时, ...
- CSP-S 2019 游记
目录 CSP-S 2019 游记 DAY -1 Day 0 Day 1 Day 2 后记 CSP-S 2019 游记 机房段子: zr(老师):yyx我看你最近不错哦(此人外号拳皇 yyx:运气好运气 ...
- 【杂文】NOIP2018 蒟蒻自闭记
[杂文]NOIP2018 蒟蒻自闭记 都 \(9102\) 年了,谁还记得 \(2018\) 年的事啊 \(QAQ\) . 还有两个月就要去参加首届 \(CSP\) 了. 想着如果再不记下去年那些事儿 ...
- PHP实现中文简体字和繁体字互转
function convert($str, $action='S'){ if($action != 'S' && $action != 'T'){ return $str; } $s ...
随机推荐
- docker stack 部署 mssql
=============================================== 2019/12/8_第1次修改 ccb_warlock == ...
- Java单元测试 Http Server Mock框架选型
背景动机 某期优化需要针对通用的HttpClient封装组件--HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点: apache http client 版本升级 H ...
- 应用中有多个Spring Property PlaceHolder导致@Value只能获取到默认值
背景 工作中负责的一套计费系统需要开发一个新通知功能,在扣费等事件触发后发送MQ,然后消费MQ发送邮件或短信通知给客户.因为有多套环境,测试时需要知道是从哪套环境发出的邮件,又不想维护多套通知模板,因 ...
- 《JAVA高并发编程详解》-程序可能出现死锁的场景
- 阿里巴巴 Java 开发手册 (八) 注释规约
1. [强制]类.类属性.类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 //xxx 方式. 说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Ja ...
- JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优
一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 - ...
- Sqlmap注入工具
Sqlmap注入工具 http://sqlmap.org/ Sqlmap是国外的一个免费的注入工具,基于python开发,支持现在几乎所有的数据库,支持get.post.cookie注入,可以添加co ...
- Matlab迭代器模式
迭代器(Iterator)模式,又叫做游标(Cursor)模式.提供一种方法访问一个容器(container)或者聚集(Aggregator)对象中各个元素,而又不需暴露该对象的内部细节.在采用不同的 ...
- log4j使用指北
背景 工作一直使用日志组件,但是配置却一直看的糊里糊涂的,只记得个日志级别,其他的都不太理解,例如,一个页面日志太多,怎么样能单独打印?所以就找机会整理了一下. 本文参考:https://www.cn ...
- JQuey中ready()的4种写法
在jQuery中,对于ready()方法,共有4种写法: (1)写法一: $(document).ready(functin(){ //代码部分 }) 分析:这种代码形式是最常见的,其中$(docum ...