主頁 >  其他 > AtCoder Beginner Contest 307

AtCoder Beginner Contest 307

2023-06-25 07:58:33 其他

A - Weekly Records (abc307 A)

題目大意

給定\(n\)周每天的散步量,求每周七天的散步量的和,

解題思路

累計求和即可,

神奇的代碼
#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;
    while(n--){
        int sum = 0;
        for(int i = 0; i < 7; ++ i){
            int a;
            cin >> a;
            sum += a;
        }
        cout << sum << ' ';
    }

    return 0;
}



B - racecar (abc307 B)

題目大意

給定\(n\)個字串 \(s\),問能否選擇兩個 \(i,j\),滿足 \(i \neq j\),且 \(s_i + s_j\)是個回文串,

解題思路

只有\(100\)個串,直接 \(O(n^2)\)列舉判斷即可,

判斷回文可以將串反轉后與原先的串比較是否相同,

神奇的代碼
#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<string> s(n);
    for(auto &i : s)
        cin >> i;
    auto palind = [&](int x, int y){
        string l = s[x] + s[y];
        string r = l;
        reverse(r.begin(), r.end());
        return l == r;
    };
    auto ok = [&](){
        for(int i = 0; i < n; ++ i)
            for(int j = 0; j < n; ++ j){
                if (i != j && palind(i, j))
                    return true;
            }
        return false;
    };
    if (ok())
        cout << "Yes" << '\n';
    else 
        cout << "No" << '\n';

    return 0;
}



C - Ideal Sheet (abc307 C)

題目大意

給定兩個二維網格的模式圖,有一些格子是的,有一些格子是透明的,

問能否通過這兩個模式圖得到一個期望的模式圖,要求格子的屬性(透明)相同,

操作是將這兩個模式圖分別蓋印到一個無窮大的二維網格上,僅能蓋一次,然后通過裁剪得到期望模式圖,

注意蓋印的黑色格子都必須保留,不得裁剪掉,

解題思路

因為模式圖大小只有\(10 \times 10\),因此直接 \(O(10^4)\)列舉兩個模式圖的蓋印位置,然后判斷蓋印后的結果是否與期望模式圖相同,

注意蓋印后的黑色格子都必須在期望模式圖范圍內,所以還需統計期望模式圖范圍內的兩個模式圖的黑色格子數,不能有超出期望模式圖范圍的黑色格子,

神奇的代碼
#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);
    array<int, 3> h, w;
    array<vector<string>, 3> d;
    array<int, 3> blk{};

    for(int i = 0; i < 3; ++ i){
        cin >> h[i] >> w[i];
        d[i].resize(h[i]);
        for(int j = 0; j < h[i]; ++ j){
            cin >> d[i][j];
            blk[i] += count(d[i][j].begin(), d[i][j].end(), '#');
        }
    }

    auto check = [&](int x1, int y1, int x2, int y2){
        int tot = 0;
        for(int i = 0; i < h[2]; ++ i)
            for(int j = 0; j < w[2]; ++ j){
                int target = (d[2][i][j] == '#');
                int blk1 = (i >= x1 && j >= y1  && i - x1 < h[0] && j - y1 < w[0] && d[0][i - x1][j - y1] == '#');
                int blk2 = (i >= x2 && j >= y2 && i - x2 < h[1] && j - y2 < w[1] && d[1][i - x2][j - y2] == '#');
                tot += blk1 + blk2;
                if (target != (blk1 || blk2))
                    return false;
            }
        return (tot == blk[0] + blk[1]);
    };

    auto ok = [&](){
        for(int i = -10; i <= 10; ++ i)
            for(int j = -10; j <= 10; ++ j)
                for(int k = -10; k <= 10; ++ k)
                    for(int l = -10; l <= 10; ++ l){
                        if (check(i, j, k, l))
                            return true;
                    }
        return false;
    };

    if (ok())
        cout << "Yes" << '\n';
    else 
        cout << "No" << '\n';

    return 0;
}



D - Mismatched Parentheses (abc307 D)

題目大意

給定一個包含小寫字母、()的字串,每次選擇一個開頭是(,結尾是),且中間不包含這兩個字符的子串,移除該子串,

問最終剩余的字串是怎樣的,

解題思路

每次移除的其實是一個最里面的合法的(),假設有(()()),每次移除的都是最里端的一對(),因此反復這么操作,合法的括號序列都會被移除掉,

因此我們對原字串的每個(統計與之對應的),這樣每個()之間的內容都會被移除,

根據這個對應關系就會跳過一些字串(被移除了),剩下的就是沒被移除的了,

