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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis如何启动_电脑一直卡在配置更新100%

    Redis如何启动_电脑一直卡在配置更新100%Redis的配置、启动、操作和关闭一.启动Redis1.默认配置启动执行redis-server命令,按照默认的redis.conf配置文件中的配置启动Redis,如下:因为默认配置无法自定义配置。所以该方式不会再生产环境中使用2.运行配置启动在命令redis-server后加上要修改的配置名和值(可以设置多对),没有设置的………

    2022年9月17日
    0
  • Python 一行代码输出心形图案

    Python 一行代码输出心形图案Python3pythonprint('\n'.join([''.join([('Love'[(xy)%4]if((x0.05)2+(y0.

    2022年7月6日
    20
  • 树莓派python编程入门与实战_树莓派python软件

    树莓派python编程入门与实战_树莓派python软件一、远程连接和远程桌面设置:终端下执行命令:ifconfig,查看树莓派的IP终端下执行命令:sudoapt-getinstallxrdp,安装远程桌面支持。在windows电脑上点开始,输入mstsc,出来远程桌面界面,输入树莓派IP,用户名:pi密码raspberry,就可以连上了。二、关闭树莓派正确操作:方式一:终端下执行命令:sudopoweroff…

    2022年10月15日
    0
  • 台式计算机网线,台式电脑连接网线的是哪里 台式电脑怎么连接wifi步骤

    台式计算机网线,台式电脑连接网线的是哪里 台式电脑怎么连接wifi步骤4999或者运营商的问题,方法有哪些,我的笔记本和台式机都是10,联想启天4155,笔记本连的路由器的无线,用(wifi调试桥台式机电脑)使用脚本辅助微连接台式电脑连接信小程序跳一跳简单实用教程新人适用一wifi条龙附带资源,只有网线,另一种可能度出问题了,28访问量,什么叫做二次开发,惠普连接暗影精台式电脑连接灵5,连接对于家中台式电脑连接路由电脑怎样器还有连wifi接猫的用户,台式电脑,热门台…

    2022年6月26日
    23
  • python层次聚类分析_SPSS聚类分析:系统聚类分析[通俗易懂]

    python层次聚类分析_SPSS聚类分析:系统聚类分析[通俗易懂]一、概念:(分析-分类-系统聚类)系统聚类法常称为层次聚类法、分层聚类法,也是聚类分析中使用广泛的一种方法。它有两种类型,一是对研究对象本身进行分类,称为Q型聚类;另一是对研究对象的观察指标进行分类,称为R型聚类。同时根据聚类过程不同,又分为分解法和凝聚法。二、聚类方法(分析-分类-系统聚类-方法)1、聚类方法。可用的选项有组间联接、组内联接、最近邻元素、最远邻元素、质心聚类法、中位数聚类法和Wa…

    2022年10月17日
    0
  • java 启动连接hsql

    java 启动连接hsqljava启动连接HSQL转载自: http://ehilcoder.iteye.com/blog/17228051.关于HSQLAHyperSQLDatabaseEachHyperSQLdatabaseiscalledacatalog.Therearethreetypesofcatalogdependingonhowthedataisstored.Typ

    2022年9月17日
    0

发表回复

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

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