Codeforces Round #661 (Div. 3)题解

A、Remove Smallest(模拟)

在这里插入图片描述

#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 50007;

int a[N];
int n, m, t;
int main()
{
    scanf("%d", &t);
    while(t -- ){
        scanf("%d", &n);
        bool flag = 0;
        for(int i = 1; i <= n; ++ i){
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + 1 + n);
        for(int i = 1; i < n; ++ i){
            if(a[i + 1] - a[i] > 1){
                flag = 1;
                break;
            }
        }
        if(!flag)puts("YES");
        else puts("NO");
    }
    return 0;
}

B、Gifts Fixing(模拟)

![在这里在这里插入图片描述

#include<iostream>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int N = 50007, INF = 0x3f3f3f3f;
int n, m, t;
int a[N], b[N];
int mina, minb;
int main(){
    cin >> t;
    while(t -- ){
        cin >> n;
        mina = INF, minb = INF;
        for(int i = 1; i <= n; ++ i){
            cin >> a[i], mina = min(mina, a[i]);
        }
        for(int i = 1; i <= n; ++ i)
        cin >> b[i], minb = min(minb, b[i]);
        ll ans = 0;
        for(int i = 1; i <= n; ++ i){
            ans += max(a[i] - mina, b[i] - minb);
        }
        cout << ans << endl;
    }
    return 0;
}

C、Boats Competition(暴力枚举)

在这里插入图片描述
直接暴力枚举结果s即可。

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 5007;
int n, m, t;
int a[N];
int main(){
    cin >> t;
    while(t -- ){
        cin >> n;
        for(int i = 1; i <= n; ++ i){
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + 1 + n);
        int res = 0;
        for(int s = 2; s <= 2 * n; ++ s){
            int l = 1, r = n;
            int ans = 0;
            while(l < r){
                if(a[l] + a[r] > s)r -- ;
                else if(a[l] + a[r] < s)l ++ ;
                else ans ++ , l ++ , r -- ;
            }
            res = max(res, ans);
        }
        cout << res <<endl;
    }
    return 0;
}

D、Binary String To Subsequences(字符串,类并查集)

在这里插入图片描述

在这里插入图片描述

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>

using namespace std;

const int N = 500007;

int pre[N][2], a[N];
int last[2];
int ans[N];
string s;
int n, m;
int t;
int num[N];
bool vis[N];
int cnt;
int find(int x, int val)
{
    if(!x)return 0;
    if(!vis[x])
    {
        vis[x] = 1;
        return x;
    }
    return pre[x][val] = find(pre[x][val], val);
}

int main(){
    scanf("%d", &t);
    while(t -- ){
        memset(vis, 0, sizeof vis);
        memset(num, 0, sizeof num);
        scanf("%d", &n);
        int res = n;
        cnt = 0;
        cin >> s;
        last[0] = last[1] = 0;
        for(int i = 1; i <= n; ++ i){
            a[i] = s[i - 1] - '0';
            pre[i][a[i] ^ 1] = last[a[i] ^ 1];
            pre[i][a[i]] = last[a[i]];
            last[a[i]] = i;
            ans[i] = i;
        }
        for(int i = 1; i <= n; ++ i){
            int point = find(pre[i][a[i] ^ 1], a[i] ^ 1);
            if(point){
                res -- ;
                ans[i] = ans[point];
            }
        }
        printf("%d\n", res);
        for(int i = 1; i <= n; ++ i){
            if(!num[ans[i]])
                num[ans[i]] = ++ cnt;
            printf("%d ", num[ans[i]]);
        }
        puts("");
    }
    return 0;
}

E1、Weights Division (easy version)(贪心、树上dfs)

在这里插入图片描述

全部改成long long就A了

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>

#define int long long
typedef long long ll;
using namespace std;
const int N = 500007, M = 5000007;

int n, m;
int head[N], nex[M], ver[M], edge[M], tot;
struct node{
    int val, son;
    bool operator<(const node &t)const {
        return (val - val / 2) * son < (t.val - t.val / 2) * t.son;
    }
};
priority_queue<node>heap;

ll S, sum;
int t;
bool vis[N];

void add(int x, int y, int z){
    ver[tot] = y;
    edge[tot] = z;
    nex[tot] = head[x];
    head[x] = tot ++ ;
}

int dfs(int x, int fa){
    int cnt = 0;//儿子个数
    for(int i = head[x]; ~i;i = nex[i]){
        int y = ver[i], z = edge[i];
        if(y != fa){
            int num = dfs(y, x);
            heap.push({z, num});
            sum += z * num * 1ll;
            cnt += num;
        }
    }
    return max(cnt, 1ll);//可能是叶子节点
}

signed main(){
    scanf("%lld", &t);
    while(t -- ){
        scanf("%lld%lld", &n, &S);
        memset(head, -1, sizeof head);
        memset(vis, 0, sizeof vis);
        sum = 0;
        tot = 0;
        while(heap.size())heap.pop();
        for(int i = 1, x, y, z; i <= n - 1; ++ i){
            scanf("%lld%lld%lld", &x, &y, &z);
            add(x, y, z), add(y, x ,z);
        }
        //int xx = 0;
        dfs(1, 0);
        ll ans = 0;
        while(sum > S){
            auto x = heap.top();
            heap.pop();
            //cout << x.val << "ok" <<x.son <<endl;
            sum -= (x.val - x.val / 2) * x.son *1ll;
            x.val /= 2;
            heap.push(x);
            ans ++ ;
            //cout << sum << endl;
        }
        //cout << xx ++ << endl;
        printf("%lld\n", ans);
    }
    return 0;
}

F、Yet Another Segments Subset(区间DP)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45697774/article/details/108433421