神奇的代碼
#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;
    cin >> n >> s;
    vector<int> r(n, -1);
    stack<int> pos;
    for(int i = 0; i < n; ++ i){
        if (s[i] == '(')
            pos.push(i);
        else if (s[i] == ')' && !pos.empty()){
            r[pos.top()] = i;
            pos.pop();
        }
    }
    for(int i = 0; i < n; ++ i){
        if (r[i] != -1){
            i = r[i];
        }else {
            cout << s[i];
        }
    }
    cout << '\n';

    return 0;
}



E - Distinct Adjacent (abc307 E)

題目大意

給定一個\(n\)個數的環形陣列,每個數的取值為\([1, m]\)

問有多少種取值情況,滿足任意相鄰兩個數不相同,

解題思路

如果不是環形,答案很明顯是\(m \times (m - 1)^(n - 1)\),但由于環形,最后一位的取值難以確定是\(n - 1\)還是 \(n - 2\),這取決于倒數第二位是否和第一位相同,

如何解決呢?其實問題的核心上面已經指明了:倒數第二位是否和第一位相同

  • 如果相同,則最后一位可取\(n - 1\)種情況,
  • 如果不相同,則最后一位可取 \(n - 2\)種情況,

由于每個數都是對稱的,我們假設第一位填的數是 \(1\),然后設 \(dp[i][0/1]\)表示前 \(i\)位,相鄰兩數不同(不考慮首尾),且最后一位與首位數字不同/相同的方案數,轉移就看當前位是否與首位相同,

因為上述我們假定了首位取\(1\),事實上首位取什么值情況都一樣,而它有 \(m\)種取法,因此最終答案就是\(m \times dp[n][0]\)

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

const int mo = 998244353;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    array<int, 2> dp{0, 1};
    for(int i = 1; i < n; ++ i){
        array<int, 2> dp2{};
        dp2[0] = 1ll * dp[0] * (m - 2) % mo + 1ll * dp[1] * (m - 1) % mo;
        if (dp2[0] >= mo)
            dp2[0] -= mo;
        dp2[1] = dp[0];
        dp.swap(dp2);
    }
    cout << 1ll * dp[0] * m % mo << '\n';

    return 0;
}



F - Virus 2 (abc307 F)

題目大意

給定一張無向圖,邊有邊權,

初始有\(a\)個點感染病毒,

持續 \(d\)天,對于第 \(i\)天,所有與已感染病毒的點距離不超過\(x_i\)的點都會被感染病毒,

問每個點第一次被感染病毒的天數,

解題思路

<++>

神奇的代碼



G - Approximate Equalization (abc307 G)

題目大意

給定一個有\(n\)個數的陣列,可進行兩種操作:

  • 選定一個\(i\),令 \(a_i = a_i - 1, a_{i + 1} = a_{i + 1} + 1\)
  • 選定一個\(i\),令 \(a_i = a_i + 1, a_{i + 1} = a_{i + 1} - 1\)

問最少進行的操作次數,使得陣列的極差不超過\(1\)

解題思路

觀察操作,可以發現每次操作后,這個陣列的總和\(sum\)是不變的,(其實可以看成有\(sum\)個小球, \(n - 1\)個隔板,每次操作其實就是移動一個隔板到相鄰位置)

由于極差不超過\(1\),那么最終每個數要么是 \(div = \lfloor \frac{sum}{n} \rfloor\),要么是 \(div + 1\),且至多有\(sum \% n\)個數是后者,問題就是讓哪些數是后者,哪些數是前者,

首先明確一點,如果給定最終的陣列,求將該陣列變成最終陣列的操作次數,其最優方案是可以在\(O(n)\)內求出來,就是依次對每個數\(a_i\),將其變為目標值\(t_i\),需要從后一個數 \(a_{i + 1}\)多少次(操作二),還是多少次(操作一),然后這個的影響是持續的,

現在問題變成了讓哪些數是\(div\),哪些是\(div+1\),這是個分配問題,設 \(dp[i][j]\)表示前 \(i\)個數,還有 \(j\)\(div+1\)的未分配的最小運算元,需要第二維狀態一方面是要確保有\(mod\)\(div + 1\),另一方面是需要知道由于前面的數的操作,當前數變成了多少,

對于當前數\(a_i\),知道了 \(j\),我們就知道前面有多少個數是 \(div+1\),多少個數是\(div\),進而知道,在上述求解操作的影響下, \(a_i\)變成了多少,然后就可以進一步求解 \(a_i\)變成目標數所需要的操作次數了,

注意如果\(mod = sum \% n\)是負數,則可以讓\(div = div - 1, mod = n - mod\),這樣就變回正數了,

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

