首页 > 其他分享 >Codeforces Round 912 (Div. 2)补题B、C、D1

Codeforces Round 912 (Div. 2)补题B、C、D1

时间:2023-12-04 18:45:57浏览次数:38  
标签:const int Codeforces cin i64 ++ 补题 using Div

Codeforces Round 912 (Div. 2)

B. StORage room

思路

\(a_i\) = \(M_i\)\(_1\) & \(M_i\)\(_2\) & \(M_i\)\(_3\) & ...& \(M_i\)\(_n\) \((i != j)\)

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    int n;
    cin >> n;
    int a[n + 10][n + 10];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    vector<int> res(n, (1 << 30) - 1);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            //cin >> a[i][j];
            if (i == j) continue;
            res[i] &= a[i][j];
            res[j] &= a[i][j];
        }

    bool ok = 1;
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            if ((res[i] | res[j]) != a[i][j]) ok = 0;
        }

    if (ok) {
        cout << "YES\n";
        for (int i = 0; i < res.size(); i++)
            cout << res[i] << " \n"[i + 1 == res.size()];
        //cout << endl;
    }else cout << "NO\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    int t = 1;
    cin >> t;
    while (t --) solve();

    return 0;
}

C. Theofanis' Nightmare

思路

当后缀和为正时就划分

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    int n;
    cin >> n;
    vector<i64> v(n + 1), suf(n + 1);
    for (int i = 0; i < n; i++) cin >> v[i];
    for (int i = n - 1; i >= 0; i --) suf[i] = suf[i + 1] + v[i];

    i64 ans = 0, cnt = 0;
    for (int i = 0; i < n; i++) {
        if (i == 0 || suf[i] > 0) cnt ++;
        ans += cnt * v[i];
    }

    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    int t = 1;
    cin >> t;
    while (t --) solve();

    return 0;
}

D1. Maximum And Queries (easy version)

思路

位运算的贪心我们要从高位开始做。
我们要从最高位去构造答案。先去遍历一下数组中的元素对当前构造的位有多少贡献,如果贡献小于最大操作数,那么当前构造的位就可以被构造出来,

ac代码

#include <bits/stdc++.h>

using namespace std;
using i64  = long long;
const i64 inf = 8e18;
typedef pair<int, int> pii;
const int N = 3e5 + 10;

