主頁 >  其他 > 【ACM演算法競賽日常訓練】DAY16【奇♂妙拆分】【區區區間間間】【小AA的數列】數學 | 位運算 | 前綴和

【ACM演算法競賽日常訓練】DAY16【奇♂妙拆分】【區區區間間間】【小AA的數列】數學 | 位運算 | 前綴和

2023-04-21 08:05:38 其他

DAY16共3題:

  • 奇♂妙拆分(簡單數學)

  • 區區區間間間(單調堆疊)

  • 小AA的數列(位運算dp)

?? 作者:Eriktse
?? 簡介:19歲,211計算機在讀,現役ACM銀牌選手??力爭以通俗易懂的方式講解演算法!??歡迎關注我,一起交流C++/Python演算法,(優質好文持續更新中……)??
?? 閱讀原文獲得更好閱讀體驗:https://www.eriktse.com/algorithm/1119.html

奇♂妙拆分(簡單數學)

根據貪心的想法,若要使得因子盡可能多,那么因子應當盡可能小,大于根號n的因子至多一個,從小到大列舉[1, sqrt(n)]的所有整數,如果i能夠整除n就作為一個因子,

Code:

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

void solve()
{
    int n;cin >> n;
    set<int> st;
    for(int i = 1;i <= n / i; ++ i)
        if(n % i == 0)st.insert(i), n /= i;
    st.insert(n);
    
    cout << st.size() << '\n';
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;cin >> _;
    while(_ --)solve();
    return 0;
}

區區區間間間(單調堆疊)

題意:給定一個陣列,求所有子區間的最大值與最小值的差的和,

如果暴力列舉肯定不行,單單是子區間個數就有n ^ 2個,所以我們應該考慮每一個元素對答案的貢獻,也就是說我們需要知道某個元素a[i]它會在多少個區間里作為最大值,在多少個區間里作為最小值

我們預處理出四個陣列,分別是lmax[], rmax[], lmin[], rmin[]表示點i作為最大值的左右最遠位置,和作為最小值的左右最遠位置(lmax[i] = j,表示在區間[j, i]中的最大值都是a[i],其他的三個陣列類似定義),

用單調堆疊可以處理出這四個陣列,一下以求lmax[]舉例,維護一個單調不增堆疊,堆疊記憶體放的是下標

初始時堆疊內僅有一個a[0] = inf

當我們遇到一個a[i]時,不斷地判斷堆疊頂元素,如果堆疊頂元素比a[i]小,說明這個堆疊頂應當彈出,

當更新完畢后,此時的堆疊頂的右邊相鄰位置就是a[i]往左的最遠的位置了,因為此時堆疊頂是a[i]往左的第一個大于等于a[i]的位置,那么這中間的元素都會小于a[i]

其他的三個陣列類似,注意,如果我們處理lmax用的是單調不增堆疊,那么處理rmax就應當用單調遞增堆疊,而不是單調不減堆疊,否則可能出現區間重復表示或沒有歸屬的問題(自己思考),

Code:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 9, inf =8e18;
int a[N], stk[N], top, lmax[N], rmax[N], lmin[N], rmin[N];

void solve()
{
    int n;cin >> n;
    for(int i = 1;i <= n; ++ i)cin >> a[i];
    a[0] = a[n + 1] = inf;
    
    top = 0;
    stk[++ top] = 0;
    for(int i = 1;i <= n; ++ i)
    {
        while(top && a[i] > a[stk[top]])top --;
        lmax[i] = stk[top] + 1;
        stk[++ top] = i;
    }
    
    top = 0;
    stk[++ top] = n + 1;
    for(int i = n;i >= 1; -- i)
    {
        while(top && a[i] >= a[stk[top]])top --;
        rmax[i] = stk[top] - 1;
        stk[++ top] = i;
    }
    
    
    a[0] = a[n + 1] = -inf;
    top = 0;
    stk[++ top] = 0;
    for(int i = 1;i <= n; ++ i)
    {
        while(top && a[i] < a[stk[top]])top --;
        lmin[i] = stk[top] + 1;
        stk[++ top] = i;
    }
    
    top = 0;
    stk[++ top] = n + 1;
    for(int i = n;i >= 1; -- i)
    {
        while(top && a[i] <= a[stk[top]])top --;
        rmin[i] = stk[top] - 1;
        stk[++ top] = i;
    }
    int ans = 0;
    for(int i = 1;i <= n; ++ i)
    {
        ans += a[i] * (rmax[i] - i + 1) * (i - lmax[i] + 1);
        ans -= a[i] * (rmin[i] - i + 1) * (i - lmin[i] + 1);
    }
    cout << ans << '\n';
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;cin >> _;
    while(_ --)solve();
    return 0;
}