const LL inf = 1e18;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    vector<LL> a(n);
    for(auto &i : a)
        cin >> i;
    LL sum = accumulate(a.begin(), a.end(), 0ll);
    LL div = sum / n, mod = sum % n;
    if (mod < 0){
        mod = n + mod;
        div --;
    }
    vector<LL> dp(mod + 1, inf);
    dp[mod] = 0;
    LL presum = 0;
    LL tot = 0;
    for(auto &x : a){
        vector<LL> dp2(mod + 1, inf);
        for(int i = 0; i <= mod; ++ i){
            LL cur = x - (tot + mod - i - presum);
            dp2[i] = min(dp2[i], dp[i] + abs(cur - div));
            if (i)
                dp2[i - 1] = min(dp2[i - 1], dp[i] + abs(cur - div - 1));
        }
        presum += x;
        tot += div;
        dp.swap(dp2);
    }
    cout << dp[0] << '\n';

    return 0;
}



Ex - Marquee (abc307 Ex)

題目大意

<++>

解題思路

<++>

神奇的代碼



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

標籤:其他

上一篇:vulnhub靶場搭建

下一篇:返回列表

標籤雲
其他(161544) Python(38244) JavaScript(25513) Java(18251) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7265) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(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 307

    ## [A - Weekly Records (abc307 A)](https://atcoder.jp/contests/abc307/tasks/abc307_a) ### 題目大意 給定$n$周每天的散步量,求每周七天的散步量的和。 ### 解題思路 累計求和即可。 神奇的代碼 ```cpp ......

    uj5u.com 2023-06-25 07:58:33 more
  • vulnhub靶場搭建

    # vulnhub靶場搭建 ## kali虛擬機安裝 ### 1、更新 sudo apt-get update ![image](https://img2023.cnblogs.com/blog/2988012/202305/2988012-20230519234458164-417900736.p ......

    uj5u.com 2023-06-25 07:53:05 more
  • 跨域攻擊的方法介紹

    # 跨域攻擊的方法介紹 [TOC] ## 一、內網中的域林 很多大型企業都擁有自己的內網,一般通過域林進行共享資源。根據不同職能區分的部門,從邏輯上以主域和子域進行區分,以方便統一管理。在物理層,通常使用防火墻將各個子公司及各個部門劃分為不同的區域。 ## 二、跨域攻擊方法 1、常規滲透方法(利用w ......

    uj5u.com 2023-06-25 07:50:57 more
  • C++ 核心指南之資源管理(上)

    C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup、Herb Sutter 等頂尖 C++ 專家創建的一份 C++ 指南、規則及最佳實踐。旨在幫助大家正確、高效地使用“現代 C++”。 這份指南側重于介面、資源管理、記憶體管理、并發等 High-leve ......

    uj5u.com 2023-06-25 07:50:52 more
  • 區塊鏈基礎之密碼學及安全技術

    ### 1.2 密碼學及安全技術 ![i區塊鏈中的密碼學與安全技術](https://upload-images.jianshu.io/upload_images/21415382-a06021e50cc209bf.png?imageMogr2/auto-orient/strip%7CimageVi ......

    uj5u.com 2023-06-25 07:50:47 more
  • 淺談OpenCV的多物件匹配影像的實作,以及如何匹配半透明控制元件,不

    # 淺談OpenCV的多物件匹配透明影像的實作,以及如何匹配半透明控制元件 ### 引子 > 1. OpenCV提供的templateMatch只負責將(相關性等)計算出來,并不會直接提供目標的對應坐標,一般來說我們直接遍歷最高的相關度,就可以得到匹配度最高的坐標。但是這樣一般只能得到一個坐標。 > 2 ......

    uj5u.com 2023-06-25 07:50:39 more
  • TVM 原始碼閱讀PASS — VectorizeLoop

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/17501119.html VectorizeLoop這個PASS就是對標記為`ForKind::kVectorized`的`For`回圈做向量化處理,并對For回圈中的陳述句涉及到的變數,替換為`Ramp`,以便于 ......

    uj5u.com 2023-06-25 07:50:27 more
  • 怎么讓英文大預言模型支持中文?(一)構建自己的tokenization

    代碼地址:https://github.com/taishan1994/sentencepiece_chinese_bpe Part1前言 目前,大語言模型呈爆發式的增長,其中,基于llama家族的模型占據了半壁江山。而原始的llama模型對中文的支持不太友好,接下來本文將講解如何去擴充vocab里 ......

    uj5u.com 2023-06-25 07:50:22 more
  • vulnhub靶場搭建

    # vulnhub靶場搭建 ## kali虛擬機安裝 ### 1、更新 sudo apt-get update ![image](https://img2023.cnblogs.com/blog/2988012/202305/2988012-20230519234458164-417900736.p ......

    uj5u.com 2023-06-25 07:49:38 more
  • TVM 原始碼閱讀PASS — VectorizeLoop

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/17501119.html VectorizeLoop這個PASS就是對標記為`ForKind::kVectorized`的`For`回圈做向量化處理,并對For回圈中的陳述句涉及到的變數,替換為`Ramp`,以便于 ......

    uj5u.com 2023-06-25 07:49:23 more