void solve() {
    int n, q;
    cin >> n >> q;
    vector<i64> a(n), b;
    for (auto &i : a) cin >> i;

    while (q --) {
        i64 ans = 0;
        i64 m; cin >> m;
        b = a;  
        for (int k = 59; k >= 0; k --) {
            i64 sum = 0;
            for (int i = 0; i < n; i ++) {
                if ((b[i] >> k) & 1 ^ 1) 
                    sum += (1ll << k) - b[i];
                if (sum > m) break;
            }

            if (m >= sum) {
                m -= sum;
                ans += 1ll << k;
                for (int i = 0; i < n; i++)
                    if ((b[i] >> k) & 1 ^ 1) b[i] = 0;//将对sum有贡献置为0,比如0010 -> 1000,最高位已经用过了,且后面的位都为0,所以置为0
            }

            for (int i = 0; i < n; i++) {
                if ((b[i] >> k) & 1) b[i] ^= (1ll << k);//高位已经用完了,后面不需要,所以减去
            }
        }

        cout << ans << endl;
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    int t = 1;
    //cin >> t;
    while (t --) solve();

    return 0;
}

标签:const,int,Codeforces,cin,i64,++,补题,using,Div
From: https://www.cnblogs.com/kichuan/p/17872357.html

相关文章

  • CF1901 C Add, Divide and Floor 题解
    LinkCF1901CAdd,DivideandFloorQuestion给定一个长度为\(n\)的序列,每次操作你需要选择一个整数\(x\),并将所有\(a_i\)替换为\(\lfloor\frac{a_i+x}{2}\rfloor\)。求至少多少次操作后能将所有\(a_i\)变相同若最少次数小于等于\(n\),输出操作次数和每次操作所选......
  • Educational Codeforces Round 159 (Rated for Div. 2)
    EducationalCodeforcesRound159(RatedforDiv.2)基本情况A题秒了。B题想出来贪心思想,也想出来怎么找最优解了,但实现极其复杂繁琐,最后以先超时优化后又错误的结果告终。B.GettingPoints明显越后面开始学收益越高。然后写了个简单粗暴的纯模拟,T了。#include<iostrea......
  • CodeForces 1900F Local Deletions
    洛谷传送门CF传送门操作没有什么性质,唯一一个性质是,操作次数不超过\(\logn\)(每次至多保留一半元素)。于是我们可以直接模拟操作。但是肯定不能直接模拟。考虑先对原序列模拟一次,求出经过\(i\)次操作后保留的位置集合\(S_i\)。那么只保留\([l,r]\)的元素,可能会造成端点......
  • Codeforces Round 911 (Div. 2)
    Preface忙里偷闲补一下之前欠下的一些CF这场前5个题都极其一眼,然而F瞪了好久愣是屁都不会感觉现在水平有有点到瓶颈了,以前是Div2D写完卡现在是Div2E写完卡,但至少还是在进步的A.CoverinWater如果存在某个空地块的长度大于\(2\)则可以用两个块造出无限水,否则答案就是所有空......
  • Codeforces Round 881 (Div. 3)
    CodeforcesRound881(Div.3)A:ABCA.SashaandArrayColoring题意:求最大的着色成本(着色成本是指同一个颜色的最大值-最小值)思路:肯定不能是相同的,直接最大-最小就行#include<bits/stdc++.h>usingnamespacestd;inta[60];voidsolve(){intn;cin>>n;......
  • [Codeforces] CF1807E Interview
    题目翻译有\(n\)堆石头,其中\(n-1\)堆都只有重量为一克的石头,剩下一堆有则有一块有两克的石头和若干重量为一克的石头。你的任务是在\(30\)次询问内推理出那一堆有重量为两克的石头是第几堆。首先输入\(n\),接下来输入\(n\)个数\(a_1,a_2\dotsa_n\),其中\(a_i\)表示......
  • Codeforces Round 911 (Div. 2)
    CodeforcesRound911(Div.2)A-CoverinWaterintmain(){IOS;for(cin>>_;_;--_){cin>>n>>s+1;intans=0;boolf=0;for(inti=1,j=1;i<=n;i=++j)if(s[i]=='......
  • Codeforces Round 904 (Div. 2) C. Medium Design
    jly:开始的想法:首先枚举max的位置。包含它的一定是全加,剩下的一定都不加。然后求所有位置的最小值。初始全0,枚举max之后,因为是加区间,min一定在两端(最左或最右)。所以不需要枚举max,我们枚举min就好(因为加区间和初始全0,这个题的特殊性)。写法注意的点:下标从0开始,区间的左端点都-1,右端......
  • [Codeforces] CF1733C Parity Shuffle Sorting
    题面翻译给定一个长度为\(n\)的数组,你可以对它进行不超过\(n\)次操作。对于每次操作:选择两个下标\(l,r\),满足\(1\leql<r\leqn\);若\(a_l+a_r\)为奇数,将\(a_r\)赋值为\(a_l\),否则将\(a_l\)赋值为\(a_r\)。求一种方案,使得操作后的数组单调不减(即\(a_1\leq......
  • Codeforces Round 912 (Div. 2)
    A.HalloumiBoxes题意:长度为n的数组,你可以逆转最多k长度,问你能不能是数组递增思路:如果k>=2那么每个数都可以两两交换,如果下表1的地方是1就一定可以,k=1的话单独讨论usingnamespacestd;voidsolve(){ intn,k; cin>>n>>k; vector<int>a(n+1); for(inti=1;i<=n;i++){ ......