首页 > 其他分享 >Codeforces Round 920 (Div. 3)

Codeforces Round 920 (Div. 3)

时间:2024-01-28 20:23:11浏览次数:30  
标签:cout int cin long Codeforces 920 tie Div define




A - Square

难度: ⭐

题目大意

给定正方形的四个顶点, 求该正方形的面积;

解题思路

根据四个点找出长和宽即可, 因为数据范围有负数, 为了方便我都进行了移位;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
signed main() {
    int t;
    cin >> t;
    while(t--){
        int a = 0, b = 0, l, r;
        for(int i = 1; i <= 4; i++){
            int x, y;
            cin >> x >> y;
            if(!a) a = x + 10000;
            else if(x + 10000 != a) l = abs(a - x - 10000);

            if(!b) b = y + 10000;
            else if(y + 10000 != b) r = abs(b - y - 10000);
        }
        cout << l * r << endl;
    }
    return 0;
}




B - Arranging Cats

难度: ⭐⭐

题目大意

给定两个由01组成的字符串S1, S2; 可以对S1进行三种操作: 把1变成0; 把0变成1; 把某个1和某个0互换位置;
请问最少进行多少次操作可以让其转变成S2;

解题思路

分析三种操作可以发现肯定是优先进行第三种操作; 设两个字符串有x个位置数字不同, 这其中有a个S1是1, b个S2是1 (b = x - a); 我们可以用这a个1转移到那b个1的位置, 少了就再加, 多了就删去; 最终发现操作次数就是a和b中的最大值;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m;
signed main() {
    int t;
    cin >> t;
    while(t--){
        cin >> n;
        string s1, s2;
        cin >> s1 >> s2;
        int a = 0, b = 0;
        for(int i = 0; i < n; i++){
            if(s1[i] != s2[i]){
                if(s1[i] == '1') a++;
                else if(s2[i] == '1') b++;
            }
        }
        cout << max(a, b) << endl;
    }
    return 0;
}




C - Sending Messages

难度: ⭐⭐

题目大意

小莫的手机在时刻0还有m格电量; 小莫需要在n个不同时刻给安姐发消息; 手机亮屏x时间消耗a * x格电量, 小莫还可以选择息屏, 到该发消息时再亮屏; 息屏需要b格电量, 息屏期间不耗电; 默认发信息时不耗电; 请问小莫是否可以用m格电路坚持发完最后一个消息; 注意如果x时刻需要发信息, 但是x时刻刚好没电, 那么消息就发不出去;

解题思路

