BZOJ 3747 POI2015 Kinoman 段树

BZOJ 3747 POI2015 Kinoman 段树

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

标题效果:有m点,每个点都有一个权值。现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大

想了很久,甚至神标题,奔说是水的问题……我醉了

枚举左点 对于每个请求留点右键点 树维护最大值

考虑每一个数对答案的贡献 记录一个数组next表示这个位置上的点下一次出现的位置 那么这个点贡献的作用范围就是[i,next[i]-1] 假设没有next就是[i,n]

于是我们先把全部第一个出现的数对答案的贡献增加线段树 然后从左到右扫一遍 每次统计完答案之后把i对答案的贡献去除 然后把next[i]对答案的贡献增加线段树

这常数我也是醉了……速度倒数第二啥的 正解一定不是这种……

此外POI2015是我穿错年代了?

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1001001
using namespace std;
struct Segtree{
	Segtree *ls,*rs;
	long long num,mark;
	void Build_Tree(int x,int y);
	void Update(int x,int y,int l,int r,long long val);
	long long Get_Ans(int x,int y,int l,int r);
}*root=new Segtree,mempool[M<<1],*C=mempool;
int n,m;
int a[M],w[M],next[M],last[M];
bool v[M];
long long ans;
void Segtree :: Build_Tree(int x,int y)
{
	int mid=x+y>>1;
	num=0;mark=0;
	if(x==y) return ;
	ls=C++;rs=C++;
	ls->Build_Tree(x,mid);
	rs->Build_Tree(mid+1,y);
}
void Segtree :: Update(int x,int y,int l,int r,long long val)
{
	int mid=x+y>>1;
	if(x==l&&y==r)
	{
		num+=val;
		mark+=val;
		return ;
	}
	if(mark)
	{
		ls->num+=mark;
		rs->num+=mark;
		ls->mark+=mark;
		rs->mark+=mark;
		mark=0;
	}
	if(r<=mid) ls->Update(x,mid,l,r,val);
	else if(l>mid) rs->Update(mid+1,y,l,r,val);
	else ls->Update(x,mid,l,mid,val),rs->Update(mid+1,y,mid+1,r,val);
	num=max(ls->num,rs->num);
}
long long Segtree ::  Get_Ans(int x,int y,int l,int r)
{
	int mid=x+y>>1;
	if(x==l&&y==r)
		return num;
	if(mark)
	{
		ls->num+=mark;
		rs->num+=mark;
		ls->mark+=mark;
		rs->mark+=mark;
		mark=0;
	}
	if(r<=mid) return ls->Get_Ans(x,mid,l,r);
	if(l> mid) return rs->Get_Ans(mid+1,y,l,r);
	return max( ls->Get_Ans(x,mid,l,mid) , rs->Get_Ans(mid+1,y,mid+1,r) );
}
int main()
{
	int i;
	cin>>n>>m;
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=m;i++)
		scanf("%d",&w[i]);
	for(i=1;i<=n;i++)
	{
		if(last[a[i]])
			next[last[a[i]]]=i;
		else
			v[i]=1;
		last[a[i]]=i;
	}
	root->Build_Tree(1,n);
	for(i=1;i<=n;i++)
		if(v[i])
			root->Update(1,n,i,next[i]?next[i]-1:n,w[a[i]]);
	for(i=1;i<=n;i++)
	{
		ans=max(ans, root->Get_Ans(1,n,i,n) );
		root->Update(1,n,i,next[i]?next[i]-1:n,-w[a[i]]);
		if(next[i])
			root->Update(1,n,next[i],next[next[i]]?next[next[i]]-1:n,w[a[next[i]]]);
	}
	cout<<ans<<endl;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117735.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《JavaScript 模式》读书笔记(3)— 字面量和构造函数2

    上一篇啊,我们聊了聊字面量对象和自定义构造函数。这一篇,我们继续,来聊聊new和数组字面量。三、强制使用new的模式要知道,构造函数,只是一个普通的函数,只不过它却是以new的方式调用。如果在调用

    2022年3月25日
    42
  • [软件工程]团队项目–学术家族树之NABC分析

    [软件工程]团队项目–学术家族树之NABC分析

    2021年8月13日
    47
  • Spring Cloud 从入门到精通

    SpringCloud是一套完整的微服务解决方案,基于SpringBoot框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。本课程由浅入深带领大家一步步攻克SpringCloud各大模块,接着通过一个实例带领大家了解大型分布式微服务架构的搭建过程,最后深入源码加深对它的了解。本课程共分为四个部分:第一部分(第…

    2022年4月8日
    61
  • 从excel文件xlsx中特定单元格中提取图片「建议收藏」

    从excel文件xlsx中特定单元格中提取图片「建议收藏」第一种网上通用的用xlsx改zip压缩包,能批量提取出图片。但是无法知道图片在单元格中的顺序信息。另一种方法,通过`fromopenpyxl_image_loaderimportSheetImageLoader`功能已实现好,在github仓库开源,觉得好用请star该库可以实现excel文件转mysql、sqlite等(基于SQLAlchemy)链接传送门pipinstall-rrequrements.txtx=xlsx_pic(‘./test.xlsx’)#

    2022年7月13日
    12
  • java集合系列——List集合总结(六)

    List继承了Collection,是有序的列表。实现类有ArrayList、LinkedList、Vector、Stack等 ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!Vector是基于数组实现的,是一个矢量队列,是线程安全的!Stack是基于数组实现的,是栈

    2022年2月26日
    54
  • WPF Visifire使用

    WPF Visifire使用引言:  由于项目中需要使用Visifire所以自己就写了一些demo,大家一起共享!基础Visifire图表的展示1.Visifire的创建需要引用的DLL包【WPFToolkit.dll;WPFVisifire.Charts;WPFVisifire.Gauges(这个以后会用到)】2.我们开始创建简单的Visifire图表第一步:前台代码

    2022年7月21日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号