The 2023 ICPC Asia Macau Regional Contest (2023澳门区域赛ADIJ)

2023 ICPC 网络赛 第一场 部分题解 (待完善) ch1 即上一层所有字符的方案数 - 上一层ch1的方案数。2.所有连通块都是满连通块。 阅读详情

J. Teleportation

分析:发现这是一个最短路问题之后,想办法把边构造出来,这个题目的核心就是认识到,0是一个特殊点,这个点只能有出边,而不能有入边,应该要引入新的点n来代替0这个点,同时i 到 i + 1的距离都是1,以及i到i + a[i] 的距离都是1是一个很自然的事情,跑最短路就可以了。

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define PII pair<int , int>
// 0 和 n 都必须考虑到 ,n是引入的虚拟起点
// 区别就是 0可以当出边但是不能当出边 
// 因为本身上0只能出去一次就不会再回来了
// 终点是 0 的都应该转换成 n , 这是 n 的入边,同时 n 本身和 0 能够到达的点是一样的 ,这是 n 的出边
int main(){
    int n, x;
    cin >> n >> x;
    vector<int> a(n + 1 , 0 );
    vector<int> dist(n + 1, 1e9);
    vector<int> st(n + 1 , 0);
    vector<vector<PII>> adj(n + 1);
    auto add = [&](int u , int v , int w) ->void{
        if(u == v)
            return;
        adj[u].push_back({v, w});
    };
    for (int i = 0; i <= n; i ++){
        cin >> a[i];
        if(i)add(i, (i + 1) == n + 1 ? 1 : i + 1 , 1);
        add(i, (i + a[i % n]) % n == 0 ? n : (i + a[i % n]) % n, 1); 
        
    }
    dist[0] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> q;
    q.push({0, 0});  // 起点
    while(q.size()){
        auto [w , v] = q.top();
        q.pop();
        if(st[v]){
            continue;
        }
        st[v] = 1;
        for(auto [u , w] : adj[v]){
            if( dist[v] + w < dist[u]){
                dist[u] = dist[v] + w;
                q.push({dist[v] + w , u});
            }
        }
    }
    cout << dist[x] << endl;
    return 0;
}

I. Refresher into Midas

分析:注意到时间是有限的,所以可以考虑线性dp动态转移,dp[j]代表第j秒最后一次使用刷新球拥有的爆金币次数,然后在这一秒可以去动态转移下一次刷新球好的两种状态,一种是球好了直接用,一种是等待二者都好了再一起用,不存在第三种情况。

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

void solve(){
    int a, b, m;
    cin >> a >> b >> m;
    vector<int> f(m + 1, 0);   
    // 假设 f[i]代表前i秒最后一次用刷新球的时候的总攻击次数
    f[0] = 2;
    int ans = 2;
    for (int i = 0; i<= m ; i++)
    {
        if(f[i] == 0)
            continue;
        ans = max(ans, f[i] + (m - i) / a); 
        if(i + b <=m)
        {                          
            // 策略一:不一定必须同步 刷新CD好了直接使用
            f[i + b] = max(f[i + b], f[i] + (1 + b / a));
        }
        int time = (b + a - 1) / a * a;  
        //策略二 : 同步CD缓冲好需要的时间 , 二者都CD缓冲好了再用
        if(i + time <= m ){
            f[i + time] = max(f[i + time], f[i] + 1 + time / a);
        }
    }
    cout << ans * 160 << endl;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t;
    cin >> t;
    while(t --)
        solve();
    return 0;
}

A. (-1,1)-Sumplete

分析:思维贪心题。

如果我们先把所有的-1都删除,所有的1都保留(反过来类似)。我们会得到行和列的分别的总和,然后我们就会发现这个时候我们在途中翻转任何一个点的效果都是相同的,都是吧这个点的列和行的总和去减1,所以我们现在只需要求出我们需要修正的行分别需要修正多少,以及每一列需要修正多少,然后贪心的给行排序去修正,再给列排序去修正,看最后能不能修正出一个正确的结果,这样可以保证我们不会从一个比较好的情况到一个更坏的情况 如果这种情况都满足不了 说明其他所有情况更加满足不了。

