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

Codeforces Round 922 (Div. 2)

时间:2024-02-01 22:55:07浏览次数:22  
标签:int Codeforces cin -- while solve 922 Div dp

Codeforces Round 922 (Div. 2)

ps:25分钟AB都over,C给我打破防了、、、讨厌异或、、、我一直以为是数学结果、、、
只能说一怒之下怒了一下

A. Brick Wall

想法:要使得稳定性高,那么就多用1*2的砖块就行(A题可以直接找规律,通过样例)

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int m, n;
    cin >> m >> n;
    cout << m * (int) (n / 2) << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

B. Minimize Inversions

思路:他要求的是反转对数量最少,什么时候反转对数量会因为交换减少:将这个数本来有反转对到没有反转对,那么我们只看一个排列:很明显,当这个排列里面的反转对减少的时候,要么反转对总数减少,要么不变,所以我们就可以直接让他是反转对就行

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<pair<int, int>> a(n + 1);
    for (int i = 0; i < n; i++) {
        cin >> a[i].first;
    }
    for (int i = 0; i < n; i++) {
        cin >> a[i].second;
    }
    sort(a.rbegin(), a.rend());
    for (int i = n - 1; i >= 0; i--) {
        cout << a[i].first << " ";
    }
    cout << "\n";
    for (int i = n - 1; i >= 0; i--) {
        cout << a[i].second << " ";
    }
    cout << "\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

C. XOR-distance

思路:这题就是求|(a⊕x)−(b⊕x)|的最小值,很明显他的最小值就是说这两个最靠近,这道题又是异或,那么就一位一位来看,假设ab这位相同,那么无论x为多少这位的运算结果都是0,我们要让x小,那么就是0。那么如果他们不一样,怎么判断是否应该有(如果都有的话,那么必为0),最大就是r,那么每次x的增加就应该有"r"的减少,以免x超过r

#include <bits/stdc++.h>

using namespace std;
#define int long long

