二維數點 系列 題解

1.AT_dp_w Intervals

我的博客

2.CF377D Developing Games

我的博客

這兩道題是比較經典的線段樹區間 trick,希望自己可以在以后的比賽中手切。

3.洛谷 P10814 離線二維數點

題意

給你一個長為 n n n 的序列 a a a,有 m m m 次詢問,每次詢問給定 l , r , x l,r,x l,r,x,求 [ l , r ] [l,r] [l,r] 區間中小于等于 x x x 的元素個數。

1 ≤ n , m , a i , l , r , x ≤ 2 × 1 0 6 1\le n,m,a_i,l,r,x\le 2\times10^6 1n,m,ai?,l,r,x2×106

思路

前綴和思想,用 [ 1 , r ] [1,r] [1,r] 中小于等于 x x x 的數量,減去 [ 1 , l ? 1 ] [1,l-1] [1,l?1] 中小于等于 x x x 的數量,就可以了。

考慮枚舉條件端點,從而改變權值。

用線段樹常數比較大,在洛谷 TLE 最后一個點,還是用樹狀數組吧,反正也比較方便。

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{ll s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}
inline void write(ll x)
{ if(x==0){putchar('0');return;}ll len=0,k1=x,c[10005];if(k1<0)k1=-k1,putchar('-');while(k1)c[len++]=k1%10+'0',k1/=10;while(len--)putchar(c[len]);
}
#define ls u<<1
#define rs u<<1|1
const ll N=2e6+9;
ll n,m,a[N];
ll M,ans[N];
struct term
{ll d,id,v;
};
vector<term>p[N];
struct BT
{ll T[N];ll lowbit(ll x){return x&(-x);}void add(ll x,ll k){for(int i=x;i<=M;i+=lowbit(i))T[i]+=k;}ll query(ll x){ll ret=0;for(int i=x;i>=1;i-=lowbit(i))ret+=T[i];return ret;}
}B;
int main()
{n=read(),m=read();for(int i=1;i<=n;i++){a[i]=read();M=max(M,a[i]);}for(int i=1;i<=m;i++){ll l,r,d;l=read(),r=read(),d=read();p[l-1].push_back((term){d,i,-1});p[r].push_back((term){d,i,1});M=max(M,d);}for(int i=1;i<=n;i++){B.add(a[i],1);for(auto x:p[i])ans[x.id]+=x.v*B.query(x.d);}for(int i=1;i<=m;i++)write(ans[i]),puts("");return 0;
}

4.洛谷 P1972 SDOI2009 HH的項鏈

給定一個序列 a i a_i ai? m m m 次詢問區間 [ l , r ] [l,r] [l,r] 中有多少種不同的數。

1 ≤ n , m , ? a i ≤ 1 0 6 1\le n,m,\forall a_i\le 10^6 1n,m,?ai?106 1 ≤ l ≤ r ≤ n 1\le l\le r\le n 1lrn

思路

一眼想用莫隊,但是 Θ ( n n ) \Theta(n\sqrt{n}) Θ(nn ?),令人畏懼(在古早時期學莫隊的時候卡常過了),那么分塊也并非正解了。

區間內有不同的數,那么多次出現的只算做一個。這題還是查詢區間,那么能不能用二維數點來做呢?

設序列中 a i a_i ai? 上一次出現在下標 p r e i pre_i prei?,沒有則 p r e i = 0 pre_i=0 prei?=0,如果一個數在下標區間 [ l , r ] [l,r] [l,r] 中首次出現,那么 p o s i < l pos_i<l posi?<l;如果出現第二次,那么必然 p r e i ∈ [ l , r ] pre_i\in[l,r] prei?[l,r]

那么題目就轉化成了,求區間 [ l , r ] [l,r] [l,r] 中,有多少個 p r e i < l pre_i<l prei?<l

那不就和上一題一樣了嗎?同樣使用前綴和思想,枚舉右端點。

