首页 > 其他分享 >2024.2.25模拟赛T3题解

2024.2.25模拟赛T3题解

时间:2024-02-26 21:59:51浏览次数:20  
标签:25 2024.2 return int 题解 线段 mid cal inf

题目

推出dp柿子之后,枚举 \(i\) 的时候用线段树维护 \(1-i\) 的 \(mex\) 段,对于每一段,分别使用线段树套李超树维护,对于每个 \(mex\) 再次使用线段树套李超树维护即可

code

#include<bits/stdc++.h>
using namespace std;
#define N 600005
#define int long long
int n,m;
const int inf=1e18;
int a[N],s[N],f[N],c[N*4];
void upd(int p,int l,int r,int x,int y){
	if(l==r){
		c[p]=y;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) upd(p*2,l,mid,x,y);
	else upd(p*2+1,mid+1,r,x,y);
	c[p]=min(c[p*2],c[p*2+1]);
}
int find(int p,int l,int r,int x){
	if(p==1) x--;
	if(x<l) return n;
	if(r<=x) return c[p];
	int mid=(l+r)>>1;
	if(x<=mid) return find(p*2,l,mid,x);
	else return min(c[p*2],find(p*2+1,mid+1,r,x));
}
int qry(int p,int l,int r,int x){
	if(l==r) return l;
	int mid=(l+r)>>1;
	if(c[p*2]<x) return qry(p*2,l,mid,x);
	else return qry(p*2+1,mid+1,r,x);
}
struct STS{
	int n,tot=0,top=0;
	int k[N],b[N]={-inf},c[N*20],ls[N*20],rs[N*20],rt[N*4];
	int cal(int x,int p){
		return k[p]*x+b[p];
	}
	void add(int &p,int l,int r,int x){
		if(!p) p=++top;
		if(l==r){
			if(cal(l,x)>cal(l,c[p])) c[p]=x;
			return ;
		}
		int mid=(l+r)>>1;
		if(cal(mid,x)>cal(mid,c[p])) swap(x,c[p]);
		if(cal(l,x)>cal(l,c[p])) add(ls[p],l,mid,x);
		if(cal(r,x)>cal(r,c[p])) add(rs[p],mid+1,r,x);
	}
	int find(int p,int l,int r,int x){
		if(!p) return -inf;
		if(l==r) return cal(x,c[p]);
		int mid=(l+r)>>1,val=cal(x,c[p]);
		if(x<=mid) val=max(val,find(ls[p],l,mid,x));
		else val=max(val,find(rs[p],mid+1,r,x));
		return val;
	}
	int qry(int p,int l,int r,int x,int y,int z){
		if(x>y) return -inf;
		if(x<=l&&r<=y) return find(rt[p],0,n,z);
		int mid=(l+r)>>1,val=-inf;
		if(x<=mid) val=max(val,qry(p*2,l,mid,x,y,z));
		if(mid<y) val=max(val,qry(p*2+1,mid+1,r,x,y,z));
		return val;
	}
	void upd(int p,int l,int r,int x,int y){
		add(rt[p],0,n,y);
		if(l==r) return ;
		int mid=(l+r)>>1;
		if(x<=mid) upd(p*2,l,mid,x,y);
		else upd(p*2+1,mid+1,r,x,y);
	}
	void ins(int kk,int bb,int x){
		tot++;k[tot]=kk,b[tot]=bb;
		upd(1,1,::n,x,tot);
	}
}T1,T2;
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];
	T1.n=n,T2.n=s[n];
	for(int i=1;i<=n;i++){
		T1.ins(-s[i-1],f[i-1],i),T2.ins(0,f[i-1],i);
		int l=min(i,find(1,0,n,a[i]+1)),r=min(i,find(1,0,n,a[i]));
		upd(1,0,n,a[i],i);
		while(l<r){
			int col=qry(1,0,n,r);
			int nr=max(l,find(1,0,n,col+1));
		//	printf("i l r col nr: %lld %lld %lld %lld %lld\n",i,l,r,col,nr);
			int num=T1.qry(1,1,n,nr+1,r,col);
			T2.ins(col,num,nr+1);r=nr;
		}
		int dn=max(1ll,i-m+1);
		int col=qry(1,0,n,dn);
		r=min(i,find(1,0,n,col));
		f[i]=max(T2.qry(1,1,n,dn,i,s[i]),s[i]*col+T1.qry(1,1,n,dn,r,col));
	//	printf("%lld: %lld %lld %lld\n",i,f[i],T2.qry(1,1,n,dn,i,s[i]),s[i]*col+T1.qry(1,1,n,dn,r,col));
	}
	printf("%lld\n",f[n]);
	return 0;
}

