codeforces 1257 E、F

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;
}

原文地址:https://www.cnblogs.com/MXang/p/11950792.html