首页 > 其他分享 >P4113 [HEOI2012] 采花 && P1972 [SDOI2009] HH的项链

P4113 [HEOI2012] 采花 && P1972 [SDOI2009] HH的项链

时间:2024-12-06 12:10:57浏览次数:8  
标签:pre P4113 int HEOI2012 mid HH build ls

Solution:

对于区间上的问题,我们都不难想到可以用线段树解决

预处理:

对于一个数 \(a_i\) 记录他左边第一个和它相同的数的位置 \(pre_i\) 然后我们将询问离线后排序

然后我们扫描整个数组:

对于一个询问,我们只在当前枚举的i=r时进行答案统计

对于一个数 \(a_i\) : 它和它先祖的关系如下:

\(ans......pre.......a_i\)

我在线段树上对 \([ans+1,pre]\) 打上 \(1\) 的tag,表示右端点在i,左端点至少要在 \([ans+1,pre]\) 上才能取到颜色 \(a_i\) 的贡献

然后这题就做完了

Code:

P4113 [HEOI2012] 采花

#include<bits/stdc++.h>
const int N=2e6+5;
using namespace std;
int n,cnt,m;
//Segment_Tree
#define ls x<<1
#define rs x<<1|1
struct Segment_Tree{
	struct Tree{
		int l,r,val,tag;
	}t[N<<2];
	void pushup(int x)
	{
		t[x].val=max(t[ls].val,t[rs].val);
	}
	void pushdown(int x)
	{
		if(!t[x].tag)return;
		////<<"pushdown:"<<t[x].l<<" "<<t[x].r<<"="<<t[x].tag<<"\n"; 
		int tag=t[x].tag;
		t[ls].tag+=tag,t[rs].tag+=tag;
		t[ls].val+=tag,t[rs].val+=tag;
		t[x].tag=0;
		return;
	}
	void build(int x,int l,int r)
	{
		t[x].l=l,t[x].r=r;
		if(l==r)
		{
			return;
		}
		int mid=l+r>>1;
		build(ls,l,mid);build(rs,mid+1,r);
	}
	void upd(int x,int L,int R,int k)
	{
		if(R<t[x].l||t[x].r<L)return;
		if(R<L)return;
		if(L<=t[x].l&&t[x].r<=R)
		{
			//<<"UPD:"<<t[x].l<<" "<<t[x].r<<"\n";
			t[x].val+=k;
			t[x].tag+=k;
			return;
		}
		int mid=t[x].l+t[x].r>>1;
		pushdown(x);
		if(L<=mid)upd(ls,L,R,k);
		if(mid<R) upd(rs,L,R,k);
		pushup(x);
	}
	int query(int x,int L,int R)
	{
		if(L<=t[x].l&&t[x].r<=R)
		{
			return t[x].val;
		}
		pushdown(x);
		int mid=t[x].l+t[x].r>>1,res=0;
		if(L<=mid)res=max(query(ls,L,R),res);
		if(mid<R) res=max(query(rs,L,R),res);
		return res;
	}
}T;
int a[N],pre[N],last[N],ans[N];
struct task{
	int l,r,id;
	bool operator <(const task t){
		return r<t.r;
	}
}q[N];
int tot;
int read()
{
	int res=0;
	char c=getchar();
	while(c<'0'||'9'<c)c=getchar();
	while('0'<=c&&c<='9')res=(res<<3)+(res<<1)+c-'0',c=getchar();
	return res;
}
void work()
{
	n=read(),tot=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		pre[i]=last[a[i]];
		last[a[i]]=i;
	}
	for(int i=1;i<=m;i++)
	{
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	T.build(1,1,n);
	sort(q+1,q+1+m);
	int now=1;
	for(int i=1;i<=n;i++)
	{
		T.upd(1,pre[pre[i]]+1,pre[i],1);
		while(q[now].r==i)
		{
			ans[q[now].id]=T.query(1,q[now].l,q[now].r);
			now++;
		}
	}
	for(int i=1;i<=m;i++)
	{
		printf("%d\n",ans[i]);
	}
}
int main()
{
	//freopen("flower.in","r",stdin);
	//freopen("flower.out","w",stdout);
	work();
}

P1972 [SDOI2009] HH的项链

