首页 > 其他分享 >P8476 「GLR-R3」惊蛰

P8476 「GLR-R3」惊蛰

时间:2023-10-28 11:45:14浏览次数:35  
标签:return minn val R3 int P8476 quad GLR void

P8476 「GLR-R3」惊蛰

更好的阅读体验

好厉害的题。去年打比赛拿了 60 暴力,今年考古补了。

首先有结论 \(\forall i\in[1,n],\exists b_i=a_j\),可以类似归纳法的方式证明。

证明:对于 \(i=1\),若 \(b_1\geq a_1\),则令 \(b_1\) 为最大的 \(a_j\) 最优。
若 \(b_1<a_1\),则令 \(b_1\) 为小于 \(a_1\) 的最大的 \(a_j\) 最优。因为 \(b_1\) 已经取到了它能取到的有意义的最大值,\(b_1\) 再变大也不会令之后的决策集合扩大。

对于 \(i\not=1\),若 \(b_{i-1}\) 满足上述结论,则当 \(b_i\geq a_i\) 时令 \(b_i=b_{i-1}\) 最优。
若 \(b_i<a_i\),仍然令 \(b_i\) 为小于 \(a_1\) 的最大的 \(a_j\) 最优,证明方式同上。

有了这个结论,我们可以将其离散化,记 \(val_v\) 是 \(v\) 离散化前的值,这样 \(f_{i,j}\) 表示第 \(i\) 个位置的值为 \(num_j\) 时的最小代价,转移方程是:

\[f_{i,j}=\min_{k=j}^{V}f_{i-1,k}+ \begin{cases} val_j-val_{a_i}\quad\quad j\geq a_i\\ C\quad\quad\quad\quad\quad\quad \;j<a_i \end{cases} \]

暴力转移是 \(\mathcal O(n^3)\),发现转移区间是一个后缀,直接设 \(f_{i,j}\) 为后缀 \(\min\),把 \(i\) 滚掉,方程变为:

\[f_{j}=f_{j}+ \begin{cases} val_j-val_{a_i}\quad\quad j\geq a_i\\ C\quad\quad\quad\quad\quad\quad \;j<a_i \end{cases} \]

做完这个后在扫一遍更新后缀 \(\min\),可以做到 \(\mathcal O(n^2)\)。

继续观察转移方程,对于 \(j<a_i\) 的情况是平凡的,就是一个区间加,对于 \(j\geq a_i\),可以把 \(-val_{a_i}\) 拆出来,也是一个区间加(减),考虑 \(val_j\) 如何处理。难道是 KTT

\(val\) 和 \(f\) 都有一个重要的性质:非严格单增。一个区间的 \(f\) 的最做单的位置一定是最小值,这样对于一个区间加了一个 \(val\) 之后,最小值仍然是最左端的位置。

对于最后后缀 \(\min\) 的更新,\(f\) 数组下标 \(<a_i\) 的部分单增,后半部分也是单增,所以可以在左半部分找出一个分界点,分界点左边的值不需要更新,右边的部分直接区间推平即可。

最优发现这些操作线段树大部分都是好做的。对于第二个操作,发现标记是满足结合律的,并且打了标记之后可以快速知道这个区间的答案,所以这个线段树也可以维护。

复杂度 \(\mathcal O(n\log n)\)。

	int n,C,len,ans=INF,numa[1000001],a[1000001];
	namespace Segment
	{
		struct{int l,r,minn,tag1,tag2,tag3;}t[10000001];
		inline void update(int p){t[p].minn=min(t[p*2].minn,t[p*2+1].minn);}
		inline void down1(int p,int v){t[p].minn=v,t[p].tag2=t[p].tag3=0,t[p].tag1=v;}
		inline void down2(int p,int v){t[p].minn+=v,t[p].tag2+=v;}
		inline void down3(int p,int v){t[p].minn+=v*numa[t[p].l],t[p].tag3+=v;}
		inline void spread(int p)
		{
			if(t[p].tag1!=-1)down1(p*2,t[p].tag1),down1(p*2+1,t[p].tag1),t[p].tag1=-1;
			if(t[p].tag2)down2(p*2,t[p].tag2),down2(p*2+1,t[p].tag2),t[p].tag2=0;
			if(t[p].tag3)down3(p*2,t[p].tag3),down3(p*2+1,t[p].tag3),t[p].tag3=0;
		}
		void build(int p,int l,int r)
		{
			t[p].l=l,t[p].r=r,t[p].tag1=-1;
			if(l==r)return;
			int mid=l+((r-l)>>1);
			build(p*2,l,mid),build(p*2+1,mid+1,r),update(p);
		}
		int ask(int p,int x)
		{
			if(t[p].l==t[p].r)return t[p].minn;
			return spread(p),x<=t[p*2].r?ask(p*2,x):ask(p*2+1,x);
		}
		void change(int p,int l,int r,int k)
		{
			if(l<=t[p].l&&r>=t[p].r)return down1(p,k);
			spread(p);
			if(l<=t[p*2].r)change(p*2,l,r,k);
			if(r>t[p*2].r)change(p*2+1,l,r,k);
			update(p);
		}
		void modify(int p,int l,int r,int k)
		{
			if(l<=t[p].l&&r>=t[p].r)return t[p].minn+=k,t[p].tag2+=k,void();
			spread(p);
			if(l<=t[p*2].r)modify(p*2,l,r,k);
			if(r>t[p*2].r)modify(p*2+1,l,r,k);
			update(p);
		}
		void add(int p,int l,int r)
		{
			if(l<=t[p].l&&r>=t[p].r)return down3(p,1);
			spread(p);
			if(l<=t[p*2].r)add(p*2,l,r);
			if(r>t[p*2].r)add(p*2+1,l,r);
			update(p);
		}
		int L;
		void check(int p,int val)
		{
			if(t[p].l==t[p].r)
			{
				if(t[p].minn>=val)L=min(L,t[p].l);
				return;
			}
			spread(p);
			if(t[p*2+1].minn>val)L=min(L,t[p*2+1].l),check(p*2,val);
			else check(p*2+1,val);
		}
		void solve(int p,int k,int val)
		{
			if(t[p].l==t[p].r)
			{
				if(t[p].minn>val)L=min(L,t[p].l);
				return;
			}
			spread(p);
			if(k>t[p*2].r)
			{
				if(t[p*2+1].minn>val)check(p*2,val);
				solve(p*2+1,k,val);
			}
			else
			solve(p*2,k,val);
		}
		void print(int p)
		{
			if(t[p].l==t[p].r)return write(t[p].minn);
			spread(p),print(p*2),print(p*2+1);
		}
	}
	using namespace Segment;
	inline void mian()
	{
		read(n,C);int x;
		for(int i=1;i<=n;++i)read(a[i]),numa[i]=a[i];
		sort(numa+1,numa+1+n),len=unique(numa+1,numa+1+n)-numa-1,build(1,1,len);
		for(int i=1;i<=n;++i)
		{
			a[i]=lower_bound(numa+1,numa+1+len,a[i])-numa;
			if(a[i]-1)
			{
				x=ask(1,a[i]),L=inf;
				solve(1,a[i]-1,x-C);
				modify(1,1,a[i]-1,C);
				L!=inf?change(1,L,a[i]-1,x):void();
			}
			modify(1,a[i],n,-numa[a[i]]),add(1,a[i],n);
		}
		write(t[1].minn);
	}

