Codeforces Round #815 D1. Xor-Subsequence (easy version)
题意
一个长为 的序列 。 一个长为 的子序列表示为 。如果对于所有 ,满足 ,则称该子序列为好的,求 的最长好的子序列长度。
思路
考虑设 为以 结尾的好的子序列的最大长度,注意到 , 。于是可以推出当 , 即 时,一定不满足条件,即不可能发生转移,于是直接暴力 即可,复杂度 。
代码
#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 中国大陆许可协议进行许可。
标签:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步