#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
// 保留全部的 1 然后计算出来需要进行翻转的数量,删除全部的-1,那么不管什么翻转都是对行和列进行-1 
// 现在我们目的是看能不能找出修正的方案
// 策略的话从大到小贪心 先找出最需要修正的行 再在行里面找出最需要修正的列 这样可以保证我们不会从一个比较好的情况到一个更坏的情况 如果这种情况都满足不了 说明其他所有情况更加满足不了
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n ;
    cin >> n ;
    vector<vector<int>> g(n, vector<int>(n));
    vector<vector<int>> ans(n, vector<int>(n , 0));
    vector<int> row(n), col(n);
    vector<int> row_now(n), col_now(n);
    vector<int> nd_row(n), nd_col(n);
    for (int i = 0; i < n ; i++){
        for (int j = 0; j < n; j ++){
            char c;
            cin >> c;
            if( c == '+'){
                g[i][j] = 1;
                ans[i][j] = 1; // 代表没有擦除
            }else{
                g[i][j] = -1;
            }
        }
    }
    for (int i = 0; i < n; i ++)
        cin >> row[i];
    for (int i = 0; i < n; i ++)
        cin >> col[i];
    
    for (int i = 0; i < n; i ++){
        for (int j = 0; j < n; j++){
            if(g[i][j] == 1){
                row_now[i]++;
                col_now[j]++;
            }
        }
    }
    for(int i= 0 ; i < n ; i++){
        nd_row[i] = row_now[i] - row[i];
        nd_col[i] = col_now[i] - col[i];
        if(nd_row[i] < 0 || nd_col[i] < 0)
        { // 然后计算需要减去的-1的数量是多少
            cout << "No" << endl;
            return 0;
        }
    }
    vector<int> vc_row(n), vc_col(n);
    for (int i = 0; i < n; i++)
    {
        vc_row[i] = i;
        vc_col[i] = i;
    }
    sort(vc_row.begin(), vc_row.end(), [&](auto lx, auto ly)
         { return nd_row[lx] > nd_row[ly]; });

    auto correct = [&](int x, int y) -> void{
        // 这个如果翻转的话 就代表两个都进行减1 的操作
        nd_row[x]--, nd_col[y]--;
        ans[x][y] ^= 1;
    };
    for(auto rr : vc_row){
        //现在需要操作的行
        sort(vc_col.begin(), vc_col.end(), [&](auto lx, auto ly)
             { return nd_col[lx] > nd_col[ly]; });
        for(auto cc : vc_col){
            if(nd_col[cc] > 0 && nd_row[rr] > 0){
                correct(rr, cc);
            }
        }
    }
    // 最后判断 nd数组清零了吗
    int fg = 1;
    for (int i = 0; i < n; i++){
        if(nd_row[i] != 0 || nd_col[i] != 0){
            fg = 0;
            break;
        }
    }
    if(!fg)
        cout << "No" << endl;   
    else{
        cout << "Yes" << endl;
        for (int i = 0; i < n; i ++){
            for (int j = 0; j < n; j ++){
                cout << ans[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

D. Graph of Maximum Degree 3

分析:思维图论题。

有些诈骗的意味,题目上的998244353完全就是幌子。我们知道每个点的度数不超过3的话,一个连通图的最大的度数就是3n / 2 ,同时我们还知道一个符合题目要求的连通图的至少包含的点是2*(n - 1),因为题目要求的是对于一个连通图,去掉一种颜色的边,剩下的边构成的图仍然连通,这就告诉我们,每种颜色在一个合法的图中至少是一棵树(这样需要的边是最少的n - 1),所以我们得到了一个先决条件: 3n / 2 >= 2 * (n - 1) ,解出这个式子得到 n <= 4,这就代表我们只需要去找小于等于4的连通块就可以了。

Case1:对于大小为1的连通块,显然就是点的数量。

Case2:对于大小为2且好的连通块,显然是双色边的数量。

Case3:对于大小为3且好的连通块,画了几个图可以知道,就是在Case2双色边的基础上连一个点,这个点满足和双色边的两个点分别有一条边,且边的颜色不想吐。

Case4:对于大小为4且好的连通块,且当大小为4的连通块是好的时候一定是一个独立的块,因为每种颜色的边都至少要形成一颗树,一种颜色需要三条边,两种颜色就需要6条边,则内部的点的度数就是12,所以这个块必须是独立的,因此我们对于所有连通的大小为4的独立块,去检查两种颜色是否让四个点连通即可,非常基础的并查集。

#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define ll long long
#define PII pair<int, int>
#define x first
#define y second
const int N = 100010;
vector<PII> adj[N];     // 邻接表
set<PII> edges[2];      // 根据颜色存边
bool vis[N]; // 还没有遍历到过
set<PII> st2;
int p1[N], p0[N];
void init()
{
    for (int i = 1; i < N; i++)
        p1[i] = i, p0[i] = i;
}
int find(int p[], int x)
{
    if (x == p[x])
        return x;
    return p[x] = find(p, p[x]);
}
void merge(int p[], int x, int y)
{
    int rtx = find(p, x), rty = find(p, y);
    if (rtx != rty)
    {
        p[rty] = rtx;
    }
}
void solve()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int u, v, c;
        cin >> u >> v >> c;
        edges[c].insert({u, v});
        edges[c].insert({v, u});
        if (c == 1)
        {
            merge(p1, u, v);
        }
        else
        {
            merge(p0, u, v);
        }
        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
    }
    int ans = 0;
    for (auto [u, v] : edges[1])
    {
        if (edges[0].count({v, u}))
        {
            ans++;
            st2.insert({u, v});
        }
    }
    ans /= 2;  // 双色边的数量
    ans += n;  // 加上顶点的数量
    int cnt = 0;
    for (auto [u, v] : st2)
    {
        // 寻找包含 3 个点的连通块
        for (auto [w, c] : adj[v])
        {
            // 看是否和两个点都有连边并且都不相同
            if (edges[1].count({u, w}) && edges[0].count({v, w}) || edges[0].count({u, w}) && edges[1].count({v, w}))
            {
                cnt++; // 同一个块会被搜到两遍
            }
        }
    }
    ans += cnt / 2;
    // 最后找连通块大小为4的进行判断
    auto dfs = [&](auto &&dfs, int u, vector<int> &points) -> void  
    {
        vis[u] = 1;
        points.push_back(u);
        for (auto [v, c] : adj[u])
        {
            if (!vis[v])
            {
                dfs(dfs, v, points);
            }
        }
    };
    auto check = [&](vector<int> &pots) -> bool
    {
        for (int i = 1; i < 4; i++)
        {
            int u = pots[i - 1], v = pots[i];
            if (find(p1, u) != find(p1, v))
            {
                return false;
            }
            if (find(p0, u) != find(p0, v))
            {
                return false;
            }
        }
        return true;
    };
    for (int i = 1; i <= n; i++)
    {
        if (vis[i])
            continue;
        vector<int> points;
        dfs(dfs, i, points);
        if (points.size() != 4)
            continue;
        if (check(points))
        {
            ans++;
        }
    }
    cout << ans << endl;
}
int main()
{
    init();
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    solve();
    return 0;
}

The 2020 ICPC Asia Macau Regional Contest G题解 原题目: Grammy is playing a game with her roommate Alice on a sequence A with n non-negative integers A1,A2,…,An. The rules of the game are described as follows. They play the game by moving the single token on the sequence, initially the token is at position 阅读详情

相关推荐

西工大noj100题python2024第三季21-30

【代码】西工大noj100题python2024第三季21-30。

weixin_70523540的博客 1578

【888题竞赛篇】第五题,2023ICPC澳门-传送(Teleportation)

本题通过将问题转化为图论中的最短路径问题,并使用 Dijkstra 算法来高效求解。算法的关键在于合理构建图结构,并充分考虑不同操作的边权关系。通过引入虚拟节点,处理特殊情况,使得问题的求解更加简洁明了。这种图论思想在处理类似问题时具有广泛应用,特别是在路径规划与最优决策问题中。

Dashcoding213的博客 2223

别再手动切换了!用SP3485+三极管搞定RS485自动收发电路(附完整原理图)

本文详细介绍了如何利用SP3485芯片和三极管设计RS485自动收发电路,解决传统手动切换带来的IO资源占用和软件复杂度问题。通过原理分析、电路设计拆解和实战注意事项,帮助工程师打造稳定可靠的自动收发通信模块,显著提升系统性能和可靠性。

weixin_26833939的博客 513

The 2023 ICPC Asia Regionals Online Contest (2)-2023 ICPC网络赛第二场部分题解 I,M

共n个阶段,要从第0个阶段到达第n个阶段,有两种方法:(1)每天走一个阶段,第n天后到达第n个阶段。(2)开启“挑战” 模式,成功直接到第n阶段,成功概率为p/1e5;共有n道题,每道题有(1-pi)的概率需要 ai 的时间AC,有 pi 的概率需要(ai+bi)的时间AC,最优策略下,只会在一个点挑战,该点成功即到达第n阶段,枚举每个点作为挑战点,取最小值。根据ICPC规则,对于第i道题,它的罚时为从比赛开始直到它被AC的总时间。现给出n道题的ai,bi,qi,求做完所有题目需要的最小期望罚时。

m0_73646108的博客 1515

最新,弱小目标检测数据集,持续更新中。

梳理了最新的下弱小目标检测数据库,方便后续开发使用

weixin_43331421的博客 4097

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1154

2023年,ICPC比赛、CCPC比赛、CCF-CSP考试、蓝桥杯比赛、天梯赛日程

国赛日期:2023年6月10日 报名:2023年4月24日-5月12日。女生专场 重庆 2023年10月21-22日 重庆对外经贸大学。高职专场 嘉兴 2023年10月21-22日 嘉兴职业技术学院。院校报名时间:2022年10月10日——2022年12月16日。港澳站 2023年11月11-12日 香港理工大学、澳门大学。哈尔滨分站赛 2023年11月4-5日 哈尔滨工程大学。深圳分站赛 2023年11月11-12日 深圳技术大学。西安站 2023年10月21-22日 西北工业大学。

海岛Blog 3万+

车载软件架构 —— AUTOSAR Vector SIP包(三)

### 上一篇文章中介绍了AUTOSAR基础软件供应商Vector公司的开发工具链,本文将继续介绍Vector公司的AUTOSAR产品。 ### -> 1、Vector SIP包中的StartApplication ### -> 2、StartApplication如何开始使用

Soly_kun的博客 831

The 2023 ICPC Asia Macau Regional Contest (The 2nd Universal Cup. Stage 15: Macau)

思维转化-1为1,发现性质答案节点小于等于4,发现逆序对之后根据拓扑的性质建图,线性dp,分层图建图

qq_42643660的博客 1100

simulink的Sine Wave 模块详解

模块是 Simulink 中的一个信号源模块,用于生成正弦波信号。该模块可以根据设定的幅值、频率、相位和偏移量,在仿真过程中产生周期性的正弦波形。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要生成正弦波信号的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响仿真结果。

xiaoheshang_123的博客 1052

PyCharm安装PyQt5及工具详细教程

PyCharm是一款功能强大的Python集成开发环境(IDE),而PyQt5是一个用于创建GUI应用程序的流行Python库。在本教程中,我将指导您如何在PyCharm中安装PyQt5及其相关工具,并提供相应的源代码示例。安装完成后,启动PyCharm并创建一个新的项目。为了隔离项目的依赖项,我们建议在PyCharm中使用虚拟环境。在创建项目的过程中,您可以选择创建新的虚拟环境或使用现有的环境。根据您的操作系统,选择适当的版本并按照安装向导的指示进行安装。首先,您需要下载并安装PyCharm。

CfProgram的博客 589

【开源社区openEuler实践】 D. Graph of Maximum Degree 3

【代码】2023 ICPC 亚洲澳门赛区赛 D. Graph of Maximum Degree 3。

way_back__的博客 389

【8】mctp & pldm

异步会check seq,保证不丢包,虽然发一条req,不用等,但是不能发下一条req,等上条response回来后才能发下一条。TO(tag owner)=1是request,TO=0是response,但是异步通信response由0改为1。如下还有kcs,i3c,serial等。

持续更新ing... 1082

第 46 屆 ICPC 東亞洲區域賽(澳門)正式賽 (A,F,K)

icpc澳门的一些简单题

baidu_39314951的博客 472

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

The 2023 ICPC Asia Nanjing Regional Contest (The 2nd Universal Cup. Stage 11: Nanjing)

2023ICPC区域赛南京站

hanghang20030820的博客 1468

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Largest Digit(思维题)

Largest Digit(思维题)

qq_45809243的博客 1369

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【开源社区openEuler实践】 F. Microcycle

e.g.有六条无向边 1 - 2 , 2 - 3, 1 - 3, 4 - 5, 5 - 6, 4 - 6, 1 - 4, 边1 - 4不在环内。【坑点】:不能先用拓扑排序去掉“线头”,然后找权重最小的边所在的环。因为去掉线头后,可能有的边不在环内。

way_back__的博客 341

第46屆ICPC 東亞洲區域賽(澳門)(正式賽).题解

第46屆ICPC 東亞洲區域賽(澳門)(正式賽).题解

JP_f 's blog 404

第46屆ICPC 東亞洲區域賽(澳門)(正式賽)Link-Cut Tree

题解or思路: 首先需要判断成环————》可以用并查集来判断成环 最后DFS遍历一下,记录一下路径,把路径输出就ok了 备注: 因为我们是从小到大开始跑的,所以找到的第一个环,一定是最小环!!! AC代码: #include <iostream> #include <vector> #include <algorithm> #define PII pair<int, int> using namespace std; const int N =

m0_60593173的博客 698

2022年,ICPC比赛、CCPC比赛、CCF-CSP考试、蓝桥杯比赛、天梯赛日程

**ICPC比赛日程(第47届,2022年):** 第一次网络选拔赛 2022年9月18日 第二次网络选拔赛 2022年9月25日 沈阳站 2022年11月5-6日 东北大学 西安站 2022年11月12-13日 西北工业大学

海岛Blog 5万+

第46届ICPC 东亚洲区域赛(澳门)(正式赛) A C F K

A:思维 任意找一条路,如果正着走上坡的次数比下坡多,那么反着走就符合条件了 #pragma GCC optmize(2) #include <bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N = 100; int a[N][N]; int n; bool st[N][N]; int mid = 0; vector<int>g; void solve() {

fdxgcw的博客 1744

2020 ACM-ICPC澳门区域赛 B Boring Problem 主元法

2020 ACM-ICPC澳门区域赛题解B B 给出n≤100n \le 100n≤100个长度为m≤100m \le 100m≤100的串TiT_iTi​和一个串RRR,对每个RRR的前缀,每次在其末尾以PiP_iPi​的概率添加字符i≤k≤26i \le k \le 26i≤k≤26,当生成的字符串SSS中存在一个TiT_iTi​为SSS的子串时停止,求生成的字符串的期望长度。 题解: 对TiT_iTi​建立AC自动机,设tri,jtr_{i,j}tri,j​表示从节点iii添加字符jjj到达的节点,E

ZL的博客 1637

2019ICPC亚洲区域赛日程与2019CCPC比赛日程

银川 8.31 10.19-20 南京 9.01 10.26-27 徐州 9.07 11.02-03 南昌 9.08 11.09-10 沈阳 9.14 11.16-17 上海 9.15 11.23-24 香港 12.01 西安 12.14-15 CCPC网络赛 8.23 东北大学秦皇岛分校 9.21-22 东北林业大学 10.12-13 厦门理工学院10....

海岛Blog 1万+

2021上半年ICPC各类赛事时间日程

ICPC区域赛 截止今日最新经确认的比赛时间更新如下: 昆明(昆明理工大学,线上赛) 2021年4月02-03 银川(宁夏理工学院,现场赛) 2021年5月15-16 沈阳(东北大学,现场赛) 2021年5月22-23 澳门(澳门大学,现场赛) 2021年5月29日 昆明站热身赛 各位同仁: ICPC昆明站前4周的周日

小哈里的博客 1万+

第46届ICPC 东亚区域赛(澳门) A So I‘ll Max Out My Constructive Algor...

🎈文章目录🌴题目描述(大意)🌃解题报告🍬AC代码(c++) 🎉🎉🎉🎉号外号外高校算法学习社区开始新活动啦🚩🚩🚩因为同学们的基础不一样,觉得原来的每日一题比较简单,所以我们决定开设一个普及组一个提高组🙇🙇🙇提高组由我负责,每日一题,我们一起卷起来🚀🚀🚀 🌴题目描述(大意) 给定一张图,图上的(i,j)(i,j)(i,j)点的高度在(i,j)(i,j)(i,j)位置给出。请找出一条经过所有点的路并且下山处数量大于等于上山处。 🌃解题报告 任意找一条路呢,他一定有一个上山数量一个下山数量,他们一定有一个大小关

weixin_52314777的博客 905
上一篇: Codeforces Round 1054 (Div. 3)-G. Buratsuta 3
西望云天
博客等级 码龄3年 74粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值