小AA的數列(位運算 | 前綴和)

這道題一看有點懵,感覺不是很好處理,但依然是套路題,

看到異或,我們應該想把每一個二進制位拆分開,實際上這里約32位二進制位可以先認為是相互獨立的,對于每一位都計算出貢獻,然后按照位權重加和即可,

異或題的套路基本都是拆分二進制,整體考慮起來比較復雜,拆分后會簡單很多,

先不管L, R

假如我們考慮陣列1 2 3 4 5的第0位:

獲取第0位后得到b陣列:1 0 1 0 1

因為我們要得到區間內1的個數,所以處理一個異或前綴和p[]是自然而然的,然后我們列舉每一位作為左端點,看看會得到一個怎樣的式子:

\[sum=\sum_{j=i + 1}^{j += 2, j \le n}p[j]\oplus p[i-1] \]

我們知道異或其實就是% 2的加法,也是% 2減法,所以我們將異或前綴和改為普通前綴和p[],以上的柿子可以轉化為:

\[sum=\sum_{j=i + 1}^{j += 2, j \le n}[(p[j] - p[i-1]) (mod 2)] \]

那么我們就可以對p再做一個前綴和p2,但是p2的步長應為2,

然后上面的柿子就等價于(其中l, rj的上下限,需要保證與i - 1奇偶性相同,j的個數為(r - l + 2) / 2):

\[sum=| p2[r] - p2[l - 1] - p[i - 1] * ((r - l + 2) / 2))| \]

因為這個p2存在p2[-1]的情況,所以我們做個小小的便宜,方便代碼的撰寫(其實你想要特判也行,只是不太方便,也容易出錯),

注意一下其他細節即可,

Code:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 109, p = 1e9 + 7, T = 100;
int a[N], b[N], p1[N], p2[N];


signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n, l, r;cin >> n >> l >> r;
    for(int i = 1;i <= n; ++ i)cin >> a[i];
    
    int ans = 0;
    for(int w = 0;w <= 32; ++ w)
    {
        for(int i = 1;i <= n; ++ i)b[i] = a[i] >> w & 1;
        for(int i = 1;i <= n; ++ i)p1[T + i] = (b[i] + p1[T + i - 1]) % 2;
        for(int i = 1;i <= n; ++ i)p2[T + i] = p1[T + i] + p2[T + i - 2];
        
        int sum = 0;
        for(int i = 1;i <= n; ++ i)
        {
            int j1 = max(i + 1, l + i - 1), j2 = min(n, r + i - 1);
            if((j1 - i) % 2 == 0)j1 ++;
            if((j2 - i) % 2 == 0)j2 --;
            if(j2 < j1)continue;
            
            sum += abs(p2[T + j2] - p2[T + j1 - 2] - 
                       p1[T + i - 1] * ((j2 - j1) / 2 + 1));
        }
        ans = (ans + (1ll << w) * sum % p) % p;
    }
    cout << ans << '\n';
    return 0;
}

?? 本文由eriktse原創,創作不易,如果對您有幫助,歡迎小伙伴們點贊??、收藏?、留言??

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

標籤:其他

上一篇:M3AE: Multimodal Representation Learning for Brain Tumor Segmentation with Missing Modalities

下一篇:返回列表

