E:发现lis上的数不用改
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N = 2e5+5;
int n,m,k,a[N],b[N],c[N];
vector<int> v;
int slove(){
vector<int> lis;
for(auto x:v){
if(lis.empty())lis.push_back(x);
else{
if(x>lis.back())lis.push_back(x);
else{
int id = lower_bound(lis.begin(),lis.end(),x)-lis.begin();
lis[id] = x;
}
}
}
return lis.size();
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=k;i++)cin>>c[i];
sort(a+1,a+1+n);
sort(b+1,b+1+m);
sort(c+1,c+1+k);
for(int i=1;i<=n;i++)v.push_back(a[i]);
for(int i=1;i<=m;i++)v.push_back(b[i]);
for(int i=1;i<=k;i++)v.push_back(c[i]);
cout<<n+m+k-slove()<<endl;
}
F:
不会啊。看到折半以后感觉有了很多头绪,
于是我们就枚举前2^15次方个数然后map存一下,后面的直接找就行。
找的时候发现。。。我们怎么找啊,要做的是找a1+a2=b1+b2吧,移一下项,变成找差相同的即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
int n,a[105];
map<vector<int>,int>mp;
int c[105];
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=0;i<(1<<15);i++){
vector<int> v;
for(int j=1;j<=n;j++){
c[j]=__builtin_popcount(a[j]>>15^i)-__builtin_popcount(a[1]>>15^i);//高15位
v.push_back(c[j]);
}
mp[v]=i;
}
for(int i=0;i<(1<<15);i++){
vector<int> v;
for(int j=1;j<=n;j++){
c[j]=__builtin_popcount(a[1]&32767^i)-__builtin_popcount(a[j]&32767^i);
v.push_back(c[j]);
}
if(mp.count(v)){
cout<<(mp[v]<<15)+i<<endl;
exit(0);
}
}
cout<<-1<<endl;
}