首页 > 其他分享 >Codeforces Round 936 (Div. 2)

Codeforces Round 936 (Div. 2)

时间:2024-03-23 14:11:40浏览次数:32  
标签:数字 int siz Codeforces check num 数组 Div 936

Codeforces Round 936 (Div. 2)

 A. Median of an Array

题意:给一串数字,每次操作可以将一个数字+1,求最少多少次操作使得数组中位数增加

思路:分奇偶讨论:

1:如果是奇数的话看中间的数字,如果中间的数字只出现过一次,那么次数就是1,否则看从中间位到右边最后出现这个数字的地方看这个数字一共出现了多少次

2:如果是偶数的话就需要考虑中间的两个数字,如果这两个数字不相等只需要一次操作,否则看从n/2出发到右边看这个数字出现了多少次

void solve(){
    ll n;
    cin >> n;
    vector<ll> a(n + 1);
    map<ll, ll> mp;
    for(int i = 1; i <= n; i ++) cin >> a[i], mp[a[i]] ++;
    sort(a.begin() + 1, a.end());
    if(n & 1){
        int ans = a[n / 2 + 1];
        if(mp[ans] == 1) cout << 1 << '\n';
        else{
            int res = 0;
            for(int i = n / 2 + 1; i <= n; i ++){
                if(a[i] == ans) res ++;
            }
            cout << res << '\n';
        } 
    }
    else{
        if(a[n / 2] != a[n / 2 + 1]){
            cout << 1 << '\n';
        }
        else{
            int res = 0;
            for(int i = n / 2; i <= n; i ++){
                if(a[i] == a[n / 2]) res ++;
            }
            cout << res << '\n';
        }
    }
}

B. Maximum Sum

题意:给定一个数组,每次可以选取任意数字之和再次加入数组(可以是0个数字,那么和就是0),求操作k次之和数组和的最大的可能

思路:求最大连续子数组,如何把这个子数组不断翻倍加入数组和

void solve(){
    ll n, k, ma = 0, sum = 0, sum2 = 0;
    cin >> n >> k;
    vector<ll> a(n + 1);
    for(int i = 1; i <= n; i ++) cin >> a[i], sum += a[i];
    for(int i = 1; i <= n; i ++){
        if(sum2 + a[i] > 0) sum2 += a[i];
        else sum2 = 0;
        ma = max(ma, sum2);
    }
    for(int i = 1; i <= k; i ++){
        sum = (sum + ma + Mod) % Mod;
        ma = (ma + ma + Mod) % Mod; 
    }
    cout << sum << '\n';
}

C. Tree Cutting

题意:给定一棵树,求删掉k条边之后的最大的最小连通块的大小

思路:二分答案,贪心的删边即可,最后要注意根节点所在的边的大小是不是大于等于mid,如果小于,那么删去的边数-1

vector<int> edge[N];
 
void solve(){
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; i ++) edge[i].clear();
    for(int i = 1; i < n; i ++){
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u); 
    }
    auto check =[&] (auto && check, int u, int fa, int x) -> PII{
        int num = 0, siz = 1;
        for(auto v : edge[u]){
            if(v == fa) continue;
            auto [rnum, rsiz] = check(check, v, u, x);
            num += rnum;
            siz += rsiz;
 
        }
        if(siz >= x){
            siz = 0;
            num ++;
        }        
        return pair(num, siz);
    };
    int l = 1, r = n;
    while(l < r){
        int mid = l + r + 1 >> 1;
        auto [num, siz] = check(check, 1, 0, mid);
        if(siz < mid) num --;
        if(num >= k) l = mid;
        else r = mid - 1;
    }
    cout << l << '\n';
}

D. Birthday Gift

题意:给定一个数组,将数组分为若干份,每一份内的数字进行异或操作,如何每一组再进行与操作,使得最后的结果小于等于x,求最多的组数

思路:定义res为每一组的异或的结果,首先先将res=x,贪心的选数字,如果选到的数字异或之后为x,这些数字就作为一组,然后从接下来的数字接着选,如果最后遗留的数字为0就可以。接着将res定义为x的每一位二进制位,舍去这一位,低位全部取1,例如10000->01111,然后按照同样的方法分组,只考虑高位,因为低位已经不影响了

