主頁 >  其他 > AtCoder Beginner Contest 303

AtCoder Beginner Contest 303

2023-05-31 08:37:52 其他

A - Similar String (abc303 a)

題目大意

給定兩個字串,問這兩個字串是否相似,

兩個字串相似,需要每個字母,要么完全相同,要么一個是1一個是l,要么一個是0一個是o

解題思路

按照題意模擬即可,

可以將全部1換成l,全部0換成o,再判斷相等,

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    string s, t;
    cin >> n >> s >> t;
    replace(s.begin(), s.end(), '1', 'l');
    replace(s.begin(), s.end(), '0', 'o');
    replace(t.begin(), t.end(), '1', 'l');
    replace(t.begin(), t.end(), '0', 'o');
    if (s == t)
        cout << "Yes" << '\n';
    else 
        cout << "No" << '\n';

    return 0;
}



B - Discord (abc303 b)

題目大意

給定mn的排列,問有多少對\((i, j),i < j\)沒在這\(m\)個排列里作為相鄰元素出現,

解題思路

set記錄每個相鄰對(小的在左),然后總數減去相鄰對就是答案,

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    set<array<int, 2>> qwq;
    auto add = [&](int x, int y){
        int l = min(x, y), r = max(x, y);
        qwq.insert({l, r});
    };
    for(int i = 0; i < m; ++ i){
        int la = -1;
        for(int j = 0; j < n; ++ j){
            int x;
            cin >> x;
            if (j)
                add(la, x);
            la = x;
        }
    }
    cout << n * (n - 1) / 2 - qwq.size() << '\n';

    return 0;
}



C - Dash (abc303 c)

題目大意

二維迷宮,當前\((0,0)\),生命值h,給定關于 \(LRUD\)的操作序列, 一次移動消耗一生命值,生命值為負則失敗,給定\(m\)個生命值恢復物品坐標,當生命值小于 \(k\)時可以消耗該物品,恢復生命值至\(k\)

問能否執行完給定的操作序列,

解題思路

按照題意模擬即可,可以用set儲存物品下標,

注意物品只能用一次,所以使用的話記得erase

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m, h, k;
    string s;
    cin >> n >> m >> h >> k >> s;
    set<array<int, 2>> item;
    for(int i = 0; i < m ; ++ i){
        int x, y;
        cin >> x >> y;
        item.insert({x, y});
    }
    auto ok = [&](){
        int x = 0, y = 0;
        for(auto &i : s){
            if (i == 'L')
                x --;
            else if (i == 'R')
                x ++;
            else if (i == 'U')
                y ++;
            else if (i == 'D')
                y --;
            else {
                assert(0);
            }
            -- h;
            auto good = item.find({x, y});
            if (h < 0)
                return false;
            if (good != item.end() && h < k){
                h = k;
                item.erase(good);
            }
        }
        return true;
    };
    if (ok())
        cout << "Yes" << '\n';
    else 
        cout << "No" << '\n';

    return 0;
}



D - Shift vs. CapsLock (abc303 d)

題目大意

在鍵盤上輸入aA串,三個操作,一個是按鍵a,一個是按鍵Shift+a,一個是按鍵caplock,效果同正常輸入一樣,分別耗時\(x,y,z\)

問輸入給定aA串所花費的最小時間,

解題思路

\(dp[i][0/1]\)表示輸入完前 \(i\) 個字符,當前caplock燈不亮(亮)的最小花費時間,

然后列舉上一次燈是否亮轉移即可,注意一些特別情況,比如當前caplock燈亮的,輸入a,可以是shift+a,也可以是caplock+a+caplock

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    LL x, y, z;
    string s;
    cin >> x >> y >> z >> s;
    array<LL, 2> dp{0, z};
    for(auto &i : s){
        array<LL, 2> dp2{0, 0};
        if (i == 'a'){
            dp2[0] = min(dp[0] + min(z + y + z, x), dp[1] + min(x, y) + z);
            dp2[1] = min(dp[0] + min(x, y) + z, dp[1] + min(z + x + z, y));
        }else{
            dp2[0] = min(dp[0] + min(z + x + z, y), dp[1] + min(x, y) + z);
            dp2[1] = min(dp[0] + min(x, y) + z, dp[1] + min(z + y + z, x));
        }
        dp.swap(dp2);
    }
    cout << min(dp[0], dp[1]) << '\n';
    return 0;
}



