首页 > 其他分享 >ARC126E 做题记录

ARC126E 做题记录

时间:2024-04-03 09:34:54浏览次数:12  
标签:le frac 记录 ll ARC126E maxn 操作 define

link

只需要手玩 + 大力猜就能做的题。

我们可以猜测:选择两个数操作,一定把他们变成两者的平均数。这个结论的可信度非常大。

设 \(g(a_1,a_2,...,a_n)\) 表示 \(a_{1...n}\) 的答案。

我们不妨先尝试点简单的,对于两个数 \(x,y\),钦定 \(x\le y\),显然有 \(g(x,y)=\dfrac {y-x}2\)。

对于三个数 \(x,x,y(x\le y)\),我们选择任意一个 \(x\) 与 \(y\) 操作一遍,变为 \(x,\dfrac {x+y}2,\dfrac{x+y}2\),则 \(g(x,x,y)=\frac {y-x}2 +g(x,\frac {x+y}2,\frac {x+y}2)\)。操作有对称性,所以 \(g(x,\frac {x+y}2,\frac {x+y}2)=g(\frac {x+y}2,\frac{x+y}2,y)=g(\frac{x+y}2,y,y)\)。

设 \(h_0(d)=g(x,x+d,x+d)\),则 \(h_0(d)=\frac 12 d+h_0(\frac d2)\),极限取到 \(h_0(d)=d\)。

对于三个数 \(x,y,z(x\le y\le z)\),我们有三种方法:

  • 先操作 \(x,z\),变为 \(g(\frac{x+z}2, \frac{x+z}2,y)\)。

  • 先操作 \(x,y\),变为 \(g(\frac{x+y}2, \frac{x+y}2,z)\)。

  • 先操作 \(y,z\),变为 \(g(\frac{y+z}2, \frac{y+z}2,x)\)。

我们计算一下,三种的得分分别是 \(\frac{z-x}2+|\frac{x+z}2-y|,\space z-x,\space z-x\),容易发现前者一定不优于后两者,猜测存在一种最优策略,每次只操作相邻的数字。

后面两种方法的得分相同,猜测相邻数字的操作顺序对答案没有影响。

对于 \(x,x,y,y(x\le y)\),根据上面猜的结论,我们先操作一对 \((x,y)\),得到两个 \(\frac{x+y}2\)。然后再把操作后得到的两个数分别与另外两个数操作,那么 \(g(x,x,y,y)=y-x+g(x+\frac{x+y}4,x+\frac{x+y}4,y-\frac{x+y}4,y-\frac{x+y}4)\)。

设 \(h_1(d)=g(x,x,x+d,x+d)\),则 \(h_1(d)=d+h_1(\frac d2)\),极限取到 \(h_1(d)=2d\)。

对于 \(x,y,y,y(x\le y)\),我们操作一对 \((x,y)\),得到 \(g(x,y,y,y)=\frac {y-x}2+g(\frac{x+y}2,\frac{x+y}2,y,y)=\frac {3(y-x)}2\)。

我们猜测:有 \(n\) 个 \(x\) 和 \(m\) 个 \(y\),且 \(x\le y\),答案为 \(nm\cdot\frac{y-x}2\)。

维护一棵动态开点线段树,每次左右儿子合并时,视为左右边所有数都变成了各自的平均数,然后根据上面的结论计算即可,时间复杂度 \(O(n\log V)\)。

  • 启示:

遇到没有切入点的题目,考虑手玩一下简单的情况,不要畏难,一定可以的!

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pir pair<ll,ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn=3e5+10, mod=998244353, M=1e9;
ll n,m,sum[maxn*60],res[maxn*60],inv[maxn],tot,lc[maxn*60],rc[maxn*60],cnt[maxn*60],a[maxn],rt;
void modify(ll &p,ll l,ll r,ll x,ll v){
	if(!p) p=++tot;
	if(l==r){
		cnt[p]+=v;
		sum[p]+=x*v; sum[p]%=mod;
		return;
	} ll mid=l+r>>1;
	if(x<=mid) modify(lc[p],l,mid,x,v);
	else modify(rc[p],mid+1,r,x,v);
	sum[p]=(sum[lc[p]]+sum[rc[p]])%mod, cnt[p]=cnt[lc[p]]+cnt[rc[p]];
	res[p]=(res[lc[p]]+res[rc[p]]+cnt[rc[p]]%mod*cnt[lc[p]]%mod*(sum[rc[p]]*
	inv[cnt[rc[p]]]%mod-sum[lc[p]]*inv[cnt[lc[p]]]%mod))%mod;
}
int main(){
	scanf("%lld%lld",&n,&m);
	inv[1]=1;
	for(ll i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	for(ll i=1,x;i<=n;i++){
		scanf("%lld",&x); modify(rt,1,M,x,1); a[i]=x;
	}
	while(m--){
		ll x,y; scanf("%lld%lld",&x,&y);
		modify(rt,1,M,a[x],-1);
		modify(rt,1,M,y,1); a[x]=y;
		printf("%lld\n",(res[rt]+mod)*inv[2]%mod);
	}
	return 0;
}

标签:le,frac,记录,ll,ARC126E,maxn,操作,define
From: https://www.cnblogs.com/Sktn0089/p/18111946

相关文章

  • wsl2折腾记录
    相关issuemirror镜像模式失效:https://github.com/microsoft/WSL/issues/10632wsl2设置桥接网络或镜像网络,解决服务互通访问的问题https://zhuanlan.zhihu.com/p/659074950新版本下如何通过外部网络访问wslhttps://zhuanlan.zhihu.com/p/672297125wsl配置https://learn.micr......
  • SQL相关笔记-不常用 容易忘记的一些语法规则记录
    1.查下表中只有一条的数据SELECTuserId,count(userId)FROM表名GROUPbyuserId2. 根据userId去重selectdistinctuserIdfrom表名3.查询数据库中含有某个字段的所有表名selectDISTINCTTABLE_NAMEfrominformation_schema.`COLUMNS` whereTABLE_SCHEMA='数......
  • HWOD:记录正负数
    一、知识点1、scanf()的返回值scanf()返回值类型为int,返回转换成功的个数有代码int temp;  scanf("%d",&temp);在屏幕输入一个数字,比如5,回车,scanf()返回1在屏幕输入一个字符或字符串,比如h或helloworld,回车,scanf()返回0,表示转换失败2、结束scanf()的不定数量读取基......
  • 01-​JVM学习记录-类加载器
     一、类加载器子系统1.作用-运输工具(快递员)负责从文件系统或者网络中加载Class文件(DNA元数据模板),Class文件开头有特定标识,魔术,咖啡杯壁(class文件存于本地硬盘,JVM根据class实例化)DNA元数据模板Classloader只负责class文件的加载,至于是否可运行,则由执行引擎决定加载的......
  • 3.30 模拟赛 T3 记录
    题面首先先可以发现对于限制\(\min_{i\in[l,r]}a_i\leqr-l+1\),的任意一个右端点,能贡献的\(l\)肯定是一个可以确定的前缀,这一部分可以用单调队列提前预处理出每个前缀记为\(pre_i\)。同理对于任意一个左端点也对应可以转移到一个确定的后缀,也预处理出来记为\(nxt_i\)。......
  • vim 使用记录
    记录vim使用和学习中用到的一些命令1.设置vim行号echo"setnumber">>~/.vimrcsource~/.vimrc2.vim跳到最后一行 在Vim中跳转到文件的最后一行,你可以按下Shift+G快捷键。这会将光标移动到文件的最后一行。如果你在正常模式下,也可以使用:命令加上行号:......
  • Vue2 和 Vue3 中的 v-model 的区别#记录
    vue3对v-model的语法进行了改动。vue2中有两种方式实现数据的双向绑定(组件与外部数据的双向绑定),一种是使用v-model,另一种是使用v-bind.sync修饰符。vue2中的v-model,主要是进行value属性的绑定和input事件的派发。<ChildComponentv-model="pageTitle"/>//等价于<Child......
  • FLASK学习记录-Flask-SQLAichemy
    Flask-SQLAichemy连接常用数据库 以sqlite3为例:建库建表:#!/usr/bin/pythonfromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromsqlalchemyimportand_,or_importsqlite3app=Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI']='sql......
  • 蓝桥杯真题代码记录(松散子序列
    目录1.题目:2.我的代码:小结:1.题目:给定一个仅含小写字母的字符串s,假设s的一个子序列t的第i个字符对应了原字符串中的第pi个字符。我们定义s的一个松散子序列为:对于i>1总是有pi−pi−1≥2。设一个子序列的价值为其包含的每个字符的价值之和......
  • 【Azure Function & Application Insights】调用Function上传和下载文件,有时候遇见大
    问题描述在FunctionApp中配置了无代码模式的ApplicationInsights,但有时候发现,超过1MB的文件上传/下载操作成功。但是在ApplicationInsights中,却没有发现请求日志?这是一种什么情况呢? 问题解答ApplicationInsights 是具有采样功能的,当传入执行的速率超过指定的阈值时,Appl......