2024百度之星第二場-小度的01串

補題鏈接:?碼蹄集

一道經典線段樹板子題。

區間修改01置換,區間查詢子串權值。

唯一區別,權值要求的是相鄰字符都不同所需修改的最小字符個數。

我們在線段樹節點上分別維護當前連續區間:

奇數位是0的個數(j0),奇數位是1的個數(j1)。

偶數位是0的個數(o0),偶數位是1的個數(o1)。

以及當前區間的答案ans,是否往子區間延遲lazy。

考慮如何通過維護的信息進行pushup。

如圖所示:

黑色三角:表示虛線左右子區間各自的奇數位置

紅色三角:表示合并后奇數位置。

當左區間是奇數時,黑色三角=紅色三角

要想變成10間斷,要不變成101010...,要不變成0101010....

令 ls是左區間,rs是右區間。

如果變成101010,那就是ans=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1

如果變成010101,那就是ans=總長度-(tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1)

取個max就行。

但當左區間不是奇數,黑色三角!=紅色三角

如果變成101010,那就是ans=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0

如果變成010101,那就是ans=總長度-(tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0)

到這里我們就解決了從子區間到大區間的pushup問題,代碼如下所示。
?

void pushup(int p){int len=tr[p].r-tr[p].l+1;int lenls=tr[ls].r-tr[ls].l+1;if (lenls&1){int sum=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].o0;tr[p].j1=tr[ls].j1+tr[rs].o1;tr[p].o0=tr[ls].o0+tr[rs].j0;tr[p].o1=tr[ls].o1+tr[rs].j1;}else{int sum=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].j0;tr[p].j1=tr[ls].j1+tr[rs].j1;tr[p].o0=tr[ls].o0+tr[rs].o0;tr[p].o1=tr[ls].o1+tr[rs].o1;}
}

pushdown問題,其實比較常規,就是01置換,異或一下就行,代碼如下所示。

void pushdown(int p){tr[ls].laz=tr[ls].laz^tr[p].laz;tr[rs].laz=tr[rs].laz^tr[p].laz;swap(tr[ls].j0,tr[ls].j1);swap(tr[ls].o0,tr[ls].o1);swap(tr[rs].j0,tr[rs].j1);swap(tr[rs].o0,tr[rs].o1);tr[p].laz=0;
}

當我們維護的東西不只是ans的時候,query需要返回一個結構體,因為當查詢的x,y在左右區間都有的時候,需要向上手動合并。