E - A Gift From the Stars (abc303 e)

題目大意

一開始有一些徑訓圖,然后隨便選了兩個度數為\(1\)的不相連通的點,連了一條邊,最終得到了一棵樹,

現給定這棵樹,還原出原來的徑訓圖,以升序告訴每個徑訓圖的邊數,

解題思路

考慮最邊緣(度數為一)的點,其相鄰點必定是徑訓圖的中心,

然后該中心旁邊的旁邊的點又是另外一個中心的旁邊點,即另一個中心與該中心的距離為3,

即我們先去掉所有度數為\(1\)的點, 然后度數變成\(1\)的點就是一個徑訓圖的中心,

再去除度數為 \(1\)的點,剩下的度數為 1的點就是上述中心的相鄰點,

再去除度數為 \(1\)的點,就相當于把最外圍的徑訓圖去掉了,局面變成了一開始的樣子,即此時再去除度數為\(1\)的點,然后度數變成 \(1\)的點就是另一個徑訓圖的中心,

因此對這棵樹作一遍拓撲排序,與最外圍(葉子)的距離 對 \(3\)取模為 \(1\)的點都是徑訓圖的中心,其邊數就是該中心原來的度數,

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    vector<vector<int>> edges(n);
    vector<int> du(n, 0);
    for(int i = 0; i < n - 1; ++ i){
        int u, v;
        cin >> u >> v;
        -- u, -- v;
        edges[u].push_back(v);
        edges[v].push_back(u);
        du[u] ++;
        du[v] ++;
    }
    queue<int> team;
    vector<int> dis(n, -1);
    for(int i = 0; i < n; ++ i)
        if (du[i] == 1){
            dis[i] = 0;
            team.push(i);
        }
    vector<int> ans;
    while(!team.empty()){
        auto u = team.front();
        team.pop();
        if (dis[u] % 3 == 1){
            ans.push_back(edges[u].size());
        }
        for(auto &v : edges[u]){
            if (dis[v] != -1)
                continue;
            du[v] --;
            if (du[v] == 1){
                dis[v] = dis[u] + 1;
                team.push(v);
            }
        }
    }
    sort(ans.begin(), ans.end());
    for(auto &i : ans)
        cout << i << ' ';
    cout << '\n';

    return 0;
}



F - Damage over Time (abc303 f)

題目大意

一個怪物\(h\)血,你有 \(n\)個技能,每回合僅選擇一個釋放,第 \(i\)個技能可以對怪物造成持續\(t_i\)回合的傷害,每回合傷害 \(d_i\)

問將怪物血量變為 \(0\)或以下,最少需要的回合數,

解題思路

初看此題,對于怎么選擇技能感覺比較棘手,原因在于技能是持續傷害而不是一次性的,比如一個技能持續傷害10回,但可能5回合后怪物就死了,這樣該技能實際傷害量只有一半,因此在考慮選擇技能的時候不能僅考慮\(t_i \times d_i\)的值,盡管如此,對于如何選取技能仍沒有頭緒,

細想上述的棘手點,因為持續回合不確定,導致選擇的技能實際造成的傷害是不確定的,如果我們確定了一個持續回合,比如我就打 \(x\)回合,然后看怪物的血量是否變為\(0\)或以下,那么,假設當前是第\(i\)輪的話, 我用什么技能,其實際造成的傷害是確定的,此時那我肯定是貪心地選擇造成傷害最大的一個技能,

因此可以列舉持續的回合數\(x\),然后從第一回合考慮依次使用什么技能,但因為回合數最多高達\(10^{18}\),因此不能列舉,但注意到回合數與怪物剩余血量之間存在單調性,因此我們可以二分這個回合數,然后計算一下怪物的血量能否變為 \(0\)或以下,

假設列舉的回合數為 \(x\),當前處在第 \(i\)回合,也就是說接下來使用的技能傷害最多持續\(t = x - i + 1\)回合,我們考慮使用什么技能,

