首页 > 其他分享 >SPT

SPT

时间:2024-11-13 15:33:21浏览次数:1  
标签:tmp int LL SPT son 端点 now

\(SPT(Super\ Piano\ Trick)\)

超级钢琴

选出 \(k\) 个最大的区间和,限制区间长度。

想到前缀和维护,然后区间最大值,可以确定每个左端点,对应的最大值。

维护前 \(k\) 大想到压堆,但是不可能全都压进去。

仍然是考虑对于每个左端点,右端点所在范围确定,那么当前的最大值就是确定的。

选完这个最大值,右端点所在范围中,当前选的这个点不能再选,其他的仍可能成为答案。

所以堆维护当前决策的区间和,最优决策点,左端点,以及右端点能取到的范围,每次相当于将右端点能取到的范围分成两部分,再找出最优决策压进去。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mx(x,y) (a[x]>a[y]?x:y)
const int N = 5e5+5;
int n,a[N],L,R,k,st[40][N],lg[N];
LL ans;
struct A
{
	int l,L,R,v,p;
	bool operator < (const A &x) const {return v<x.v;}
};
priority_queue<A> q;
inline int get(int l,int r)
{
	if(l>r) return -1;
	int k=lg[r-l+1];
	return mx(st[k][l],st[k][r-(1<<k)+1]);
}
int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	scanf("%d%d%d%d",&n,&k,&L,&R); lg[0]=-1;
	for(int i=1,x;i<=n;i++) scanf("%d",&x),a[i]=a[i-1]+x,st[0][i]=i,lg[i]=lg[i>>1]+1;
	for(int i=1;i<=30;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			st[i][j]=mx(st[i-1][j],st[i-1][j+(1<<(i-1))]);
	for(int i=1;i<=n;i++)
	{
		if(i+L-1>n) break;
		int l=i+L-1,r=min(n,i+R-1),p=get(l,r);
		q.push({i,l,r,a[p]-a[i-1],p});
	}
	while(k)
	{
		A tmp=q.top(); q.pop();
		ans+=tmp.v; k--;
		int p1=get(tmp.L,tmp.p-1),p2=get(tmp.p+1,tmp.R);
		if(tmp.L<=tmp.p-1) q.push({tmp.l,tmp.L,tmp.p-1,a[p1]-a[tmp.l-1],p1});
		if(tmp.p+1<=tmp.R) q.push({tmp.l,tmp.p+1,tmp.R,a[p2]-a[tmp.l-1],p2});
	}
	printf("%lld\n",ans);
	return 0;
}

异或粽子

只是把用 ST 表维护的区间最大值改成维护区间最大异或,用可持久化 Trie 维护。

注意可持久化 Trie 维护区间信息一般不维护子树 size,很麻烦,可以直接维护最靠右的出现位置,类扫描线的做法。

一般线性基维护区间信息也是类似。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 5e5+5;
int n,k;
LL a[N],ans;

namespace TRIE
{
	int son[N<<6][2],mx[N<<6],rt[N],num;
	inline void ins(LL x,int u,int lst)
	{
		rt[u]=++num;
		int now=rt[u],now1=rt[lst];
		for(int i=35;i>=0;i--)
		{
			int c=(x>>i)&1; 
			son[now][c]=++num;
			son[now][c^1]=son[now1][c^1];
			now=son[now][c]; now1=son[now1][c]; 
			mx[now]=u;
		}
	}
	inline int que(int a,int b,LL x)
	{
		if(b>a) return -1;
		int now=rt[a];
		for(int i=35;i>=0;i--)
		{
			int c=(x>>i)&1;
			if(son[now][c^1]&&mx[son[now][c^1]]>=b) now=son[now][c^1];
			else now=son[now][c];
		}
		return mx[now];
	}
} using namespace TRIE;
struct A
{
	int l,L,R,p; LL v;
	inline bool operator < (const A &x) const {return v<x.v;}
};
priority_queue<A> q;
inline LL read()
{
	LL res=0; char x=getchar();
	while(x<'0'||x>'9') x=getchar();
	while(x>='0'&&x<='9') res=(res<<1)+(res<<3)+(x^48),x=getchar();
	return res;
}
int main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	n=read(); k=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]^read();
		ins(a[i],i,i-1);
	}
	for(int i=1;i<=n;i++)
	{
		int p=que(n,i,a[i-1]);
		q.push({i,i,n,p,a[p]^a[i-1]});
	}
	while(k)
	{
		A tmp=q.top(); q.pop();
		ans+=tmp.v; k--;
		int p1=que(tmp.R,tmp.p+1,a[tmp.l-1]),p2=que(tmp.p-1,tmp.L,a[tmp.l-1]);
		if(p2!=-1) q.push({tmp.l,tmp.L,tmp.p-1,p2,a[p2]^a[tmp.l-1]});
		if(p1!=-1) q.push({tmp.l,tmp.p+1,tmp.R,p1,a[p1]^a[tmp.l-1]});
	}
	printf("%lld\n",ans);
	return 0;
}