標籤雲
其他(157720) Python(38083) JavaScript(25376) Java(17984) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(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
最新发布
  • 【ACM演算法競賽日常訓練】DAY16【奇♂妙拆分】【區區區間間間】

    DAY16共3題: 奇♂妙拆分(簡單數學) 區區區間間間(單調堆疊) 小AA的數列(位運算dp) 🎈 作者:Eriktse 🎈 簡介:19歲,211計算機在讀,現役ACM銀牌選手🏆力爭以通俗易懂的方式講解演算法!??歡迎關注我,一起交流C++/Python演算法。(優質好文持續更新中……)🚀 🎈 ......

    uj5u.com 2023-04-21 08:05:38 more
  • M3AE: Multimodal Representation Learning for Brain Tumor Seg

    摘要 提出SimCLR,用于視覺表征的對比學習,簡化了最近提出的對比自監督學習演算法,為了理解是什么使對比預測任務能夠學習有用的表示,系統研究了提出框架的主要組成部分,發現: (1)資料增強的組成在定義有效的預測任務中起著關鍵的作用 (2)在表示和對比損失之間引入一個可學習的非線性變換,大大提高了已學 ......

    uj5u.com 2023-04-21 08:05:00 more
  • 閱讀文獻《SCNet:Deep Learning-Based Downlink Channel Predicti

    該文獻的作者是清華大學的高飛飛老師,于2019年11月發表在IEEE COMMUNICATIONS LETTERS上。 文章給出了當用戶位置到信道的映射是雙射時上行到下行的確定映射函式;還提出了一個**稀疏復值神經網路( sparse complex-valued neural network,SC ......

    uj5u.com 2023-04-21 08:04:38 more
  • 不用ChatGPT,只用CodeGeeX with Chat!一樣實作智能問答

    在ChatGPT推出后,許多人發現,它在編程方面也具有強大的能力——在撰寫代碼程序中,如果遇到問題,可以不必去搜索引擎尋找答案,而是直接向ChatGPT提問。不過,在申請使用一些功能時,需要先等待各種waitlist,很多用戶表示等了挺久還沒用上。 有沒有更快的方式,能夠在代碼撰寫環境中,用上智能問 ......

    uj5u.com 2023-04-21 08:04:23 more
  • 我替 OpenAI 實作了 ChatGPT 聊天記錄復制功能

    很多用了官方 ChatGPT 的朋友,是不是都特別畝訓,為啥沒有聊天記錄復制功能? 國內很多鏡像版本都支持的“拷貝”功能,ChatGPT 官方正版居然不支持,實在是太不考慮用戶體驗了! 如何實作? 靈感來自于 Voice Control of ChatGPT,安裝了這個瀏覽器插件后,我們就可以與 C ......

    uj5u.com 2023-04-21 08:04:13 more
  • 1 分鐘給 Siri 升個級!從智Z變身 ChatSiri!

    原文鏈接:https://forum.laf.run/d/79/17 眾所周知,Siri 是一個智 Z!那么如果能接入大火的 chatGPT,是不是就會從智 Z 變成人工智能?! 眾所周知,Laf 是一個集函式、資料庫、存盤為一體的云開發平臺,可以隨時隨地發布上線代碼!那么如果能使用 Laf 來實作 ......

    uj5u.com 2023-04-21 08:04:00 more
  • 玩轉云端 | 算力基礎設施升級,看天翼云紫金DPU顯身手!

    數字時代下,算力成為新的核心生產力,傳統以CPU為核心的架構難以滿足新場景下快速增長的算力需求,具備軟硬加速能力的DPU得以出現并快速發展。天翼云憑借領先的技術和豐富的應用實踐自研紫金DPU,打造為云而生的全新一代云計算體系結構,助力算力基礎設施升級,賦能海量算力高效釋放。 傳統資料中心里,所有的數 ......

    uj5u.com 2023-04-21 07:58:28 more
  • KubeSphere 助力提升研發效能的應用實踐分享

    作者:盧運強,主要從事 Java、Python 和 Golang 相關的開發作業。熱愛學習和使用新技術;有著十分強烈的代碼潔癖;喜歡重構代碼,善于分析和解決問題。原文鏈接。 我司從 2022 年 6 月開始使用 KubeSphere,到目前為止快一年時間,簡要記錄下此程序中的經驗積累,供大家參考。 ......

    uj5u.com 2023-04-21 07:53:07 more
  • 云原生2.0網關API標準發展趨勢

    摘要:Gateway API希望取代Ingress API。 本文分享自華為云社區《云原生2.0網關API標準發展趨勢》,作者:華為云云原生團隊 。 云原生網關API標準背景及發展現狀 Gateway API是一個開源的API標準,源自Kubernetes SIG-NETWORK興趣組。從出身角度講 ......

    uj5u.com 2023-04-21 07:52:04 more
  • 常用內核架構

    本文分享自天翼云開發者社區《常用內核架構》,作者:JackW 宏內核 應用程式呼叫記憶體分配的 API(應用程式介面)函式。 處理器切換到特權模式,開始運行內核代碼。 內核里的記憶體管理代碼按照特定的演算法,分配一塊記憶體。 把分配的記憶體塊的首地址,回傳給記憶體分配的 API 函式。 記憶體分配的 API 函式 ......

    uj5u.com 2023-04-21 07:51:28 more