题目

小\(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】互膜的更多相关文章

  1. thusc2016游记&&滚粗记&&酱油记

    #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...

  2. NOIP2016呵呵记

    经过了一年的想象和臆测,经历了学长们的几次考试,通过老师的言语莫名感受过了所谓oi式压力之后,自己的考试也终于到来了. 考前的生活也没有想象中的那么充实,无非跟着神犇刷刷题,讨论算法,学点新技巧,然后 ...

  3. 出题人的RP值(牛客练习赛38--A题)(排序)

    链接:https://ac.nowcoder.com/acm/contest/358/A来源:牛客网 题目描述 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而 ...

  4. Before NOIP 2018

    目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...

  5. thusc2018酱油记

    day-1 打点行囊,从学校出发去火车站 day0 在火车上一觉醒来便快到了北京,直接前往了宾馆安置 下午报道,一脸向往地第一次走入清华园,感觉十分的梦幻,心里一直喃喃:"希望以后也能经常在 ...

  6. A.出题人的RP值

    链接:https://ac.nowcoder.com/acm/contest/358/A 题意: 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而当你膜别人时, ...

  7. CSP-S 2019 游记

    目录 CSP-S 2019 游记 DAY -1 Day 0 Day 1 Day 2 后记 CSP-S 2019 游记 机房段子: zr(老师):yyx我看你最近不错哦(此人外号拳皇 yyx:运气好运气 ...

  8. 【杂文】NOIP2018 蒟蒻自闭记

    [杂文]NOIP2018 蒟蒻自闭记 都 \(9102\) 年了,谁还记得 \(2018\) 年的事啊 \(QAQ\) . 还有两个月就要去参加首届 \(CSP\) 了. 想着如果再不记下去年那些事儿 ...

  9. PHP实现中文简体字和繁体字互转

    function convert($str, $action='S'){ if($action != 'S' && $action != 'T'){ return $str; } $s ...

随机推荐

  1. 软件测试人员必备的Python知识图库

    UI自动化测试(Python+Selenium等) 接口测试(Python requests等) 性能测试(Python Locust等) 安全性测试(Python Scapy等) 兼容性测试(Pyt ...

  2. CentOS7.6离线安装docker

    2019/10/24,docker 摘要:CentOS 7.6中离线安装docker 18.06.3以及docker-compose 1.24.1 在线安装可参照 文档 所需环境 1.CentOS 7 ...

  3. Ubuntu中安装(升级)GraphicsMagick

    1 前言 采用官方下载安装包然后强制安装升级Ubuntu中有的老版本gmagick-1.3.28,升级到gmagick-1.3.31 仅用来记录使用. 2.准备工作 1.下载安装包 https://s ...

  4. Java自学-数组 初始化数组

    Java 如何初始化数组 步骤 1 : 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { i ...

  5. 【开发笔记】- 发送邮件(通过JavaMail发送)

    前段时间在工作中用到了邮件发送监控的报警信息,今天在这个记录一下JavaMail的邮件工具类. 下边为用到的JavaMail的jar包的pom依赖.这里用的是JavaMail的1.4.6的版本. &l ...

  6. python day 14: 作业:开发一个能够多用户上传文件的FTP脚本

    目录 python day 14 1. 要求 2. 自己写的程序目录 3. models模块 4. settings模块 5. tcp_server模块 6. client模块 7. 后记 pytho ...

  7. 溢出处理、盒子模型、背景图片、float(浮动)

    一.overflow:溢出内容的处理     overflow:hidden;  溢出内容隐藏(在父元素内使用,可以清除子元素浮动对父元素的影响)    overflow:auto; 自动滚动(有溢出 ...

  8. 重启Kubernetes Pod的几种方式

    方法1 kubectl scale deployment XXXX --replicas=0 -n {namespace} kubectl scale deployment XXXX --replic ...

  9. ora121 tips

    1. 900929 - Linux: STORAGE_PARAMETERS_WRONG_SET and "mmap() failed" Solution Increase the ...

  10. 工厂交接班易出问题?MES系统实现精准对接

    工厂交接班制度非常的严格和复杂,而MES系统能让繁琐的交接班流程简单快捷无措.MES系统在发生事件时记录传递事件,还可以主动对事件进行分类和报告.人员可以查看和深入到以前或当前班次的个别事件. 随着工 ...