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

Codeforces Round 881 (Div. 3)

时间:2023-12-03 20:35:34浏览次数:29  
标签:881 int MAX cin Codeforces ++ solve Div dp

Codeforces Round 881 (Div. 3)

A:ABC

A. Sasha and Array Coloring

题意:求最大的着色成本(着色成本是指同一个颜色的最大值-最小值)

思路:肯定不能是相同的,直接最大-最小就行

#include <bits/stdc++.h>

using namespace std;
int a[60];

void solve() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a, a + n);\
    int mi = 0, ma = 0;
    for (int i = 0; i < (n + 1) / 2; i++) {
        ma += a[n - i - 1];
        mi += a[i];
    }
    cout << ma - mi << "\n";
}

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

B. Long Long

题意:操作:a[i]=-a[i];目标:把所有负数搞正所需的最小次数

思路:连在一起的算一次反转就行

#include <bits/stdc++.h>

using namespace std;
const int MAX = 2e5 + 10;
int a[MAX];
#define int long long

void solve() {
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += abs(a[i]);
    }
    int res = 0;
    a[n] = 1;
    for (int i = 0; i < n; i++) {
        if (a[i] < 0 && a[i + 1] == 0) a[i + 1] = -1;
        else if (a[i] < 0 && a[i + 1] > 0) {
            res++;
        }
    }
    cout << sum << " " << res << "\n";
}

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

C. Sum in Binary Tree

题意:给一个二叉树,求1到n的顶点数之和

思路:二叉树直接/2就行

#include <bits/stdc++.h>

using namespace std;
#define int unsigned long long

void solve() {
    int n;
    cin >> n;
    int sum = 0;
    while (n >= 1) {
        sum += n;
        n /= 2;
    }
    cout << sum << "\n";
}

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

D. Apple Tree

能看出是树型dp,写不来一点

题意:两棵树儿子的个数相乘

思路:树形dp+dfs(找儿子个数)

这个点的数要取2*MAX(是以操作来存点)(坑死人!!!)

#include <bits/stdc++.h>

using namespace std;
const int MAX = 4e5 + 10;
int head[MAX], tail[MAX], edge[MAX];//描述一个节点所需的三个参数
int dp[MAX], num[MAX];//num位于同一颗树上的点的数量
int idx = 0;

void add(int a, int b) {
    edge[++idx] = b;
    tail[idx] = head[a];
    head[a] = idx;
}

void dfs(int u, int fa) {
    if (num[u] == 1) {
        dp[u] = 1;
    }
    for (int i = head[u]; i; i = tail[i]) {
        int x = edge[i];
        if (x == fa) continue;
        dfs(x, u);
        dp[u] += dp[x];
    }
}

void solve() {
    int n;
    cin >> n;
    idx = 0;
    for (int i = 1; i <= n; i++) {
        head[i] = 0;
        dp[i] = 0;
        num[i] = 0;
    }//畜生化
    num[1] = 1;
    for (int i = 1; i < n ; i++) {
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
        num[a]++;
        num[b]++;
    }
    dfs(1, 0);
    int m;
    cin >> m;
    while (m--) {
        int a, b;
        cin >> a >> b;
        long long int res = 1ll * dp[a] * dp[b];
        cout << res << endl;
    }
}

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

E. Tracking Segments

题意:区间是美丽:区间上1的数量严格大于0的数量

操作:a[x]=1

目标:至少有一个完美区间

思路:二分+前缀和(用在check上)

#include <bits/stdc++.h>

using namespace std;
const int MAX = 1e5 + 10;
pair<int, int> se[MAX];
int qu[MAX];
int m, n;

bool check(int mid) {
    vector<int> a(n + 1), sum(n + 1);
    for (int i = 1; i <= mid; i++) a[qu[i]]++;
    for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
    for (int i = 1; i <= m; i++) {
        int cnt = sum[se[i].second] - sum[se[i].first - 1];
        if (cnt >= (se[i].second - se[i].first + 1) / 2 + 1) return true;
    }
    return false;
}

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> se[i].first >> se[i].second;
    }
    int q;
    cin >> q;
    for (int i = 1; i <= q; i++) {
        cin >> qu[i];
    }
    int l = 1, r = q;
    while (l < r) {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    if (check(l)) cout << l << "\n";
    else cout << -1 << "\n";

}

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

F不是很懂题目回头再说

标签:881,int,MAX,cin,Codeforces,++,solve,Div,dp
From: https://www.cnblogs.com/bbbbear/p/17873687.html

相关文章

  • [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++){ ......
  • Codeforces Round 908 (Div. 2)
    总结T1题目大意:A,B两人玩游戏,游戏规则如下:整场游戏有多轮,每轮游戏先胜\(X\)局的人获胜,每场游戏先胜\(Y\)局的人获胜。你在场边观看了比赛,但是你忘记了\(x\)和\(y\),只记得总共比了\(1\len\le20\)局,和每局获胜的人,请判断谁获胜了。如果A获胜,输出A,如果B获胜,输......
  • CodeForces 1526F Median Queries
    洛谷传送门CF传送门首先,如果我们确定了\(1,2\)或\(n-1,n\)的位置,我们就能求出原排列。因为题目给了\(p_1<p_2\),所以可以不考虑对称性。也就是说我们知道两个位置是\(1,2\)或\(n-1,n\)但不确定究竟是\(1,2\)还是\(n-1,n\)也可以。然后,如果我们确定......
  • Codeforces Round 878 (Div. 3)
    CodeforcesRound878(Div.3)A:ABCA.CipherShifer题意:在自身后面添加一个字母,但是不能添加自身思路:找到第二个与自身相符的就再找#include<bits/stdc++.h>usingnamespacestd;constintMAX=110;chara[MAX];voidsolve(){intn;cin>>n;for(......
  • [Codeforces] CF1627B Not Sitting
    题意Rahul和Tina在玩一个游戏。游戏在一个\(n\timesm\)的网格图上进行,记第\(r\)行第\(c\)列上的格子为\((r,c)\)。定义\((a,b)\)与\((c,d)\)之间的距离为\(\left|a-c\right|+\left|b-d\right|\)。游戏开始后,Tina会选择恰好\(k\)个格子,并将其涂成粉红色。涂......
  • [Codeforces] CF1659B Bit Flipping
    题面给定一个长为\(n\)的01串,你可以进行\(k\)次操作。每次操作中,你可以选择任意一位,并将除了这一位以外的其它位翻转(\(1\)变\(0\),\(0\)变\(1\)),输出\(k\)次操作后能获得的字典序最大的字符串,并输出每一位在操作中被选择的次数。若有多解输出任意一解。思路可以发现......