void solve(){
    int n, x;
    cin >> n >> x;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i ++) cin >> a[i];
    int ans = -1;
    int res1 = 0, cnt1 = 0;
    for(int i = 1; i <= n; i ++){
        res1 ^= a[i];
        if((res1 | x) == x){
            res1 = 0;
            cnt1 ++;
        }
    }
    if(res1 == 0) ans = max(ans, cnt1);
    
    for(int i = 30; i >= 0; i --){
        int p = 1 << i;
        if(p & x){
            int num = (x - p) | (p - 1);
            int res = 0, cnt = 0;
            for(int i = 1; i <= n; i ++){
                res ^= a[i];
                if((res | num) == num){
                    cnt ++;
                    res = 0;
                }
            } 
            if(res == 0) ans = max(ans, cnt);
        }
    }
    cout << ans << '\n';
}

 

标签:数字,int,siz,Codeforces,check,num,数组,Div,936
From: https://www.cnblogs.com/RosmontisL/p/18091053

相关文章

  • 如何实现一个div垂直水平居中?
    第一种:定位        第一种思路:父元素relative,子元素absolute,left为50%,top为50%,再给子div设置距左和距上是自身的一半:transform:translate(-50%,-50%)。代码实现:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="......
  • 每日一题 第二十六期 Codeforces Round 936 (Div. 2)
    A.MedianofanArraytimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarrayaa......
  • 每日一题 第二十七期 Codeforces Round 936 (Div. 2)
    B.MaximumSumtimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouhaveanarrayaaaof......
  • CF-936(AB)
    CF-936(已更新:AB)诶……今天还有一个积分赛……自己学科方面也满是坑要补……感觉自己前途一片灰暗/(ㄒoㄒ)/~~A分析只要增大与初始序列中位数的值相同的数,就能在不改变序列顺序的情况下增大中位数的值代码#include<bits/stdc++.h>usingnamespacestd;#defineendl'......
  • Codeforces Round 935 (Div. 3)
    A-SettingupCamp思路:判断c能否填充b让b为3的倍数查看代码voidsolve(){inta,b,c;cin>>a>>b>>c;intans=a+b/3;b%=3;if(b>0&&b+c<3)cout<<-1<<'\n';else{ans+=(b+c+2)/3;c......
  • cfRound935div3--DEFG题解
    ps:这场因为精神状态不佳,又C题题意有点绕,卡题了,头晕找不到错.最后做了两题就溜了.狠狠扣90分..D-SeraphimtheOwl题意:即选一个位置,使得其满足题意。而且在满足题意的基础上,要靠近中心越好,如果满足题意而且靠近中心的距离一样,那么输出前面那个.intcnt0[300005]={0};......
  • CF1920 Codeforces Round 919 (Div. 2)
    B.SummationGame给你\(n\)个数(均大于0),Alice先执行一次删除不超过\(k\)个数,Bob再执行一次把最多\(x\)个数变成相反数.问最后数组的最大和是多少?这题本来是想先让Alice删除\(k\)个数,但显然不太容易得到最优解,因为还有可能撤回Alice的删除操作,再加上Bob的操作.......
  • Codeforces Round 935 (Div. 3)
    A.SettingupCamp#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;voidsolve(){inta,b,c;cin>>a>>b>>c;intres=a+b/3;b%=3;if(b!=0){if(c<3-b){......
  • 1943+1944.Codeforces Round 934 (Div. 1,Div. 2) - sol
    20240321终于差不多把Div1补完了(F当然没补),第一次打Div1,还是出了一些小状况的。唉。没有补Div1F的逆天题,选择放弃。Dashboard-CodeforcesRound934(Div.2)-CodeforcesDashboard-CodeforcesRound934(Div.1)-Codeforces2A.DestroyingBridgesThere......
  • Educational Codeforces Round 163 (Rated for Div. 2)
    Preface这周很奇怪,连着计网、数据库、组合数学的课都莫名其妙不上了,突然变得很空闲了的说正好有空赶紧补补题,不然接下来有很多造题/比赛的任务搁置着就忘记了A.SpecialCharacters签到,\(n\)是偶数才有解,构造的话注意到一个AAB可以产生\(2\)的贡献,把\(\frac{n}{2}\)个AAB拼起......