不過這一題有 0 0 0 出現,扔上樹狀數組會出問題,所以記得加 1 1 1

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+9;
ll n,m,a[N];
ll pre[N],pos[N];
ll ans[N];
struct que
{ll l,r,id;
}q[N];
bool cmp(que x,que y)
{if(x.l!=y.l)return x.l<y.l;return x.r<y.r;
}
struct term
{ll d,id,v;
};
vector<term>p[N];
struct BT
{ll T[N];ll lowbit(ll x){return x&(-x);}void add(ll x,ll k){for(int i=x;i<=n;i+=lowbit(i))T[i]+=k;}ll query(ll x){ll ret=0;for(int i=x;i>=1;i-=lowbit(i))ret+=T[i];return ret;}
}B;
int main()
{scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);pre[i]=pos[a[i]];pos[a[i]]=i;}scanf("%lld",&m);for(int i=1;i<=m;i++){ll l,r;scanf("%lld%lld",&l,&r);q[i]=(que){l,r,i};p[l-1].push_back((term){l-1,i,-1});p[r].push_back((term){l-1,i,1});}sort(q+1,q+m+1,cmp);//答案就是[l,r]中pre(i)<l的個數 for(int i=1;i<=n;i++){B.add(pre[i]+1,1);for(auto x:p[i])ans[x.id]+=x.v*B.query(x.d+1);}for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

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

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

相關文章

vulkanscenegraph顯示傾斜模型(5.9)-vsg中vulkan資源的編譯

前言 上一章深入剖析了GPU資源內存及其管理&#xff0c;vsg中為了提高設備內存的利用率&#xff0c;同時減少內存(GPU)碎片&#xff0c;采用GPU資源內存池機制(vsg::MemoryBufferPools)管理邏輯緩存(VkBuffer)與物理內存(VkDeviceMemory)。本章將深入vsg中vulkan資源的編譯(包含…

探秘 Python 網絡編程:構建簡單聊天服務器

在計算機網絡的世界里&#xff0c;網絡編程是實現不同設備之間通信的關鍵技術。Python 憑借其簡潔的語法和強大的庫支持&#xff0c;在網絡編程領域有著廣泛的應用。無論是構建簡單的聊天服務器&#xff0c;還是開發復雜的網絡應用&#xff0c;Python 都能輕松勝任。 1 理論基礎…

Go語言Slice切片底層

Go語言&#xff08;Golang&#xff09;中切片&#xff08;slice&#xff09;的相關知識、包括切片與數組的關系、底層結構、擴容機制、以及切片在函數傳遞、截取、增刪元素、拷貝等操作中的特性。并給出了相關代碼示例和一道面試題。關鍵要點包括&#xff1a; 數組特性&#xf…

vue3 ts 自定義指令 app.directive

在 Vue 3 中&#xff0c;app.directive 是一個全局 API&#xff0c;用于注冊或獲取全局自定義指令。以下是關于 app.directive 的詳細說明和使用方法 app.directive 用于定義全局指令&#xff0c;這些指令可以用于直接操作 DOM 元素。自定義指令在 Vue 3 中非常強大&#xff0…

基于python的機器學習(五)—— 聚類(二)

一、k-medoids聚類算法 k-medoids是一種聚類算法&#xff0c;它是基于k-means聚類算法的一種改進。k-medoids算法也是一種迭代算法&#xff0c;但是它將中心點限定為數據集中的實際樣本點&#xff0c;而不是任意的點。 具體來說&#xff0c;k-medoids算法從數據集中選擇k個初…

解釋:指數加權移動平均(EWMA)

指數加權移動平均&#xff08;EWMA, Exponential Weighted Moving Average&#xff09; 是一種常用于時間序列平滑、異常檢測、過程控制等領域的統計方法。相比普通移動平均&#xff0c;它對最近的數據賦予更高權重&#xff0c;對舊數據逐漸“淡化”。 ? 一、通俗理解 想象你…

