线段树65求调
查看原帖
线段树65求调
668858
GCTfvkbx楼主2024/10/28 20:42
#include <bits/stdc++.h>
#define int long long
#define ls (id<<1) 
#define rs ((id<<1)|1)

using namespace std ;

const int N = 2e5 + 10 , M = 1e6 + 10 ;

struct node{
	int max1 , lazy ;
}tree[M<<2];

int a[N] , n , T ;

bool vis[M] ;

void pushup(int id)
{
	tree[id].max1 = max(tree[ls].max1 , tree[rs].max1) ;
}

void down(int id)
{
	tree[ls].max1 += tree[id].lazy ;
	tree[rs].max1 += tree[id].lazy ;
	tree[ls].lazy += tree[id].lazy ;
	tree[rs].lazy += tree[id].lazy ;
	tree[id].lazy = 0 ;
}

void update1(int id , int l , int r , int ql , int qr , int val)
{
	if(l > qr || r < ql) return ;
	if(l >= ql && r <= qr)
	{
		tree[id].max1 = max(tree[id].max1 , val) ;
		return ;
	}
	int mid = l + r >> 1 ;
	if(tree[id].lazy) down(id) ;
	update1(ls , l , mid , ql , qr , val) ;
	update1(rs , mid + 1 , r , ql , qr , val) ;
	pushup(id) ;
}

void update(int id , int l , int r , int ql , int qr , int val)
{
	if(l > qr || r < ql) return ;
	if(l >= ql && r <= qr)
	{
		tree[id].max1 += val ;
		tree[id].lazy += val ;
		return ;
	}
	if(tree[id].lazy) down(id) ;
	int mid = l + r >> 1 ;
	update(ls , l , mid , ql , qr , val) , update(rs , mid + 1 , r , ql , qr , val) ;
	pushup(id) ;
	return ;
}

int query(int id , int l , int r , int ql , int qr)
{
	if(l > qr || r < ql) return 0 ;
	if(l >= ql && r <= qr) return tree[id].max1 ;
	int mid = l + r >> 1 ;
	if(tree[id].lazy) down(id) ;
	return max(query(ls , l , mid , ql , qr) , query(rs , mid + 1 , r , ql , qr)) ;
}

signed main()
{
	cin.tie(0) ;
	ios::sync_with_stdio(false) ;
	cin >> T ;
	while(T -- )
	{
		memset(vis , 0 , sizeof vis) ;
		for(int i = 0 ; i < N ; i ++ ) tree[i].max1 = tree[i].lazy = 0 ;
		cin >> n ;
		int len = 0 ;
		for(int i = 1 ; i <= n ; i ++ ) cin >> a[i] , len = max(len , a[i]) ;
		vis[a[1]] = true ;
		for(int i = 2 ; i <= n ; i ++ )
		{
			int maxn = query(1 , 1 , len , 1 , len) ;
			int maxx = query(1 , 1 , len , a[i] , a[i]) ;
			if(a[i] == a[i-1]) update(1 , 1 , len , 1 , len , a[i]) ;
			update1(1 , 1 , len , a[i-1] , a[i-1] , maxn) ;
			if(vis[a[i]]) update1(1 , 1 , len , a[i-1] , a[i-1] , maxx + a[i]) ;
			vis[a[i]] = true ;
		}
		cout << query(1 , 1 , len , 1 , len) << endl ;
	}
	return 0 ;
}
2024/10/28 20:42
加载中...