一开始以为是个dp, 结果发现想多了, 只需要贪心就行; 对于每两个时刻之间的间隔, 分析是亮屏还是息屏更优;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m;
int p[N];
signed main() {
    int t;
    cin >> t;
    while(t--){
        int a, b, res = 0;
        cin >> n >> m >> a >> b;
        for(int i = 1; i <= n; i++){
            cin >> p[i];
            if(a * (p[i] - p[i - 1]) >= b){
                res += b;
            }
            else res += a * (p[i] - p[i - 1]);
        }
        if(res < m) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}




D - Very Different Array

难度: ⭐⭐⭐

题目大意

安姐有一个n个数的数组A, 小莫有一个m个数的数组B; 小莫想从中选出n个数并且排列成数组C, 使得$\Sigma$|Ai - Ci|最大

解题思路

因为是求和, 所以数组A的顺序也就无所谓了; 题意也就变成找出n对(Ai, Ci), 使得$\Sigma$|Ai - Ci|最大; 这就有两种情况, 是Ai - Ci (Ai大)还是Ci - Ai (Ci大), 这里我们需要找出此时A中的最大值和最小值以及C中的最大值和最小值, 带入进去试一试看谁的差值大就选谁, 然后把那两个数去掉再找下一对即可, 有点贪心的意思; 找的过程可以用双指针;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m;
int a[N], b[N];
signed main() {
    int t;
    cin >> t;
    while(t--){
        cin >> n >> m;
        for(int i = 1; i <= n; i++) cin >> a[i];
        for(int i = 1; i <= m; i++) cin >> b[i];
        sort(a + 1, a + 1 + n);
        sort(b + 1, b + 1 + m);
        int al = 1, bl = 1, ar = n, br = m;
        int res = 0;
        for(int i = 1; i <= n; i++){
            int x = a[ar] - b[bl];;
            int y = b[br] - a[al];
            if(x > y){
                res += x;
                ar--, bl++;
            }
            else{
                res += y;
                br--, al++;
            }
            
        }
        cout << res << endl;
    }
    return 0;
}




E - Eat the Chip

难度: ⭐⭐⭐

题目大意

给定一个n * m的网格, 小莫和安姐各持一枚棋子, 小莫的棋子只能从上往下走, 而安姐只能从下往上走; 两者具体的移动方式就是往自己的正前方或左前方或右前方前进一格; 如果某人的棋子正好落在对方的棋子上, 那么他就赢了; 给定两枚棋子的初始位置, 判断谁会赢; 如果最后小莫走到了最下面一行, 而安姐走到了最上面一行, 那么算平局; 小莫先走;

解题思路

当两人还面对着时, 每走一次都会缩小两人之间的间距; 所以我们可以根据初始间距判断两人到横坐标相同时各需要行动多少次; 然后算出这两人在这一横坐标下所能覆盖的纵坐标范围有多大, 如果其中某个人可以覆盖掉对方的范围, 并且此时还是他的回合, 那么他就必胜; 至于此时是谁的回合也是用初始横坐标间距来算;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m;
int a[N], b[N];
signed main() {
    int t;
    cin >> t;
    while(t--){
        int h, w, xa, ya, xb, yb;
        cin >> h >> w >> xa >> ya >> xb >> yb;
        int hl = xb - xa - 1, wl = abs(yb - ya) - 1;
        if(hl < 0) cout << "Draw" << endl;
        else if(hl % 2){
            int la = max(1ll, ya - hl / 2 - 1);
            int ra = min(w, ya + hl / 2 + 1);
            int lb = max(1ll, yb - hl / 2 - 1);
            int rb = min(w, yb + hl / 2 + 1);
            if(lb <= la && rb >= ra){
                cout << "Bob" << endl;
            }
            else cout << "Draw" << endl;
        }
        else {
            int la = max(1ll, ya - hl / 2 - 1);
            int ra = min(w, ya + hl / 2 + 1);
            int lb = max(1ll, yb - hl / 2);
            int rb = min(w, yb + hl / 2);
            if(la <= lb && ra >= rb){
                cout << "Alice" << endl;
            }
            else cout << "Draw" << endl;
        }
    }
    return 0;
}




F - Sum of Progression

难度: ⭐⭐⭐⭐

标签:cout,int,cin,long,Codeforces,920,tie,Div,define
From: https://www.cnblogs.com/mostimali/p/17993248

相关文章

  • Codeforces Round 921 (Div. 2) A-D
    倒叙讲题预警()传送门:https://codeforces.com/contest/1925D.GoodTrip题意:有n个小盆友,其中m对是好盆友,每队好盆友有友谊度fi。老师要举办k次远足,每次挑一对小盆友去,被挑到的小盆友友谊值+1。如果一对儿童不是朋友,那么他们的友谊值为0,在以后的游览中不会改变。求所有被选中参......
  • Codeforces Round 921 (Div. 1) 记录(A-D)
    比赛链接:https://codeforces.com/contest/1924官解链接:https://codeforces.com/blog/entry/125137这场整体来说表现还可以,最终performance\(2431\),delta\(+33\)。A.DidWeGetEverythingCovered?还不错的贪心题。进入状态有点慢,写了几个小错误B.SpaceHarbourC.Frac......
  • Codeforces Round 921 (Div. 2) 赛后总结
    搜索替换int->longlong是一个好习惯赛后5分钟就改对E题了,好可惜。不过1个小时都没能做出来,也说明自己不太熟练吧线段树善于维护满足区间可加性的一类信息,这与本题中的代价和相契合。特殊之处在于其修改方式。每个区间会在线段树上被划分为\(O(log_{2}n)\)个小区间即使是最......
  • Codeforces Round 921 (Div. 2)
    CodeforcesRound921(Div.2)比赛地址A.WeGotEverythingCovered!思路这个就是一个简单的拼接,这里很容易的发现我们最后最优的方法就是将所要拼写的字母按顺序拼接成n份就好了,但是这里需要主义一下简单的优化Code#include<bits/stdc++.h>usingnamespacestd;#define......
  • CodeForces 1924C Fractal Origami
    洛谷传送门CF传送门对这种题一点办法都没有。。。可以手动折叠发现\(n=3\)时\(M=2+2\sqrt{2},V=2+4\sqrt{2}\)。于是大胆猜结论,第二次折叠开始,每次产生的山谷和山峰的长度相等。为什么呢?考虑从第二次折叠开始,设当前纸的层数为\(k\)(事实上若当前是第\(i\)......
  • CF Round 921 (Div. 2)
    linkA一种可行的方案是将前\(k\)个字母重复\(n\)次,对于每个要找的字符串,从\(n\)段中分别选取一个字符就可以得到。B如果\(x\)是答案的话,它一定满足\(x|n,\frac{x}{n}\leqm\),直接枚举答案,时间复杂度\(O(\sqrtn)\)。C沿着A的思路继续思考,如果能将\(s\)分成至......
  • CodeForces 1924B Space Harbour
    洛谷传送门CF传送门不知道为什么好像大家在这题上花了挺久的。发现对于一对相邻的港口\((x_i,x_{i+1})\),\(x\in(x_i,x_{i+1})\)的花费是\(y_i(x_{i+1}-x)\)。拆开得\(y_ix_{i+1}-y_ix\)。考虑用set维护所有港口,这样可以知道一个港口左边和右边的港......
  • CodeForces 1924D Balanced Subsequences
    洛谷传送门CF传送门发现去掉匹配的\(2k\)个括号后,剩下的串一定形如\())\ldots)((\ldots(\),其中右括号数量为\(a=m-k\),左括号数量为\(b=n-k\)。考虑把剩下的串像\())\ldots)\mid((\ldots(\)一样分成两半。枚举左半边加入了\(\frac{i}{2}\)对匹配,则......
  • div穿透事件(point-events)
    需求背景:需要通过穿透div对下层的div进行点击或者鼠标滑动事件1.上层div无事件执行,只需在上层元素的样式里添加:point-events:none 2.上层div的某个子元素里有事件执行,想穿透其他没有事件的子元素执行下层div的事件①给上层最外层元素添加:point-events:none②给有事件......
  • hey_left 18 Codeforces Round 920 (Div. 3)
    题目链接A.根据正方形4个角的特性,可以把它们排序处理,得到长和高,相乘得面积#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;boolcmp(pair<int,int>x,pair<int,int>y){if(x.first==y.first)returnx.second<y.second;e......