Codeforces Round #815 D1. Xor-Subsequence (easy version)

题意

一个长为 n(2n3105) 的序列 a(2ai200)a 一个长为 m 的子序列表示为 ab0,ab1,...,abp1 。如果对于所有 0p<m1 ,满足 abpbp+1<abp+1bp ,则称该子序列为好的,求 a 的最长好的子序列长度。

思路

考虑设 fi 为以 ai 结尾的好的子序列的最大长度,注意到 abp+1bpabp+1+bpabpbp+1abp+bp+1 。于是可以推出当 200+bp+1200+bp , 即 bp+1400+bp 时,一定不满足条件,即不可能发生转移,于是直接暴力 DP 即可,复杂度 O(400n)

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
using LL = long long;
using LD = long double;
using ULL = unsigned long long;
using PII = pair<LL, LL>;
using TP = tuple<int, int, int>;
#define all(x) x.begin(),x.end()
#define mst(x,v) memset(x,v,sizeof(x))
#define mul(x,y) (1ll*(x)*(y)%mod)
#define mk make_pair
//#define int LL
//#define double LD
#define lc tr[x].ch[0]
#define rc tr[x].ch[1]
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#pragma warning(disable : 4996)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const double eps = 1e-10;
const double pi = acos(-1);
const LL MOD = 1000000007;
const LL mod = 998244353;
const int maxn = 300010;

int T, N, A[maxn], f[maxn];

void solve()
{
	for (int i = 0; i < N; i++)
		f[i] = 1;
	for (int i = 0; i < N; i++)
	{
		for (int j = i + 1; j < min(i + 401, N); j++)
		{
			if ((A[i] ^ j) < (A[j] ^ i))
				f[j] = max(f[j], f[i] + 1);
		}
	}
	int ans = 0;
	for (int i = 0; i < N; i++)
		ans = max(ans, f[i]);
	cout << ans << endl;
}

int main()
{
	IOS;
	cin >> T;
	while (T--)
	{
		cin >> N;
		for (int i = 0; i < N; i++)
			cin >> A[i];
		solve();
	}

	return 0;
}

本文作者:Prgl

本文链接:https://www.cnblogs.com/Prgl/p/16602133.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Prgl  阅读(58)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开