8.19
作者:互联网
CF1720D2
题意:
给定序列\(A\),求\(A\)的最长子序列\(B\),满足\(a_p\oplus p+1<a_{p+1}\oplus p\)
\(n\leq 3*10^5,0\leq a_i\leq 10^9\)
题解:
枚举两边的值从高位到地位有多少位相等,对于前\(k\)位来说,有:
\(a_p\oplus p+1=a_{p+1}\oplus p\)
这样就可以把不等号变成等号,然后两边同时异或上\(p\oplus p+1\)
\(a_p\oplus p=a_{p+1}\oplus p+1\)
得到之后,就是要把每个\(a_i\oplus i\)插入\(trie\)树中。
然后考虑第\(k+1\)位是不同的,要做到\(a_{p+1}\oplus p\)的第\(k+1\)位是\(1\),而\(a_p\oplus p+1\)是\(0\)
考虑有几种情况:
\(a_{p}=0,p=0,a_{p+1}=1,p+1=0\)
\(a_{p}=0,p=1,a_{p+1}=0,p+1=0\)
\(a_{p}=1,p=0,a_{p+1}=1,p+1=1\)
\(a_{p}=1,p=1,a_{p+1}=0,p+1=1\)
而这里满足
\(a_p\oplus p=0,a_{p+1}\oplus p+1=1\)
或
\(a_p\oplus p=1,a_{p+1}\oplus p+1=0\)
也就是第\(k+1\)位要是相反的。
而且为了保证\(a_{p+1}\oplus p\)这一位是\(1\),还要保证\(a_{p+1}\)和\(p\)在这一位不同。
这就是全部的限制了,根据这些限制建\(trie\)树就可以了。
#include<bits/stdc++.h>
using namespace std;
namespace red{
#define double long double
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define lowbit(i) ((i)&(-i))
#define mid ((l+r)>>1)
#define eps (1e-15)
const int N=3e5+10,mod=1e9+7,inv2=5e8+4,inf=2e15;
void __init(int n=2000) {}
int son[N*31][2];
int f[N*31][2];
inline void main()
{
int n;
cin>>n;
vector<int> a(n);
vector<int> dp(n);
for(int i=0;i<n;++i)
{
cin>>a[i];
}
int ans=0;
// vector son(n*31,vector<int>(2,0));
// vector f(n*31,vector<int>(2,0));
int tot=0;
auto insert=[&](int x,int i,int val) -> void
{
int now=0;
for(int k=29;k>=0;--k)
{
int b=(x>>k)&1;
if(!son[now][b]) son[now][b]=++tot;
now=son[now][b];
int &ret=f[now][i>>k&1];
ret=max(ret,val);
}
};
auto query=[&](int x,int i) -> int
{
int now=0,ret=0;
for(int k=29;k>=0;--k)
{
int b=(x>>k)&1;
ret=max(ret,f[son[now][!b]][!((x^i)>>k&1)]);
now=son[now][b];
if(!now) return ret;
}
return ret;
};
for(int i=0;i<n;++i)
{
dp[i]=query(a[i]^i,i)+1;
ans=max(ans,dp[i]);
insert(a[i]^i,i,dp[i]);
//cout<<dp[i]<<'\n';
}
cout<<ans<<'\n';
for(int i=0;i<=tot;++i) son[i][0]=son[i][1]=f[i][0]=f[i][1]=0;
//cout<<"----------\n";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
red::__init();
int qwq=1; cin>>qwq;
while(qwq--) red::main();
return 0;
}
/*
*/
标签:int,ret,son,vector,8.19,oplus,now 来源: https://www.cnblogs.com/knife-rose/p/16603347.html