IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces Round #778 (Div. 1 + Div. 2 based on Technocup 2022 Final Round) -> 正文阅读

[数据结构与算法]Codeforces Round #778 (Div. 1 + Div. 2 based on Technocup 2022 Final Round)

/*
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
^?????????????????????????????????????????????????????????????
*/

A. Maximum Cake Tastiness

直接排序输出前两个元素的和。

可以证明一定存在序列最大值,能够在其左右两侧找到序列次大值并通过一次reverse操作将次大值换到最大值旁边。所以找到最大值次大值相加即可

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 10;
int a[N];

inline void solve(){
    int n = 0; std::cin >> n;
    for(int i = 1; i <= n; i++) std::cin >> a[i];
    std::sort(a + 1, a + 1 + n, [&](int a, int b){ return a > b; });
    std::cout << a[1] + a[2] << '\n';
}

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

B. Prefix Removals

打一个std::map记录每个字符出现的次数。从前往后判断,直到当前字符在后面不再出现。

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 10;
int a[N], vis[N];

inline void solve(){
    std::string s; cin >> s;
    memset(vis, 0, sizeof vis);
    for(int i = 0; i < s.size(); i++) vis[s[i]]++;
    for(int i = 0; i < s.size(); i++){
        if(vis[s[i]] == 1){
            for(int j = i; j < s.size(); j++) cout << s[j];
            cout << endl;
            return;
        }
        else vis[s[i]] -= 1;
    }
}

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

C. Alice and the Cake

先求出总体的体积,然后开一个优先队列暴力拆解,然后每次判断能否拆解。能拆解就继续拆。如果拆到最后拆不出给定的情况,则输出NO

显然,对于一个数字 n n n,最多拆解 log ? ( n ) \log(n) log(n)次。

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 10;
int a[N];

#define YES std::cout << "YES" << '\n'
#define NO std::cout << "NO" << '\n'

std::priority_queue<int, vector<int>, greater<int>> pq;
std::map<int, int> mp;

inline void solve(){
    mp.clear();
    while(pq.size()) pq.pop();
    int n = 0, sum = 0; std::cin >> n;
    for(int i = 1; i <= n; i++) std::cin >> a[i], sum += a[i], mp[a[i]]++;
    pq.emplace(sum);
    while(pq.size()){
        int now = pq.top(); pq.pop();
        auto fnd = mp.find(now);
        if(fnd == mp.end() || fnd -> second == 0){
            if(now == 1){ NO; return; }
            else { pq.emplace(now >> 1); pq.emplace(now - (now >> 1)); }
        }
        else fnd -> second -= 1;
    }
    YES;
}

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

D. Potion Brewing Class

牛逼

一共有 n n n种药水,现在给你 n ? 1 n - 1 n?1个药水的配比,要求你求出至少要多少瓶药水。

由于题目保证答案一定存在,那么可以认为 n ? 1 n - 1 n?1个药水配比一定构成树形结构。如果构成多个连通块,由于连通块间总配比无法确定而会导致答案不存在。

那么首先建出树的结构,然后从根节点开始对所有的分母分解质因数,然后计算出每个质因子所需的个数。然后从根节点开始更新答案即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 10;
const int MOD = 998244353;
const int maxn = 1e6 + 10;
int prime[maxn];   
int vis[maxn], inv[maxn];     

int a[N], cnt = 0;

#define YES std::cout << "YES" << '\n'
#define NO std::cout << "NO" << '\n'

void get() {
    inv[1] = 1;
    for(int i = 2; i <= 200010; i++){
        inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
    }
    for (int i = 2; i <= 200000; i++){
        if (!a[i]){
            prime[++cnt] = i;
            a[i] = i;
        }
        for (int j = 1; j <= cnt && i * prime[j] <= 200000; j++){
            a[i * prime[j]] = prime[j];
            if (i % prime[j] == 0) break;
        }
    }
}

struct edge{ int v, x, y; };

std::vector<edge> g[N];

int binpow(int x, int y, int mod = MOD, int res = 1){
    for (; y; y >>= 1, (x *= x) %= mod) if (y & 1) (res *= x) %= mod;
    return res;
}

inline void solve(){
    int n = 0, ans = 0; std::cin >> n; 
    for(int i = 1; i <= n; i++) { vis[i] = 0; g[i].clear(); }
    for(int id = 1; id <= n - 1; id++){
        int i, j, x, y; std::cin >> i >> j >> x >> y;
        int d = __gcd(x, y);
        x /= d, y /= d;
        g[i].emplace_back(edge{j, x, y});
        g[j].emplace_back(edge{i, y, x});
    }
    std::function<void(int, int)> dfs1 = [&](int now, int fa){
        for(auto nxt : g[now]){
            int to = nxt.v, nx = nxt.x, ny = nxt.y;
            if(to == fa) continue;
            while(nx > 1){
                if(vis[a[nx]] > 0) vis[a[nx]]--;
                nx /= a[nx];
            }
            while(ny > 1){
                vis[a[ny]]++;
                ny /= a[ny];
            }
            dfs1(to, now);
            nx = nxt.x, ny = nxt.y;
            while(nx > 1){
                vis[a[nx]]++;
                nx /= a[nx];
            }
            while(ny > 1){
                vis[a[ny]]--;
                ny /= a[ny];
            }
        }

        
    };
    
    std::function<void(int, int, int)> dfs2 = [&](int u, int fa, int res){
        ans = (ans + res) % MOD;
        for(auto nxt : g[u]){
            int to = nxt.v, nx = nxt.x, ny = nxt.y;
            if(to == fa) continue;
            dfs2(to, u, (res * inv[nx] % MOD * ny) % MOD);
        }
    };
    dfs1(1, -1);
    int tmp = 1;
    for(int i = 1; i <= n; i++){
        if(vis[i]) tmp = (tmp * binpow(i, vis[i])) % MOD;
    }
    dfs2(1, -1, tmp);
    std::cout << ans << '\n';

}

signed main(){
    ios_base::sync_with_stdio(false);
    get();
    int t = 0; std::cin >> t;
    while(t--) solve();
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:49:54  更:2022-03-22 20:53:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:21:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码