\(\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. 基于ShardingJDBC的分库分表及读写分离整理

    ShardingJDBC的核心流程主要分成六个步骤,分别是:SQL解析->SQL优化->SQL路由->SQL改写->SQL执行->结果归并,流程图如下: sharding ...

  2. vue 前进刷新后退不刷新

    这边是router-view部门的写法: <keep-alive> <router-view v-if="$route.meta.keepAlive"/> ...

  3. POJ prime distance

    https://oj.shiyancang.cn/Problem/781.html 素数距离,数据范围21亿,如果用素数筛存,并且进行做的话,按照x/lnx计算会是一个非常恐怖的复杂度.确定要做什么, ...

  4. CVE-2020-0786(永恒之黑) GetShell

    描述 Microsoft服务器消息块3.1.1(SMBv3)协议处理某些请求的方式中存在一个远程执行代码漏洞,也称为" Windows SMBv3客户端/服务器远程执行代码漏洞". ...

  5. 从AAB文件生成APK文件

    开头先说方法 1.下载 bundletool 2.开始生成 java -jar bundletool.jar build-apks --bundle=[aab文件路径(例如:C:\Users\Admi ...

  6. day5 数组对角线及最大值

    1.输出M行M列数组方针,求对角线元素和#define M 5void fun(int xx[][M], int n)//n行n列{ int i = 0; int sum = 0; for (i = ...

  7. MacBookPro2021 M1-MAX电脑问题锦集

    MacBook2021 M1-MAXPro电脑问题锦集 问题1: 开启硬盘加密,开机闪屏 问题详述: 在系统偏好设置中,打开安全与隐私,在弹出窗口中切换到第二个页签(文件保险箱),启用文件保险箱功能, ...

  8. 【机器学习】VAE

    机器学习算法-VAE 目录 机器学习算法-VAE 1. VAE模型推导 1.1 算法引入 1.2 模型推导 1.3 损失函数 1.4 重参数技巧 2. 实现 2.1 模型定义 2.2 实验 1. VA ...

  9. C++构造函数语义学(三)(基于C++对象模型)

    带有虚基类的情况. 1 #include<iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 int i; 7 }; 8 ...

  10. java 多线程 start方法 run方法 简单介绍。

    一 start开启一个多线程, run 只是一个内部的方法. package com.aaa.threaddemo; /* * start方法的作用? * 在 Java中启动多线程调用的是start方 ...