社区讨论

S组T3被卡成暴力分了还有救吗

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m2qzben0
此快照首次捕获于
2024/10/27 10:36
去年
此快照最后确认于
2025/11/04 15:56
4 个月前
查看原帖
rt
把 map 删掉,然后特判 change_treev=0v=0 的情况才能过。现在被卡成暴力分了,xdm,我自闭了QAQ
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int n,a[MAXN];
struct Segment_Tree
{
	long long maxx,Tar;
}T[MAXN<<2];
void build_tree(int x,int l,int r)
{
	T[x].maxx=T[x].Tar=0;
	if(l==r)	return;
	int mid=(l+r)/2;
	build_tree(x<<1,l,mid),build_tree(x<<1|1,mid+1,r);
}
void fixed_tree(int x)
{
	if(T[x].Tar)
	{
		T[x<<1].Tar+=T[x].Tar,T[x<<1|1].Tar+=T[x].Tar;
		T[x<<1].maxx+=T[x].Tar,T[x<<1|1].maxx+=T[x].Tar;
		T[x].Tar=0;
	}
}
void pushup(int x){ T[x].maxx=max(T[x<<1].maxx,T[x<<1|1].maxx); }
void change_tree(int x,int l,int r,int L,int R,long long v)
{
	if(L<=l&&r<=R)	return (void)(T[x].Tar+=v,T[x].maxx+=v);
	fixed_tree(x);
	int mid=(l+r)/2;
	if(L<=mid)	change_tree(x<<1,l,mid,L,R,v);
	if(R>mid)	change_tree(x<<1|1,mid+1,r,L,R,v);
	pushup(x);
}
long long query(int x,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)	return T[x].maxx;
	fixed_tree(x);
	int mid=(l+r)/2;
	long long res=0;
	if(L<=mid)	res=max(res,query(x<<1,l,mid,L,R));
	if(R>mid)	res=max(res,query(x<<1|1,mid+1,r,L,R));
	return res;
}
map<int,int> mp;
int pre[MAXN];
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int Ts;
	cin>>Ts;
	while(Ts--)
	{
		cin>>n,mp.clear();
		for(int i=1;i<=n;i++)	cin>>a[i];
		for(int i=1;i<=n;i++)	pre[i]=mp[a[i]],mp[a[i]]=i;
		build_tree(1,0,n);
		for(int i=2;i<=n;i++)
		{
			long long now=query(1,0,n,0,i-2);
			if(pre[i])
			{
				if(pre[i]!=i-1)	now=max(now,query(1,0,n,pre[i],pre[i])+a[i]);
				else if(pre[i-1])	now=max(now,query(1,0,n,pre[i-1],pre[i-1])+a[i]);
			}
			change_tree(1,0,n,0,i-2,(a[i]==a[i-1])*a[i]);change_tree(1,0,n,i-1,i-1,now);
		}
		cout<<T[1].maxx<<'\n';
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...