社区讨论
S组T3被卡成暴力分了还有救吗
灌水区参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m2qzben0
- 此快照首次捕获于
- 2024/10/27 10:36 去年
- 此快照最后确认于
- 2025/11/04 15:56 4 个月前
rt
把 map 删掉,然后特判
CPPchange_tree 里 的情况才能过。现在被卡成暴力分了,xdm,我自闭了QAQ#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 条回复,欢迎继续交流。
正在加载回复...