全部問題解決完后,完整代碼如下所示。?

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
#define ls p<<1
#define rs p<<1|1
struct tree{int l,r;int j0,j1,o0,o1;int laz,ans;
}tr[N];
char s[N];
int n,q;
void pushup(int p){int len=tr[p].r-tr[p].l+1;int lenls=tr[ls].r-tr[ls].l+1;if (lenls&1){int sum=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].o0;tr[p].j1=tr[ls].j1+tr[rs].o1;tr[p].o0=tr[ls].o0+tr[rs].j0;tr[p].o1=tr[ls].o1+tr[rs].j1;}else{int sum=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].j0;tr[p].j1=tr[ls].j1+tr[rs].j1;tr[p].o0=tr[ls].o0+tr[rs].o0;tr[p].o1=tr[ls].o1+tr[rs].o1;}
}
void pushdown(int p){tr[ls].laz=tr[ls].laz^tr[p].laz;tr[rs].laz=tr[rs].laz^tr[p].laz;swap(tr[ls].j0,tr[ls].j1);swap(tr[ls].o0,tr[ls].o1);swap(tr[rs].j0,tr[rs].j1);swap(tr[rs].o0,tr[rs].o1);tr[p].laz=0;
}
void build(int p,int l,int r){tr[p].l=l;tr[p].r=r;tr[p].laz=0;if (l==r){tr[p].j0=0;tr[p].j1=0;if (s[l]=='0') tr[p].j0=1;else if (s[l]=='1') tr[p].j1=1;			tr[p].ans=0;return;}int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(p);
}
void update(int p,int x,int y){int l=tr[p].l,r=tr[p].r;if (x<=l&&r<=y){tr[p].laz=tr[p].laz^1;swap(tr[p].j0,tr[p].j1);swap(tr[p].o0,tr[p].o1);return;}if (tr[p].laz) pushdown(p);int mid=(l+r)>>1;if (x<=mid) update(ls,x,y);if (y>mid) update(rs,x,y);pushup(p);
}
tree query(int p,int x,int y){int l=tr[p].l,r=tr[p].r;if (x<=l&&r<=y){return tr[p];}if (tr[p].laz) pushdown(p);int mid=(l+r)>>1;if (y<=mid) return query(ls,x,y);else if (x>mid) return query(rs,x,y);else{struct tree T,a,b;a=query(ls,x,y);b=query(rs,x,y);T.l=a.l;T.r=b.r;int len=T.r-T.l+1;int lenls=a.r-a.l+1;if (lenls&1){int sum=a.j0+a.o1+b.j1+b.o0;T.ans=min(sum,len-sum);T.j0=a.j0+b.o0;T.j1=a.j1+b.o1;T.o0=a.o0+b.j0;T.o1=a.o1+b.j1;}else{int sum=a.j0+a.o1+b.j0+b.o1;T.ans=min(sum,len-sum);T.j0=a.j0+b.j0;T.j1=a.j1+b.j1;T.o0=a.o0+b.o0;T.o1=a.o1+b.o1;}return T;}
}
void co(){for (int i=1;i<=9;i++){cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].laz<<" "<<tr[i].ans<<"||";cout<<"S:";for (int j=1;j<=n;j++){cout<<s[j];}cout<<"\n";cout<<"奇數 0:"<<tr[i].j0<<"| 1:"<<tr[i].j1<<"|||";cout<<"偶數 0:"<<tr[i].o0<<"| 1:"<<tr[i].o1<<"\n";}
}
void work(){cin>>n>>q;for (int i=1;i<=n;i++) cin>>s[i];build(1,1,n);for (int i=1;i<=q;i++){int t,l,r;cin>>t>>l>>r;if (t==1) update(1,l,r);else cout<<query(1,l,r).ans<<"\n";	}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);work();return 0;
} 
/*
10101
000
*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36716.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K8S兩種安裝方式如何選擇?

K8S兩種安裝方式如何選擇&#xff1f;\nKubeadm VS kubernetes 二進制\n\n1、kubeadm 方式部署&#xff08;推薦&#xff09;\n推薦理由&#xff1a;\n\n官方推薦&#xff1a;kubeadm 是 Kubernetes 官方提供的工具&#xff0c;用于快速搭建生產級別的 Kubernetes 集群&#xf…

python讀取hdf4文件

記錄一下使用xarray讀取hdf4&#xff08;not hdf5&#xff09;過程中遇到的問題. 目的: 讀取hdf4 file的matadata遇到的問題&#xff1a;使用xarray.open_dataset()失敗解決方法&#xff1a;使用pyhdf.SD代替 import os from pyhdf.SD import SD, SDC import xarray as xr im…

ios CCNSDate.m

// // CCNSDate.h // CCFC // // Created by xichen on 11-12-17. // Copyright 2011年 ccteam. All rights reserved. //#import <Foundation/Foundation.h>interface NSDate(cc)// 獲取系統時間(yyyy-MM-dd HH:mm:ss.SSS格式)(NSString *)getSystemTimeStr;// prin…

記錄Spring Boot中的API請求參數讀取方式

一、背景 項目開發中經常使用Spring Boot開發API&#xff0c;所以讀取請求參數是服務端編碼中最基本最常見的操作項&#xff0c;Spring Boot中也提供多種機制來滿足不同的API設計要求。接下來就記錄一下項目中用過的6種請求參數讀取方式。 RequestParam 用來加載請求URL中&q…

2024年6月24日-6月30日(ue5肉鴿視頻p16-p25)

試過重點放在獨立游戲上&#xff0c;有個indienova獨立游戲團隊是全職的&#xff0c;由于他們干了幾個月&#xff0c;節奏暫時跟不上&#xff0c;緊張焦慮了。五一時也有點自暴自棄了&#xff0c;實在沒必要&#xff0c;按照自己的節奏走即可。精力和時間也有限&#xff0c;放在…

Python和tkinter實現的字母記憶配對游戲

Python和tkinter實現的字母記憶配對游戲 因為這個小游戲用到了tkinter&#xff0c;先簡要介紹一下它。tkinter是Python的標準GUI(圖形用戶界面)庫&#xff0c;它提供了一種簡單而強大的方式來創建圖形界面應用程序。它提供了創建基本圖形界面所需的所有工具&#xff0c;同時保…

OSI七層模型TCP/IP四層面試高頻考點

OSI七層模型&TCP/IP四層&面試高頻考點 1 OSI七層模型 1. 物理層&#xff1a;透明地傳輸比特流 在物理媒介上傳輸原始比特流&#xff0c;定義了連接主機的硬件設備和傳輸媒介的規范。它確保比特流能夠在網絡中準確地傳輸&#xff0c;例如通過以太網、光纖和無線電波等媒…

什么是有效的電子簽名?PDF電子簽名怎樣具備法律效力?

電子簽名逐漸成為商務文書和法律文件中不可或缺的一部分。《電子簽名法》自2005年4月1日起施行&#xff0c;這一立法是中國信息化法律的重要里程碑&#xff0c;為電子簽名應用奠定了法律基礎。電子簽名不僅僅是一種技術手段&#xff0c;更是一種法律認可的簽名形式。那么究竟什…

js生成UUID確保數據的唯一性

在JavaScript中&#xff0c;生成UUID&#xff08;Universally Unique Identifier&#xff09;通常用于確保數據的唯一性。 以下是一個簡單的使用JavaScript生成UUID的示例&#xff0c;它基于RFC 4122版本4&#xff08;隨機UUID&#xff09;的算法&#xff1a; function gener…

Python私教張大鵬 PyWebIO通過事件回調實現表格的編輯和刪除功能

從上面可以看出&#xff0c;PyWebIO把交互分成了輸入和輸出兩部分&#xff1a;輸入函數為阻塞式調用&#xff0c;會在用戶瀏覽器上顯示一個表單&#xff0c;在用戶提交表單之前輸入函數將不會返回&#xff1b;輸出函數將內容實時輸出至瀏覽器。這種交互方式和控制臺程序是一致的…

學習TTS遇到的問題2 什么是TCN模型

學習TTS遇到的問題2 什么是TCN模型 什么是TCN模型怎么理解 TCN中的 dilation&#xff1f;什么是 Dilation具體例子數學表達作用例子代碼示例 什么是TCN模型 https://juejin.cn/post/7262269863343079479 https://blog.csdn.net/weixin_57726558/article/details/132163074 由下…

出手便是王炸,曙光存儲將高端存儲推向新高度

二十年磨一劍&#xff0c;今朝試鋒芒。 近日&#xff0c;曙光存儲重磅發布全球首個億級IOPS集中式全閃存儲FlashNexus&#xff0c;正式宣告進入高端存儲市場。 作為存儲產業皇冠上的明珠&#xff0c;高端存儲一向以技術難度大、市場準入門檻高和競爭格局穩定著稱&#xff0c;…

從0-1搭建一個web項目(package.json)詳解

本章分析package.json文件詳解 本文主要對packge.json配置子文件詳解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 開源的后臺管理框架。在一定程度上節省您的開發效率。另外本項目還封裝了一些常用組件、hooks、指令、動態路由、按鈕級別權限控制等…

Centos7源碼方式安裝sqle及開發相關

官方文檔-源碼安裝 操作系統&#xff1a;centos:7.9,everything (DVD版應該也可以) (在ubuntu22.04裝了兩天之后乖乖開了一個新Centos7虛擬機) 鏡像&#xff1a;清華大學開源軟件鏡像站 centos/7.9.2009 安裝git sudo yum update -y sudo yum install -y git git --version安…

數據結構與算法筆記:高級篇 - B+樹:MySql數據庫索引是如何實現的?

概述 作為一名軟件開發工程師&#xff0c;你對數據庫肯定再熟悉不過了。MySQL 作為主流的數據庫存儲系統&#xff0c;它在我們的業務開發中&#xff0c;有著舉足輕重的地位。在工作中&#xff0c;為了加速數據庫中數據的查找速度&#xff0c;我們常用的處理思路是&#xff0c;…

01.Ambari自定義服務開發-項目初始化

文章目錄 基礎環境在PyCharm中初始化項目配置項目相關依賴在PyCharm中導入依賴 基礎環境 PyCharmPython 2.7已經安裝完成的Ambari服務端 在PyCharm中初始化項目 項目名稱就是我們要安裝服務的名稱&#xff0c;要求名稱為全大寫&#xff0c;如&#xff1a;DORIS創建Python2.7…

如何實現機房的自動化運維-青島佰優聯

要讓機房更穩定地實現自動化運維&#xff0c;可以參考以下幾點建議&#xff1a; 一、實施自動化運維工具和技術 1. 配置管理工具&#xff1a; - 使用如Ansible、Puppet、Chef等開源的自動化運維工具&#xff0c;進行服務器配置的管理。這些工具可以幫助管理員快速部署、更…

龍迅LT8711V TYPE-CDP 1.2轉VGA芯片,內置MCU,成熟批量產品

龍迅LT8711V描述&#xff1a; LT8711V是一種高性能的Type-C/DP1.2到VGA轉換器&#xff0c;設計用于連接USB Type-C源或DP1.2源到VGA接收器。LT8711V集成了一個DP1.2兼容的接收器&#xff0c;和一個高速三通道視頻DAC。此外&#xff0c;還包括兩個CC控制器&#xff0c;用于CC通…

XML selectNodes 模糊查找

public static XmlElement[] FuzzyFindNode(string xmlPath, string key, string valuenull){XmlDocument xmlDoc new XmlDocument();xmlDoc.Load(xmlPath); string xpath $"//節點名字[contains({key},{value})]"; XmlNodeList nodes xmlDoc.SelectNodes(xpath)…

圖像大小調整(縮放)

尺寸調整前尺寸調整前 1、背景介紹 在深度學習中&#xff0c;將圖像調整到固定尺寸&#xff08;如28x28像素&#xff09;的操作是非常常見的&#xff0c;尤其是在處理諸如圖像分類、物體檢測和圖像分割等任務時。這種操作有幾個重要原因&#xff1a; 標準化輸入&#xff1a;許…