首页 > 其他分享 >P5044 [IOI2018] meetings 会议 思考--zhengjun

P5044 [IOI2018] meetings 会议 思考--zhengjun

时间:2023-07-14 12:55:32浏览次数:78  
标签:rt IOI2018 return ll -- P5044 int 1ll id

在 NFLS 模拟赛上遇到的,赛后订正过的。

隔了蛮长时间的,总结一下。

  • 首先转化为笛卡尔树上后缀前缀的问题。

  • 然后考虑如何转移,发现转移形如 \(f(x)=\min\{f(x)+C,kx+b\}\) 的形式。

  • 可以直接线段树维护每个点的最优直线,在 update 的时候:

    • 如果 \(f(x)+C\le kx+b\) 恒成立(左右两端点成立即可),区间加
    • 如果 \(f(x)+C\ge kx+b\) 恒成立,区间覆盖
    • 否则递归左右子树

    因为最后修改的位置一定是一段区间,所以复杂度为 \(O(\log n)\)。

代码

#include<bits/stdc++.h>
using namespace std;using ll=long long;const int N=7.5e5+10,K=__lg(N)+2,M=N<<2;const ll INF=1e18;
int n,m,a[N],f[K][N];ll ans[N];struct ops{int l,r,id;};vector<ops>o[N];
struct SegTree{
	ll f[M],g[M],laz[M],tag[M],K[M],B[M];
	void pushup(int rt){f[rt]=f[rt<<1];g[rt]=g[rt<<1|1];}
	void pushadd(int rt,ll x){laz[rt]+=x;f[rt]+=x;g[rt]+=x;}
	void pushcov(int rt,int l,int r,ll k,ll b){laz[rt]=0;tag[rt]=1;K[rt]=k;B[rt]=b;f[rt]=l*k+b;g[rt]=r*k+b;}
	void pushdown(int rt,int l,int mid,int r){
		if(tag[rt])pushcov(rt<<1,l,mid,K[rt],B[rt]),pushcov(rt<<1|1,mid+1,r,K[rt],B[rt]),tag[rt]=0;
		if(laz[rt])pushadd(rt<<1,laz[rt]),pushadd(rt<<1|1,laz[rt]),laz[rt]=0;
	}
	void build(int l=1,int r=n,int rt=1){
		f[rt]=g[rt]=INF;if(l==r)return;int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);
	}
	void update(int L,int R,ll k,ll b,ll x,int l=1,int r=n,int rt=1){
		if(L<=l&&r<=R){
			if(f[rt]+x>=k*l+b&&g[rt]+x>=k*r+b)return pushcov(rt,l,r,k,b);
			if(f[rt]+x<=k*l+b&&g[rt]+x<=k*r+b)return pushadd(rt,x);
		}int mid=(l+r)>>1;pushdown(rt,l,mid,r);
		if(L<=mid)update(L,R,k,b,x,l,mid,rt<<1);if(mid<R)update(L,R,k,b,x,mid+1,r,rt<<1|1);pushup(rt);
	}
	ll query(int x,int l=1,int r=n,int rt=1){
		if(l==r)return f[rt];int mid=(l+r)>>1;pushdown(rt,l,mid,r);
		return x<=mid?query(x,l,mid,rt<<1):query(x,mid+1,r,rt<<1|1);
	}
}A,B;
int Max(int x,int y){return a[x]>a[y]?x:y;}
int find(int l,int r){int k=__lg(r-l+1);return Max(f[k][l],f[k][r-(1<<k)+1]);}
void dfs(int l,int r){
	if(l>r)return;int u=find(l,r);dfs(l,u-1);dfs(u+1,r);
	for(ops x:o[u]){int l=x.l,r=x.r,id=x.id;
		ans[id]=(r-l+1ll)*a[u];
		if(l<u)ans[id]=min(ans[id],B.query(l)+(r-u+1ll)*a[u]);
		if(r>u)ans[id]=min(ans[id],A.query(r)+(u-l+1ll)*a[u]);
	}ll x=0,y=0;if(l<u)x=B.query(l);if(r>u)y=A.query(r);
	A.update(u,r,a[u],x-(u-1ll)*a[u],(u-l+1ll)*a[u]);
	B.update(l,u,-a[u],y+(u+1ll)*a[u],(r-u+1ll)*a[u]);
}
int main(){
	scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[0][i]=i;
	for(int i=1;(1<<i)<=n;i++)for(int j=1;j+(1<<i)-1<=n;j++)f[i][j]=Max(f[i-1][j],f[i-1][j+(1<<i-1)]);
	for(int i=1,l,r;i<=m;i++)scanf("%d%d",&l,&r),l++,r++,o[find(l,r)].push_back({l,r,i});
	A.build();B.build();dfs(1,n);for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

标签:rt,IOI2018,return,ll,--,P5044,int,1ll,id
From: https://www.cnblogs.com/A-zjzj/p/17553407.html

相关文章

  • .NET6 微服务架构实战系列---记录Swaager在分层项目中实体层注释不显示的问题
    一、分层架构Swagger配置问题Dtos在Application类库中,Swagger按照正常配置,只会引用API层的XML文件这个时候我们打开Swagger是看不到实体层注释的二、分层项目Swagger配置2.1首先勾选生成API文档文件2.2然后在Program.cs文件中配置OK!重新生成下项目文件,再次启......
  • python 获取加载模块路径
    方法一:python3-c"importsys;print(sys.path)"效果:方法二:python3importsysprint(sys.path)效果:参考:https://www.zhihu.com/question/603263580?utm_id=0......
  • 蔡司依视路-指南
    鉴别指南镜片上面有防伪标识logo(有小概率加工时候会被切割掉);因此这种方法还是有点鸡肋重点他来了!!!蔡司防伪码是一种用于验证蔡司眼镜产品真伪的二维码每个防伪码只能被扫描一次一旦防伪码被扫描系统就会记录下这个码已经被使用过了,再次扫描时会提示已经失效因此,每个蔡司......
  • 硬件测试岗位面试准备
    硬件测试的5个流程通电前硬件检测通电检测电子电路调试中其他工作确定测试点:根据待调系统的工作原理拟定调试步骤和测量方法,确定测试点,并在图纸上和板子上标出位置,制作调试数据记录表格等。搭设调试工作台:工作台配备所需的调试仪器仪器的摆设应操作方便......
  • 测试
    根据类名提示,反序列化的链子应该是:start-hello-world-hack关键点在于hack类中weapon的值在经过__weakup赋值之后要怎么修改。在wp.php中有这么一句:$a->refer=&$a->weapon;将weapon的指针赋值给refer,在程序对refer进行赋值的时候,就相当于对weapon赋值,也就能成功控制执行......
  • AtCoder Beginner Contest 162
    AtCoderBeginnerContest162ABCD全暴力E数学题看不懂,感性理解F线性dp,非常基础我不会,寄E-SumofgcdofTuples(Hard)看了题解发现好多做法都是推一堆式子,我实在看不懂(卷积莫反啥啥的呜呜呜)然后看见这个感觉比较好感性理解:(来自洛谷题解)#include<bits/stdc++.h>#def......
  • 【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块7
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 微信小程序获取环境变量
    微信小程序获取环境变量在微信小程序中,无法直接获取环境变量。但是,我们可以通过其他方式来模拟环境变量的功能。参考用法通过wx.getAccountInfoSync()获取小程序信息,包含小程序appid,小程序版本(环境)。在app.js中设置全局变量//app.jsApp({//全局数据,是否为开发环......
  • CF1220F Gardener Alex 题解--zhengjun
    发现根节点一定是\(1\),所以考虑两边的子树深度,然后发现只需要考虑一段后缀或前缀的深度即可。所以循环位移后,可以从中间往两边构建笛卡尔树,实时维护深度即可。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=2e5+10;intn,a[N],ans[N];......
  • 网安面试题整理
    什么是XSS,有几种类型,如何防范?XSS概念:攻击者在网页中嵌入客户端脚本(JavaScript),当用户使用浏览器加载被嵌入恶意代码的网页时,用户的浏览器就会执行该恶意代码。XSS弹窗方式:alert()confirm()prompt()document.write()console.log()XSS本质:用户输入的HTML语句直接输......