Spring Boot 項目基于責任鏈模式實現復雜接口的解耦和動態編排!

全文目錄&#xff1a; 開篇語前言一、責任鏈模式概述責任鏈模式的組成部分&#xff1a; 二、責任鏈模式的核心優勢三、使用責任鏈模式解耦復雜接口1. 定義 Handler 接口2. 實現具體的 Handler3. 創建訂單對象4. 在 Spring Boot 中使用責任鏈模式5. 配置責任鏈6. 客戶端調用 四、…

COMSOL仿真遇到的兩個小問題

最近跑熱仿真的時候跑出了兩個問題&#xff0c;上網查發現也沒什么解決方式&#xff0c;最后自己誤打誤撞的摸索著解決了&#xff0c;在這里分享一下。 問題一 我當時一準備跑仿真就彈出了這個東西&#xff0c;但在此之前從未遇到 然后我試著在它說的路徑中建立recoveries文件…

如何在英文學術寫作中正確使用標點符號?

標點符號看似微不足道&#xff0c;但它們是書面語言的無名英雄。就像熟練的指揮家指揮管弦樂隊一樣&#xff0c;標點符號可以確保您的寫作流暢、傳達正確的含義并引起讀者的共鳴。正如放錯位置的音符會在音樂中造成不和諧一樣&#xff0c;放錯位置的逗號或缺少分號也會使您的寫…

【深度學習與大模型基礎】第10章-期望、方差和協方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么&#xff1f; 期望&#xff08;Expectation&#xff09;可以理解為“長期的平均值”。比如&#xff1a; 擲骰子&#xff1a;一個6面骰子的點數是1~6&#x…

JAVA虛擬機(JVM)學習

入門 什么是JVM JVM&#xff1a;Java Virtual Machine&#xff0c;Java虛擬機。 JVM是JRE(Java Runtime Environment)的一部分&#xff0c;安裝了JRE就相當于安裝了JVM&#xff0c;就可以運行Java程序了。JVM的作用&#xff1a;加載并執行Java字節碼&#xff08;.class&#…

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序&#xff0c;本文是對堆的內容補充 主要包括&#xff1a;堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到&#xff0c;利用堆的思想完成的堆排序的代碼如下&#xff08;包…

什么是柜臺債

柜臺債&#xff08;柜臺債券業務&#xff09;是指通過銀行等金融機構的營業網點或電子渠道&#xff0c;為投資者提供債券買賣、托管、結算等服務的業務模式。它允許個人、企業及機構投資者直接參與銀行間債券市場的交易&#xff0c;打破了以往僅限機構參與的壁壘。以下是綜合多…

【Android讀書筆記】讀書筆記記錄

文章目錄 一. Android開發藝術探索1. Activity的生命周期和啟動模式1.1 生命周期全面分析 一. Android開發藝術探索 1. Activity的生命周期和啟動模式 1.1 生命周期全面分析 onPause和onStop onPause后會快速調用onStop&#xff0c;極端條件下直接調用onResume 當用戶打開新…

Java對象內存結構詳解

Java對象內存結構詳解 Java對象在JVM內存中的存儲結構可以分為三個部分&#xff1a;對象頭&#xff08;Header&#xff09;、實例數據&#xff08;Instance Data&#xff09;和對齊填充&#xff08;Padding&#xff09;。以下是64位JVM&#xff08;開啟壓縮指針&#xff09;下…

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數&#xff0c;定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點&#xff1a; 只能看到各種術語、數學公式勉強看懂&#xff0c;沒有建立清晰且準確關聯 多變量交互關系浮于表面&#xff0c;有時候連環境、代理控制的變量都混淆 模型種類繁多&#xff0c;概念繁雜難整合、對比或復用&#xff0c;無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程&#xff08;非常詳細&#xff09;_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考&#xff1a;uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中&#xff0c;Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型&#xff1a; TINYBLOB: 最大存儲長度為 255 個字節。BL…