#include<bits/stdc++.h>
const int N=2e6+5;
using namespace std;
int n,cnt,m;
//Segment_Tree
#define ls x<<1
#define rs x<<1|1
struct Segment_Tree{
	struct Tree{
		int l,r,val,tag;
	}t[N<<2];
	void pushup(int x)
	{
		t[x].val=max(t[ls].val,t[rs].val);
	}
	void pushdown(int x)
	{
		if(!t[x].tag)return;
		////<<"pushdown:"<<t[x].l<<" "<<t[x].r<<"="<<t[x].tag<<"\n"; 
		int tag=t[x].tag;
		t[ls].tag+=tag,t[rs].tag+=tag;
		t[ls].val+=tag,t[rs].val+=tag;
		t[x].tag=0;
		return;
	}
	void build(int x,int l,int r)
	{
		t[x].l=l,t[x].r=r;
		if(l==r)
		{
			return;
		}
		int mid=l+r>>1;
		build(ls,l,mid);build(rs,mid+1,r);
	}
	void upd(int x,int L,int R,int k)
	{
		if(R<t[x].l||t[x].r<L)return;
		if(R<L)return;
		if(L<=t[x].l&&t[x].r<=R)
		{
			//<<"UPD:"<<t[x].l<<" "<<t[x].r<<"\n";
			t[x].val+=k;
			t[x].tag+=k;
			return;
		}
		int mid=t[x].l+t[x].r>>1;
		pushdown(x);
		if(L<=mid)upd(ls,L,R,k);
		if(mid<R) upd(rs,L,R,k);
		pushup(x);
	}
	int query(int x,int L,int R)
	{
		if(L<=t[x].l&&t[x].r<=R)
		{
			return t[x].val;
		}
		pushdown(x);
		int mid=t[x].l+t[x].r>>1,res=0;
		if(L<=mid)res=max(query(ls,L,R),res);
		if(mid<R) res=max(query(rs,L,R),res);
		return res;
	}
}T;
int a[N],pre[N],last[N],ans[N];
struct task{
	int l,r,id;
	bool operator <(const task t){
		return r<t.r;
	}
}q[N];
int tot;
int read()
{
	int res=0;
	char c=getchar();
	while(c<'0'||'9'<c)c=getchar();
	while('0'<=c&&c<='9')res=(res<<3)+(res<<1)+c-'0',c=getchar();
	return res;
}
void work()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		pre[i]=last[a[i]];
		last[a[i]]=i;
	}
	m=read();
	for(int i=1;i<=m;i++)
	{
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	T.build(1,1,n);
	sort(q+1,q+1+m);
	int now=1;
	for(int i=1;i<=n;i++)
	{
		T.upd(1,pre[i]+1,i,1);
		while(q[now].r==i)
		{
			ans[q[now].id]=T.query(1,q[now].l,q[now].r);
			now++;
		}
	}
	for(int i=1;i<=m;i++)
	{
		printf("%d\n",ans[i]);
	}
}
int main()
{
	//freopen("flower.in","r",stdin);
	//freopen("flower.out","w",stdout);
	work();
}

标签:pre,P4113,int,HEOI2012,mid,HH,build,ls
From: https://www.cnblogs.com/LG017/p/18590475

相关文章

  • hhdb数据库介绍(10-44)
    安全数据加密管理平台支持给数据配置加密规则,加密规则生效后,底层存储节点实际保存的是加密数据。这时通过计算节点层面访问数据仍是解密后的数据,即是否加密对计算节点层面是透明的。添加加密规则(一)功能入口:“安全->数据加密->添加规则”添加加密规则页面顶部,显示加密规则需......
  • hhdb数据库介绍(10-37)
    管理表回收站表回收站功能,是指在开启表保留参数(dropTableRetentionTime)情况下,服务端(默认3323)操作DROP、TRUNCATE、DELETE不带WHERE条件(自动提交)的表,会进入回收站。管理平台在保留时间内支持可视化数据闪回操作,另外还包括查看可还原数据列表、还原(闪回)数据、删除数据、查看历史......
  • hhdb数据库介绍(10-38)
    管理数据闪回为用户提供对误操作数据进行快速恢复的功能。可根据逻辑库、表名称、操作类型、where条件、时间范围来搜索执行过的SQL,然后找到需要回退的SQL,生成闪回SQL,生成过后下载闪回SQL,到计算节点执行闪回SQL进行回退,恢复对应的数据。闪回操作流程下面将通过一次误操作更......
  • hhdb数据库介绍(10-39)
    管理碎片整理因innodb存储引擎的特性,在数据删除之后会产生碎片空间,计算节点服务端口可通过ALTERTABLEtable_nameengine=innodb;来整理表空间,减少碎片空间对磁盘的占用。管理平台提供了可视化操作方便用户对碎片空间进行查看和整理。操作步骤选择需要整理碎片的库表,选择后,......
  • hhdb数据库介绍(10-40)
    安全安全菜单中主要为对计算节点连接与执行的安全防护,以及对相关组件密码的安全管理,提升业务系统的安全性。数据脱敏数据脱敏支持对密级程度较高的列、在进行SQL查询或日志输出时进行密文结果展示。数据脱敏规则支持按逻辑库、表信息和脱敏列的过滤,其中逻辑库、表信息为精确匹......
  • hhdb数据库介绍(10-41)
    安全黑白名单管理平台支持黑名单、白名单功能,可限制白名单之外的主机连接计算节点服务,同时限制黑名单之内的主机连接计算节点服务。用黑/白名单功能需要先在“安全->黑白名单”中开启黑/白名单开关。每个黑/白名单组都有对应的开关按钮,可以只开启或关闭某一个组,不影响其他组......
  • hhdb数据库介绍(10-42)
    安全SQL防火墙管理平台提供的SQL防火墙功能可为用户拦截高危SQL、误操作SQL等,提升系统安全性。同时防火墙提供观测功能,可在开启新规则前,通过开启观测状态,判断新规则对业务的影响程度。开启观测状态后,计算节点不会对SQL进行拦截,但会进行记录,双击观测状态图标,可跳转至SQL命中记录......
  • hhdb数据库介绍(10-43)
    安全密码安全管理密码安全管理为用户提供了对计算节点数据库用户与存储节点的连接用户、备份用户的密码有效期监控提醒。到期后自动提示用户修改密码以提升系统的安全性。数据库用户密码(一)密码修改用户可以在“安全->密码安全管理->数据库用户密码”页面修改数据库用户密码,此......
  • hhdb数据库介绍(10-36)
    管理分片方案在线变更提供对业务表的表类型、分片规则、分片字段、分片所属数据节点四个维度进行在线变更的支持。业务表在变更期间不会锁表,业务可对表进行正常的IUD操作。分片方案在线变更记录页面显示已执行完成或正在执行的变更任务记录,正在变更的任务允许通过【取消执......
  • hhdb数据库介绍(10-28)
    管理管理菜单主要囊括对业务数据进行管理的功能,例如对数据的备份恢复或执行业务表的DDL语句等操作。数据对象数据对象功能可以帮助用户通过列表实时查看当前已存在的数据对象,了解业务数据的整体情况。提供了对数据对象的筛选、统计、关联、详情等信息。基础数据对象的统计分......