void solve() {
    int a, b, r;
    cin >> a >> b >> r;
    bool h = true;
    int now = 0;
    for (int i = 60; i >= 0; i--) {
        int a1 = a >> i & 1;
        int b1 = b >> i & 1;
        if (b1 == a1) continue;
        if (h) {
            now = (1ll << i) * (a1 - b1);
            h = false;
        } else {
            if (r >= (1ll << i) && (a1 - b1) * now > 0) {
                r -= (1ll << i);
                now -= (a1 - b1) * (1ll << i);
            } else {
                now += (a1 - b1) * (1ll << i);
            }
        }
    }
    cout << abs(now) << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

D. Blocking Elements

dp+二分

思路:将一个数组分割成x段,有x-1个分割点,找到这x-1个分割点使得每段的和和分割点和的最大值最小。首先我们要让该值最小,那么就来用二分来逼近这个值,很明显我们可以用单调队列来减少计算量,分割点的值就可以用dp来记录,还可以用一点点前缀和优化一下,只要分割点的值之和不大于想,以及这段之间的值不大于x就行

#include   <bits/stdc++.h>

using namespace std;
#define int long long
const int MAX = 1e5 + 10;
int a[MAX], s[MAX];
int n;

bool check(int x) {
    vector<int> dp(n + 2);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
    dp[1] = a[1];
    q.push({0, 0});//勿忘,反正是把我卡了亿下下
    for (int i = 1; i <= n + 1; i++) {
        if (a[i] > x) return false;
        while (q.size() && s[i - 1] - s[q.top().second] > x) q.pop();
        dp[i] = q.top().first + a[i];
        q.push({dp[i], i});
    }
    return (dp[n + 1] <= x);
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        s[i] = a[i] + s[i - 1];
    }
    int l = 0, r = 1e16;
    a[n + 1] = 0;
    s[n + 1] = s[n];
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

标签:int,Codeforces,cin,--,while,solve,922,Div,dp
From: https://www.cnblogs.com/bbbbear/p/18002312

相关文章

  • Codeforces Round 922 (Div. 2) 赛后总结
    自豪的是D题做出来了,悲哀的是B题没能做出来C题的绝对值最小D题,DP存不下状态就把状态放进所求值中比赛快结束的时候,我想,这个B题,它但凡需要我通过归并排序或者树状数组求逆序对,不比C题进制转化要难?于是我就猜了一个结论结论是对的,但不幸的是,我编程实现的时候出错了考虑怎样证......
  • Codeforces Round 770 (Div. 2)(数学异或奇偶性)
    B.FortuneTelling拿到题目看数据范围之后就知道暴力显然是来不及的。那么只能找性质。\(考虑x和x+3的不同\quad奇偶性不同\)\(然后考虑两种操作对于一个数的奇偶性的影响\)\(加法:同奇偶则运算结果是偶,不同则运算结果为奇\)\(异或:惊奇的发现异或也是这样的\)这样我们就......
  • Codeforces Round 922 (Div. 2)
    基本情况A题当时做完提交一直编译错误后面发现是语言选择错误,浪费了五六分钟,然后去做B没想到去看C看了样例感觉可以做,结果干了好久都没出来,倒回去看B还是没做出来,感觉全程很紧张不知道为什么,脚一直在抖。A.BrickWall没啥好说的,就是全部放竖直的,实在不能放了再放横的而且把横......
  • Codeforces Round 921 (Div. 1)
    Preface被折纸狠狠地腐乳了,但好在手速够快光速写完前两题成功把Ohara_Rinne这个号也打上橙了之后就不开其它小号打了,也差不多该尝试去向上挑战了,不然一直呆在舒适圈内也没啥提升的说A.DidWeGetEverythingCovered?直接把序列自动机建出来,不妨设状态\((x,y)\)表示构造了长......
  • Codeforces Round 922 (Div. 2)
    CodeforcesRound922(Div.2)比赛链接A.BrickWall思路简单的模拟,要想实现最高的稳定性,就横着放就可以了,因为长度必须大于等于2,所以最后即使不能被2整除,也可以算在里面Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ intn,......
  • Codeforces Round 922 (Div.2)
    题目链接点这里CF1918ABrickWallvoidsolve(){lln,m;cin>>n>>m;cout<<n*(m/2)<<endl;}CF1918BMinimizeInversions注意到,当其中一个排列有序时,总的逆序对数量最少()今天找个时间补上证明对于任意一对\(i,j\)位置,其可能的逆序对总......
  • Codeforces Round 922 (Div. 2) A-C
    这次还好,虽然还是不够满意,因为D题没写出来。。A一个明显的贪心,都竖着放就好了#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inlineintread(){ charc=getchar();inta=0,b=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1; for(;c......
  • Codeforces Round 922 (A-C)
    第一次打Div2,对我来说还是很难,写篇博客记录一下~A题题意:T组输入,每组输入一个n,m,代表nm大小的地板,以1k大小的地砖完全覆盖地板(k>=2,且同一地板中k可以不同)。将水平放置的地砖与垂直放置的地砖相减的值定义为稳定性,求最大的稳定性是多少。思路:尽可能的使得水平放置的地砖多,垂......
  • CodeForces 1239E Turtle
    洛谷传送门CF传送门放放/ll/ll/ll。这题是个性质题。首先第一排一定是升序,第二排一定是降序。考虑第一排若存在\(i<j\)使得\(a_{1,i}>a_{1,j}\),那么交换这两个数不会变劣。第二排类似。然后发现在\(1\)走下去或在\(n\)走下去最优。考虑先求出从\(1\)走下去的......
  • 2024 蓝桥杯模拟赛 2 (div1+div2)
    A.根据题目模拟#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){inta,p;cin>>a>>p;if(p<16)a=max(0ll,a-10);elseif(p>20){inttmp=p-20;a=max(0ll,a-tmp)......