\(\mathcal{Description}\)

  Link.

  给定序列 \(\{a_n\}\),定义一次操作为:

  • 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R_+\),使得 \(a_i+x\le a_j-x\);
  • 令 \(a_i\leftarrow a_i+x,a_j\leftarrow a_j-x\),本次操作的得分为 \(x\)。

  定义序列的得分为进行任意次操作能得到的最大得分和,现给定 \(m\) 次形如 \(a_x\leftarrow y\) 的修改操作,在每次修改操作后求出当前序列的得分。

\(\mathcal{Solution}\)

  定义序列的势能 \(\Phi=\sum_{i<j}|a_i-a_j|\),设进行一次操作后得到新势能 \(\Phi'\),显然有 \(\Phi'-\Phi\le-2x\),其中 \(x\) 即操作时所选取的正数。同时,取等条件容易看出为 \(\not\exist a_k,a_k\in(a_i,a_j)\),由此,又能得到只要 \(\Phi>0\),我们必然能以势能减少 \(2x\) 的代价增加 \(x\) 分。所以答案就是 \(\frac{\Phi}{2}\)。

  选用平衡树来动态维护 \(\Phi\) 即可支持修改。复杂度 \(\mathcal O((n+m)\log n)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL; const int MAXN = 6e5, MOD = 998244353, INV2 = 499122177;
int n, m, root, a[MAXN + 5]; inline int mul( const int u, const int v ) { return 1ll * u * v % MOD; }
inline int sub( int u, const int v ) { return ( u -= v ) < 0 ? u + MOD : u; }
inline int add( int u, const int v ) { return ( u += v ) < MOD ? u : u - MOD; } struct Treap {
int node, root, ch[MAXN + 5][2], aux[MAXN + 5], val[MAXN + 5];
int siz[MAXN + 5], sum[MAXN + 5];
Treap() { srand( 20120712 ); } inline int newnd( const int v ) {
++node, aux[node] = rand(), sum[node] = val[node] = v, siz[node] = 1;
return node;
} inline void pushup( const int u ) {
siz[u] = siz[ch[u][0]] + siz[ch[u][1]] + 1;
sum[u] = add( add( sum[ch[u][0]], sum[ch[u][1]] ), val[u] );
} inline int merge( const int u, const int v ) {
if ( !u || !v ) return u | v;
if ( aux[u] < aux[v] ) {
return ch[u][1] = merge( ch[u][1], v ), pushup( u ), u;
} else {
return ch[v][0] = merge( u, ch[v][0] ), pushup( v ), v;
}
} inline void vsplit( const int u, const int k, int& x, int& y ) {
if ( !u ) return void( x = y = u );
if ( val[u] <= k ) vsplit( ch[u][1], k, ch[x = u][1], y ), pushup( x );
else vsplit( ch[u][0], k, x, ch[y = u][0] ), pushup( y );
} inline int erase( const int v ) {
int x, y, z; vsplit( root, v, x, z );
int ret = add( sub( mul( sub( siz[x], siz[z] ), v ), sum[x] ), sum[z]);
vsplit( x, v - 1, x, y ), y = merge( ch[y][0], ch[y][1] );
return root = merge( x, merge( y, z ) ), ret;
} inline int insert( const int v ) {
int x, y = newnd( v ), z; vsplit( root, v, x, z );
int ret = add( sub( mul( sub( siz[x], siz[z] ), v ), sum[x] ), sum[z]);
return root = merge( x, merge( y, z ) ), ret;
}
} trp; int main() {
scanf( "%d %d", &n, &m );
int ans = 0;
rep ( i, 1, n ) scanf( "%d", &a[i] ), ans = add( ans, trp.insert( a[i] ) );
for ( int x, v; m--; ) {
scanf( "%d %d", &x, &v );
ans = sub( ans, trp.erase( a[x] ) );
ans = add( ans, trp.insert( a[x] = v ) );
printf( "%d\n", mul( ans, INV2 ) );
}
return 0;
}

Solution -「ARC 126E」Infinite Operations的更多相关文章

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. Solution -「ARC 101D」「AT4353」Robots and Exits

    \(\mathcal{Description}\)   Link.   有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...

  3. Solution -「ARC 110D」Binomial Coefficient is Fun

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...

  4. Solution -「ARC 124E」Pass to Next

    \(\mathcal{Description}\)   Link.   有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...

  5. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  6. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  7. Solution -「ARC 125E」Snack

    \(\mathcal{Description}\)   Link.   把 \(n\) 种零食分给 \(m\) 个人,第 \(i\) 种零食有 \(a_i\) 个:第 \(i\) 个人得到同种零食数量 ...

  8. Solution -「ARC 058C」「AT 1975」Iroha and Haiku

    \(\mathcal{Description}\)   Link.   称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...

  9. Solution -「ARC 101E」「AT 4352」Ribbons on Tree

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,其中 \(2|n\),你需要把这些点两两配对,并把每对点间的路径染色.求使得所有边被染色的方案数 ...

随机推荐

  1. react将HTML字符串解析为HTML标签

    当后台返回的数据是字符串html的话,我们可以利用dangerouslySetInnerHTML属性来把字符串转换成html标签 function showhtml(htmlString){ var ...

  2. sqoop的使用之import导入到HDFS

    原文链接: https://www.toutiao.com/i6772128429614563843/ 首先我们已经安装好sqoop了,如果没有安装好参考文档<快速搭建CDH-Hadoop-Hi ...

  3. asp.net core 中优雅的进行响应包装

    目录 摘要 正常响应/模型验证错误包装 实现按需禁用包装 如何让 Swagger 识别正确的响应包装 禁用默认的模型验证错误包装 使用方法以及自定义返回结构体 SourceCode && ...

  4. Allwinner F1C100s coremark测试

    ccu register base:0x01c20000 devmem 0x01c20000 The PLL output=(24MHz*N*K)/(M*P) N=31 K=1 M=1 P=/1 re ...

  5. css3中transition属性详解

    css3中通过transition属性可以实现一些简单的动画过渡效果~ 1.语法 transition: property duration timing-function delay; transi ...

  6. springboot应用中使用CommandLineRunner

    在springboot应用中,存在这样的使用场景,在springboot ioc容器创建好之后根据业务需求先执行一些操作,springboot提供了两个接口可以实现该功能: CommandLineRu ...

  7. day 13 函数指针类型

    (1).有以下程序: 则正确的选项是[B] (A).7 4 (B).4 10 (C).8 8 (D)10 10 分析:主要考求字符串的长度,strlen是专门求字符串长度的函数,但不包含'\0'在内. ...

  8. 备忘录——基于rdlc报表实现打印产品标签

    目录 0. 背景说明 1. 条形码生成 2. 获取产品的小程序码 3. 报表设计器设计标签模版 3.1 为WinForm控件工具箱添加ReportViewer控件 3.2 为VS2019安装RDLC报 ...

  9. Docker 安装与常用命令

    目录 Docker 安装 1)安装 2)启动 3)镜像加速器 Docker 常用命令 1)Docker 进程相关命令 2)Docker 镜像相关命令 docker search:查找镜像仓库中的镜像 ...

  10. jsp标签 formatNumber、formatDate、parseNumber、parseDate的使用

    引用本文的有关标签需要引用对应的标签库 <%--引入格式化动作标签库--%> <%@taglib prefix="fmt" uri="http://ja ...