标签:25,2024.2,return,int,题解,线段,mid,cal,inf
From: https://www.cnblogs.com/hubingshan/p/18035631

相关文章

  • .NET周刊【2月第3期 2024-02-25】
    国内文章4.1kStar!全面的C#/.NET/.NETCore学习、工作、面试指南https://www.cnblogs.com/Can-daydayup/p/18027117DotNetGuide是一个为.NET开发者建立的技术社区和知识库。其中包含.NET相关的学习资料、工作心得、面试指南、技术文章、项目框架和常见面试题等,目的是帮助初学者......
  • 2024.2.25模拟赛T1题解
    题目考虑DP式子之后,可以通过堆维护函数,求出对应值code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN200005intzu,n,d,tg,num;inta[N];priority_queue<int>q;signedmain(){ scanf("%lld",&zu); while(zu--){ scanf(&qu......
  • 2024.2.25模拟赛T2题解
    题目枚举根之后,考虑每次连边的贡献,通过贡献算出每个点的权值,每次找出权值最大的点,又要保证父亲在儿子之前,所以将父亲和儿子合并,权值也合并一下即可code#include<bits/stdc++.h>usingnamespacestd;#defineN2005intans,n,k;intsz[N],deg[N],du[N],fu[N],f[N],h[N];str......
  • 2024.2.26模拟赛T2题解
    题目对询问扫描线,建出\(PAM\)的失配树之后,每次查询相当于,把\(r\)对应节点到根路径染色之后,有多少个节点的值大于\(l\),可以树剖+ODT实现code#pragmaGCCoptimize("Ofast","inline","-ffast-math")#pragmaGCCtarget("avx,sse2,sse3,sse4,mmx")#include<bits/s......
  • 2024.2.26 LGJ Round
    A给出一个\(n\)个顶点的有向图,求有多少个长度小于\(k\)的环(环可以经过重复的结点)。两个环不同当且仅当顶点序列不同。\(n\le35,k\le1e6\)。矩阵乘法模板题。枚举起点,求出走\(\lek\)步到达自己的方案数。只需要记录\(f_i\)表示以\(i\)结尾的路径个数,以及\(g_i\)......
  • 2024.2.26闲话——错误的时间复杂度
    推歌:猛独が襲う——一二三想了一个非常奇怪的逻辑。我们知道斐波那契数列是需要递推的。我们由前两个数推到第\(3\)个数的时间复杂度是\(O(1)\)。推第\(4\)个数是\(O(1)\)的基础上加\(1\)还是\(O(1)\)。然后我们以此类推下去,递推求斐波那契数列任意一项都是\(O(1)......
  • 2024.2.26模拟赛T1题解
    题目先建出圆方树,题目转换为数长度为\(2*L-1\)的路径数,长链剖分code#include<bits/stdc++.h>usingnamespacestd;#defineN2000005#definelllonglongintn,m,top,tot,cnt,L,k;intdfn[N],low[N],zhan[N],h[N];structAB{ inta,b,n;}d[N*4];voidcun(intx,int......
  • P7154 Sleeping Cows 题解
    传送门题意:给定两个数组\(a_i,b_i\),若\(a_i\leb_j\),则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大)先考虑最大匹配方案数怎么求。把\(a\)和\(b\)从小到大排序。则每个\(a_i\)能匹配的\(b\)都是一段后缀,且随着\(i\)增大,这个后缀越来越小。于是从......
  • 90th 2024/1/15-2024/1/25 蜕变?
    寒假来到这段时间有点忙,但生活总体还是快乐的多了一个打AT的活动,经过教练的安排终于有打AT的机会了挺开心的,打AT对我来说能锻炼思维的集中度和活跃度有时会突然发现自己集中精神思考题目\(for\spacesuch\spacea\spacelong\spacetime\)对于一个之前看着看着题容易开始发呆......
  • P4708 画画 题解
    先叠层甲。此解法非本题正解如果想看正解可以去看上面\(Sdchr\)或\(Log_x\)大佬的。第一眼看到此题,\(N\)个点的无标号的每个连通块有欧拉回路的图的个数。这不就是\(N\)阶赛德尔矩阵的个数吗?什么?你不知道赛德尔矩阵是什么。没关系。这东西是个很小众的东西。百度上都......