标签:tmp,int,LL,SPT,son,端点,now
From: https://www.cnblogs.com/ppllxx-9G/p/18084881

相关文章

  • KITTI_00_SPTAM轨迹和KITTI_00_ORB轨迹
    KITTI_00_SPTAM轨迹和KITTI_00_ORB轨迹分别代表什么KITTI_00_SPTAM轨迹和KITTI_00_ORB轨迹分别代表的是两种不同的SLAM(SimultaneousLocalizationandMapping,即同时定位与建图)算法在KITTI数据集上生成的轨迹估计结果。1.KITTI_00_SPTAM轨迹:这代表了S-PTAM(Stereo......
  • master..spt_values
    master..spt_values是要导出数据的表,spt_values是在master数据库下,所以是master..spt_values。用法举例获取时间段内的每一天WITHDateSequenceAS(SELECTCAST('2024-11-01'ASDATE)ASDateValueUNIONALLSELECTDATEADD(DAY,1,DateValue)FROMDateSequenceWHERE......
  • (思瑞浦)TPF141-TR SPT23-6 全高清复合视频滤镜驱动程序
    产品描述TPF141是一款专为消费者应用而设计的、高性能、低成本的视频重建滤波器,它完美地结合了优异的视频性能和低功耗。它包含了一个全高清(FHD)滤波器通道。该滤波器具有六阶巴特沃斯特性,可用于数模转换器(DAC)重建滤波器或模数转换器(ADC)抗混叠滤波器。可以绕过FHD过滤器以支持......
  • C# 适配 Maspter 不覆盖填充值
    publicstaticclassMapExtension{publicstaticvoidFill(thisobjectsrc,objectdest){if(src==null||dest==null)return;varsrcType=src.GetType();vardestType=dest.GetType();varproper......
  • Spting框架
    Spring核心:IOCAOPIOC:控制反转:就是对对象控制权的转移,从程序代码本身反转到外部的容器中,通过外部容器对象的创建,属性的赋值,依赖的管理。 IOC的具体实现:依赖注入(DI):1.创建项目,导入架包 2.定义类 3.创建Spring的配置文件,编写bean 4.在......
  • 论文解读(AdSPT)《Adversarial Soft Prompt Tuning for Cross-Domain Sentiment Analysi
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:AdversarialSoftPromptTuningforCross-DomainSentimentAnalysis论文作者:HuiWu、XiaodongShi论文来源:2022ACL论文地址:download 论文代码:download视屏讲解:click1介绍 动机:直接使用固定的预定义模......
  • 巧用spt_values解决SQL中的连续日期问题
    spt_values是什么spt_values是SQLServer系统数据库master下中的一个表,表里面都是一些枚举数据。我们可以通过如下查询语句来查看里面的数据select*frommaster..spt_values spt_values连续记录但是通常我们使用的是Type='P'的数据记录,这些记录是一组从0开始,2047为止的......
  • 基于 SptringBoot 实现实时消息推送,这里有7种解决方案!
    技术交流,公众号:程序员小富大家好,我是小富~我有一个朋友~做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能。不过他还没想......
  • 感叹:当日的老牌著名微软技术站点asptoday.com全部内容现在免费了,变了microsoft.apress
       今天才发现,当日的老牌著名微软技术站点asptoday.com全部内容现在免费了,变了microsoft.apress.com,当初​​www.asptoday.com​​​是鼎鼎大......
  • SPT_AKI自用修改内容
    向商人出售物品价格修改文件:\Aki_Data\Server\database\templates\handbook.json 5b3f3b0186f774021a2afef7 1968钢盔:ArmoredSteel5c06c6a80db834001b735491 ......