2025牛客寒假算法基础集训营1题解

E:双生双宿之错

设变成双生数组后两数分别为(a,b),贪心得到将小的数都变为a,将大的数都变为b为最优解,那么找到a,b即可,对于小数(下标1n/2)的数而言找到目标数target_a,当变成数x<target_a时,需要的操作数大于变成target_a,同理x>target_a时,需要的操作数大于变成target_a,即其为单峰函数,用三分求出即可。
求出target_a和target_b后,两者仅为半边的最值,暴力枚举其附近的值取最小即可。

#include <bits/stdc++.h>

#define lowbit(x) ((x)&(-x))
#define all(x) x.begin(),x.end()
#define int long long
using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(all(a));
    auto get1=[&](int x){
        int cnt=0;
        for(int i=1;i<=n/2;i++){
            cnt+=abs(a[i]-x);
        }
        return cnt;
    };
    auto get2=[&](int x){
        int cnt=0;
        for(int i=n/2+1;i<=n;i++){
            cnt+=abs(a[i]-x);
        }
        return cnt;
    };
    int l1=1,r1=1e9;
    while(l1<r1){
        int mid1=l1+(r1-l1)/3;
        int mid2=r1-(r1-l1)/3;
        if(get1(mid1)<get1(mid2)){
            r1=mid2-1;
        }else l1=mid1+1;
    }
    int l2=1,r2=1e9;
    while(l2<r2){
        int mid1=l2+(r2-l2)/3;
        int mid2=r2-(r2-l2)/3;
        if(get2(mid1)<get2(mid2)){
            r2=mid2-1;
        }else l2=mid1+1;
    }
    int ans=1e18;
    for(int i=-5;i<=5;i++){
        for(int j=-5;j<=5;j++){
            if(l2+j==l1+i)continue;
            else ans=min(ans,get1(l1+i)+get2(l2+j));
        }
    }
    cout<<ans<<'\n';
}

signed main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    int _ = 1;
    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}

H:井然有序之窗

对于构造排列可以选择先构造小的数,那么对于一个区间来说ri越大越方便构造,所以将ri小的放在前面先构造即可。

#include <bits/stdc++.h>  
  
#define lowbit(x) ((x)&(-x))  
#define all(x) x.begin(),x.end()  
#define int long long  
using namespace std;  
const int N = 1e5 + 10;  
const int MOD = 998244353;  
  
struct node {  
    int l, r, id;  
} a[N];  
  
vector<int> ans(N);  
  
bool comp(node x, node y) {  
    return x.r < y.r;  
}  
  
void solve() {  
    int n;  
    cin >> n;  
    for (int i = 1; i <= n; i++) {  
        int l, r;  
        cin >> l >> r;  
        a[i] = {l, r, i};  
    }  
    sort(a + 1, a + 1 + n, comp);  
    set<int> num;  
    for (int i = 1; i <= n; i++) {  
        num.insert(i);  
    }  
    for (int i = 1; i <= n; i++) {  
        auto [l, r, id] = a[i];  
        auto it = num.lower_bound(l);  
        if (it == num.end() || *it > r) {  
            cout << -1 << '\n';  
            return;  
        }  
        ans[id] = *it;  
        num.erase(it);  
    }  
    for (int i = 1; i <= n; i++) cout << ans[i] << ' ';  
}  
  
signed main() {  
    cin.tie(0);  
    cout.tie(0);  
    ios::sync_with_stdio(0);  
    int _ = 1;  
//    cin >> _;  
    while (_--) {  
        solve();  
    }  
    return 0;  
}

J:硝基甲苯之袭

很容易得到满足 (aiaj=gcd(ai,aj)) 时|ai-aj|=gcd(ai,aj),所以通过查找ai的因子,然后加减因子判断是否合法即可。

#include <bits/stdc++.h>

#define lowbit(x) ((x)&(-x))
#define all(x) x.begin()+1,x.end()
#define int long long
using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;

vector<vector<int>>factor(N);
vector<int>a(N);
map<int,int>mp;
void init(){
    for (int i = 1; i <= N; ++i) {
        for (int j = i; j <= N; j += i) {
            factor[j].push_back(i);
        }
    }
}

void solve() {
    init();
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >>a[i];
        mp[a[i]]++;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(auto y:factor[a[i]]){
            int up=a[i]+y;
            int down=a[i]-y;
            if(gcd(up,a[i])==(up^a[i])){
                ans+=mp[up];
            }
            if(gcd(down,a[i])==(down^a[i])){
                ans+=mp[down];
            }
        }
    }
    cout << ans/2<<'\n';
}

signed main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}
posted @   yoez123  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示