樹狀陣列 千萬別用樹套樹

2021-09-27 14:01:29 字數 1764 閱讀 2437

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

special judge, 64bit io format: %lld

題目描述

bobo 精通資料結構!他想維護乙個線段的集合 s。初始時,s 為空。他會依次進行 q 次操作,操作有 2 種。

輸入檔案包含多組資料,請處理到檔案結束。

每組資料的第一行包含 2 個整數 n 和 q. 其中 n 表示操作中 r 的最大值。

接下來 q 行中的第 i 行包含 3 個整數 ti,li,rit_i, l_i, r_iti​,li​,ri​,表示第 i 個操作屬於型別 tit_iti​,對應的引數是 lil_ili​ 和 rir_iri​.

輸出描述:

對於每個型別 2 的詢問,輸出 1 個整數表示對應的數量。

示例1輸入

複製1 2

1 1 1

2 1 1

4 41 1 4

2 2 3

1 1 4

2 2 3

輸出複製11

2備註:

1a還是很開心的~~所以什麼是樹套樹o(╥﹏╥)o

想法在後面啊

#include

using

namespace std;

const

int n=

500010

;int c[n]

,num[n]

,bz[n]

,n;inline

intlowbit

(int x)

//單點修改,區間查詢 (差分思想

inline

void

modify

(int pos,

int x)

}int

query

(int pos)

return res;

}int

main()

else

else

printf

("%d\n"

,ans);}

}}}

bz是作為重(chong)點的個數; num表示是這個點作為左端點的個數

設一線段的兩個端點分別x ,y

樹狀陣列在x端處理+1 ,y+1處理-1 那麼對於x-y之間的線段的個數至少都為1 而對於後端點在y之後線段就是無效的(差分+字首和)

對於x=y 就相當單點啦,就判斷所以達到y的線段個數 那就是字首和

對於y=x+1 那就是從達到y的線段個數中除去這個是重點以及左端點的個數

對於y=x+2 同樣至少要是能達到y的線段 減去 y是重點或左端點的個數再減去中間的那個點作為左端點的個數 (這裡不能減去中間點作為重點的個數因為重點根本就不在能達到y的線段裡面啊)

#include

using

namespace std;

const

int n=

100010

;int c[n]

,bz[n]

,num[n]

,n,m;

inline

intlowbit

(int x)

void

add(

int x,

int v)

intsum

(int x)

intmain()

else}}

}

樹狀陣列 H千萬別用樹套樹

解題思路 兩棵bit分別存線段的開始點和結束點 兩個陣列存開始點和結束點的線段數量 針對每次詢問 用匯流排段數 區間右邊的線段 結尾小於等於x 區間左邊的線段 開頭大於等於x 當前線段內被完全包含 開頭結尾在當前區間內即為答案 zeolim an ac a day keeps the bug awa...

csu2170千萬別用樹套樹

千萬別用樹套樹 bobo 精通資料結構!他想維護乙個線段的集合 s。初始時,s 為空。他會依次進行 q 次操作,操作有 2 種。幫 bobo 求出每次詢問的答案。輸入檔案包含多組資料,請處理到檔案結束。每組資料的第一行包含 2 個整數 n 和 q.其中 n 表示操作中 r 的最大值。接下來 q 行中...

csu2107 千萬別用樹套樹 權值線段樹 2

問題描述 bobo 精通資料結構!他想維護乙個線段的集合 s。初始時,s 為空。他會依次進行 q 次操作,操作有 2 種。型別 1 給出 l,r,向集合 s 中插入線段 l,r 型別 2 給出 l,r,詢問滿足 x,y s 且 x l r y 的線段 x,y 數量。幫 bobo 求出每次詢問的答案。...