标签:return,minn,val,R3,int,P8476,quad,GLR,void
From: https://www.cnblogs.com/WrongAnswer90-home/p/17793889.html

相关文章

  • GBLUP-RR in BGLR
    来自PaulinoPérez-Rodríguez和JoséCrossa两位GS领域大佬的报告。从GBLUP到RRBLUP,再到BRR理论使用经典数据集CIMMYTwheat599BGLR示例作者:生物信息与育种......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(一
    前言为啥要合批减少DC什么是自定义顶点参数通过几何体实例化特性(GPUInstancing)可使GPU批量绘制模型相同且材质相同的渲染对象。如果我们想在不打破这一特性的情况下单独修改某个对象的显示效果,就需要通过自定义几何体实例化属性。参考文档UI(Sprite)怎么你了?按照文......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(二
    具体操作步骤接下来以一个制造旋转效果的shader为例子,提供了这些参数的设置:旋转速度float旋转中心位置vec2逆时针/顺时针bool扭曲度float并在使用的贴图一致的前提下并且参数不同的值都能够合批。最终项目可以从GITHUB获取。CCC版本:3.8.0深入了解可以阅读后续......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(四
    源码阅读部分顶点数量、布局相关设置针对UI所使用的Mesh的顶点设置:如simple模式使用1个矩形(2x2个顶点),sliced模式使用9个矩形(4x4个顶点)dataLength相当于顶点数量。vertexRow和vertexCol描述了网格形状。SetIndexBuffer则描述网格中所有“三角形”分别由哪3......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(三
    参考资料资料1来源:https://forum.cocos.org/t/topic/148747/28用户:homym(tkhoi01281)3.x版自定参数我是利用createMesh方法去生成ui,因为createMesh就有自定义顶点参数的方法这个改动其实是可以弄一个新sprite来继承老spirte,然后把引擎里的simple.ts,splice.ts等assemb......
  • 从DETR到DETR3D(1)
    最近参加了手写ai的车道线检测项目,后续会更新一些文章展现对相关项目邻域的总结和理解。一 DETR的原理DETR输出是定长的:100个检测框和类别。这种操作可能跟COCO评测的时候取top100的框有关,从这种角度看,DETR可以被认为具有100个adaptiveanchor,其中Encoder和ObjectQuery分别对......
  • springboot整合swagger3.0
    pom文件中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>application.yml中写入配置swagger:enable:tr......
  • SpringCloudGateway网关整合swagger3+Knife4j3,basePath丢失请求404问题
    很多人都是照着别人的文章粘代码,我也是粘的,但是这样粘也会有问题,我搞这个Knife4j3的时候遇到两个问题,这里记录一下:第一个是basePath丢失,第二个解决basePath丢失完又引发了会引起application/json数据类型参数示例的问题。在集成SpringCloudGateway网关的时候,会出现没有basePat......
  • CocosCreator3.x 应用在UI(Sprite)上的 shader 要怎么利用 自定义顶点参数 来实现合批
    前言为啥要合批减少DC什么是自定义顶点参数通过几何体实例化特性(GPUInstancing)可使GPU批量绘制模型相同且材质相同的渲染对象。如果我们想在不打破这一特性的情况下单独修改某个对象的显示效果,就需要通过自定义几何体实例化属性。参考文档UI(Sprite)怎么你了?按照文......
  • Luogu9157「GLR-R4」夏至
    抢到最优解了,UOJ校验码上80pts过不去。/kk这里是官方题解的简化。首先考虑\(n=1\)怎么做,相当于对\(m\le10^{10}\)筛出\(f\)的前缀和。由于\(f(p)=p\),直接构造函数\(g(n)=n\)然后PN筛\(O(\sqrtm)\)求即可。然后考虑\(n>1\),由于\(n\)比较小,考虑对每一个\(i......