根據技能生效的回合數\(t_i\)\(d\)的關系,可以將技能分成兩類:

  • 剩余回合能完整造成傷害的,即造成傷害數為\(t_i \times d_i\)(即 \(t_i \leq t\)
  • 剩余回合不能完整造成傷害的,即造成傷害數為\(t \times d_i\)(即 \(t_i > t\)

將技能按照\(t_i\)升序排序,前一類是\(t_i \leq t\) ,我們預處理一個關于\(t_i \times d_i\)的前綴最大值,后一類因為 \(t\)是固定的,因此就要找一個滿足\(t_i > t\)最大的\(d_i\),因此再處理一個關于\(d_i\)的后綴最大值,

對于當前回合使用的技能,就取這兩類技能中造成傷害值較大的那個,

由于回合數高達\(10^{18}\),一回合一回合考慮會超時,因此考慮能否多回合地考慮,

如果此時傷害值較大的第一類技能,那么包括這回合之后的回合,我們肯定是一直使用這個技能(因為它始終是第一類技能(能完整造成傷害)中傷害最大的,而第二類技能的傷害會隨著\(t\)減少而更少,不會比第一類傷害值大),直到剩下的回合數不足以該技能完整造成傷害,再重新考慮,即持續使用\(cnt = t - t_i + 1\)次,造成\(cnt \times t_i \times d_i\)的傷害,之后該技能變成了第二類,

而如果傷害值較大的是第二類技能,那么包括這回合之后的回合,我們還是一直使用這個技能(因為它始終是第二類技能(不能完整造成傷害)中傷害最大的),但由于隨著不斷的使用,其造成的傷害會越來越少(剩余回合\(t\)不斷變小),因此直到其傷害值小于第一類技能的最大值,再重新考慮,即持續使用\(cnt = t - \lfloor \frac{max_1}{d_i} \rfloor\)次,造成\(d_{max} \times (t + t - 1 + t - 2 + \cdots + t - cnt + 1) = d_{max} \times \frac{(t + t - cnt + 1)cnt}{2}\)傷害,其中\(max_1\)是第一類技能造成傷害的最大值,

這樣每個技能最多考慮兩次(一次第一類,一次第二類),因此驗證的復雜度為\(O(n)\)

總的時間復雜度就是 \(O(n\log n)\)

由于回合數有\(O(10^{18})\),技能總傷害也有\(O(10^{18})\),驗證時可能會超 long long范圍,因此得開__int128

神奇的代碼
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    LL h;
    cin >> n >> h;
    vector<array<LL, 3>> spell(n); // t * d, t, d
    for(auto &i : spell){
        cin >> i[1] >> i[2];
        i[0] = i[1] * i[2];
        i[1] = -i[1];
    }
    sort(spell.begin(), spell.end(), [](const auto& a, const auto&b){
            return a[1] > b[1]; // t, small first
        });
    vector<array<LL, 3>> premax(n);
    premax[0] = spell[0];
    for(int i = 1; i < n; ++ i){
        premax[i] = max(premax[i - 1], spell[i]);
    }
    auto check = [&](LL x){
        int pos = n - 1;
        __int128 cur = h;
        LL sufmax = 0;
        while(cur > 0 && x > 0){
            while(pos >= 0 && -premax[pos][1] > x){
                sufmax = max(sufmax, spell[pos][2]);
                -- pos;
            }
            if (pos < 0 || premax[pos][0] < __int128(1) * sufmax * x){
                __int128 down = 0;
                if (pos >= 0)
                    down = premax[pos][0] / sufmax;
                __int128 cnt = x - down;
                __int128 sum = cnt * (x - cnt + 1 + x) / 2 * sufmax;
                cur -= sum;
                x -= cnt;
            }else{
                __int128 cnt = x - -premax[pos][1] + 1;
                cur -= cnt * premax[pos][0];
                x -= cnt;
            }
        }
        return cur <= 0;

    };
    LL l = 0, r = 1e18;
    while(l + 1 < r){
        LL mid = (l + r) >> 1;
        if (check(mid))
            r = mid;
        else 
            l = mid;
    }
    cout << r << '\n';

    return 0;
}



G - Bags Game (abc303 g)

題目大意

<++>

解題思路

<++>

神奇的代碼



Ex - Constrained Tree Degree (abc303 h)

題目大意

給定一個集合,其元素范圍在\(1 \sim n - 1\)內,

問有多少棵\(n\)個節點的數,其每個節點的度數都屬于該集合里,

解題思路

<++>

神奇的代碼



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553869.html

標籤:其他

上一篇:Kali滲透Windows服務器

下一篇:返回列表

標籤雲
其他(160033) Python(38189) JavaScript(25464) Java(18161) C(15234) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7217) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4579) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1927) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • AtCoder Beginner Contest 303

    ## [A - Similar String (abc303 a)](https://atcoder.jp/contests/abc303/tasks/abc303_a) ### 題目大意 給定兩個字串,問這兩個字串是否相似。 兩個字串相似,需要每個字母,要么完全相同,要么一個是`1`一個是` ......

    uj5u.com 2023-05-31 08:37:52 more
  • Kali滲透Windows服務器

    這個實驗主要讓我們學習漏洞掃描技識訓本原理,了解其在網路攻防中的作用,掌握使用Kali中的Metasploit對目標主機滲透,并根據報告做出相應的防護措施。 ......

    uj5u.com 2023-05-31 08:37:31 more
  • 輔助測驗和研發人員的一款小插件【資料安全】

    ## 一、為什么要做一款這樣的小插件 資料,一直在思考如何讓資料更安全的流轉和服務于客戶,圍繞這樣的想法,我們做過許多方面的擴展。我們落地了服務端的資料切片支持場景化的設計,實作了基于JDBC協議對SQL的攔截與切片,實作了在應用層的全鏈路資料庫審計方案和實作,實作了WEB端明暗水印和檔案水印等等, ......

    uj5u.com 2023-05-31 08:37:14 more
  • 機器學習-KNN演算法

    ##### 1. 演算法原理(K-Nearest Neighbor) - 本質是通過距離判斷兩個樣本是否相似,如果距離夠近就認為他們足夠相似屬于同一類別 - 找到離其最近的 k 個樣本,并將這些樣本稱之 為「**近鄰**」(nearest neighbor)。 - 對這 k 個近鄰,查看它們的都屬于何 ......

    uj5u.com 2023-05-31 08:37:10 more
  • 【智能軟體安全】上海道寧為您帶來智能軟體安全平臺——?Veracod

    Veracode可以全面地 保護您構建和管理地應用程式 在現代軟體 開發生命周期的 每個階段不斷發現并修復缺陷 Veracode通過 建立一種在安全和開發團隊之間 架起橋梁并授權 開發人員成為 安全倡導者的積極文化 從一開始就防止常見的安全漏洞 開發商介紹 Veracode成立于2006年,起初是一 ......

    uj5u.com 2023-05-31 08:36:56 more
  • 百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測識別系統 基于 Padd

    [toc] [百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測識別系統 預測部署簡介與總覽](https://www.cnblogs.com/vipsoft/p/17439619.html) [百度飛槳(PaddlePaddle) - PP-OCRv3 文字檢測識別系統 Padd ......

    uj5u.com 2023-05-31 08:36:42 more
  • 牛客小白月賽73

    # A.最小的數字 ### 題目: ![](https://img2023.cnblogs.com/blog/2960080/202305/2960080-20230526220648535-777334559.png) ### 分析: 簡單列舉一下,找到第一個大于等于n的且是3的倍數的數 ### ......

    uj5u.com 2023-05-31 08:36:21 more
  • 詳解RocketMQ 順序消費機制

    摘要:順序訊息是指對于一個指定的 Topic ,訊息嚴格按照先進先出(FIFO)的原則進行訊息發布和消費,即先發布的訊息先消費,后發布的訊息后消費。 本文分享自華為云社區《RocketMQ 順序消費機制》,作者: 勇哥java實戰分享 。 順序訊息是指對于一個指定的 Topic ,訊息嚴格按照先進先 ......

    uj5u.com 2023-05-31 08:35:55 more
  • 隱私合規相關法律法規合集

    01中華人民共和國網路安全法(全文)201611.pdf 02資訊安全技術 個人資訊安全規范GB:T 35273—2017.pdf 03開展App違法違規收集使用個人資訊專項治理-中共中央網路安全和資訊化委員會辦公室201901.pdf 04App違法違規收集使用個人資訊自評估指南201903.pd ......

    uj5u.com 2023-05-31 08:35:46 more
  • 5年測驗工程師經歷,下一步轉開發還是繼續測驗?

    測驗五年,沒有積累編程腳本能力和自動化經驗,找作業時都要求語言能力,自動化框架。
    感覺開發同事積累的經歷容易找作業。
    下一步,想辦法轉開發崗還是繼續測驗???
    正常情況下,有了四年的測驗工程師經歷,應該可以達到中級測驗工程師的水平了。作為一個初中級測驗工程師下一步是轉開發還是繼續做測驗,個人建議是做... ......

    uj5u.com 2023-05-31 08:35:29 more