刷題 資料結構 樹狀陣列 線段樹

2022-08-13 22:06:17 字數 1731 閱讀 2011

1>數星星

(複製自他人部落格)

由於題目中給的資料是按y軸排序,我們只需構建x軸的樹狀陣列,也就是說我們只需統計星星i之前一共有多少個x座標小於或等於xi的星星,這個數值也就是星星i的等級

又因為樹狀陣列無法處理下標為0的元素(會死迴圈),所以要把每個x座標+1

#include#include

#include

using

namespace

std;

int max(int a,int

b)int

n,mx;

const

int n=15003,m=33000

;struct

node

}d[n];

intans[n],cnt[n];

inttr[m];

int lowbit(int

x)void add(int

pos)

int query(int

pos)

intmain()

for(int i=0;i"

%d\n

",cnt[i]);

return0;

}

2>花神遊歷各國

小清新線段樹

有點像 普通線段樹 + 剪枝

一般題面會有乙個神奇的(暫且這麼說)更改方式,而且一般沒辦法區間更新出值

這裡是乙個數的多次開方,可以發現,開方此時應該是有限的,<=1時不再變化

當區間最大值<=1時,整個區間都不再變化

#include#include

#include

#define ll long long

using

namespace

std;

ll max(ll a,ll b)

const

int n=100003

;int n;ll d[n];int

m;int

root,cnt;

struct

node

tr[n

<<1

];void updata(int

rt)void build(int &rt,int l,int

r)

int mid=(l+r)>>1

; build(tr[rt].lson ,l,mid);

build(tr[rt].rson ,mid+1

,r);

updata(rt);

}int

ql,qr;

void change(int rt,int l,int

r)

int mid=(l+r)>>1

;

if(ql<=mid ) change(tr[rt].lson ,l,mid);

if(qr> mid ) change(tr[rt].rson ,mid+1

,r);

updata(rt);

}ll query(

int rt,int l,int

r)int

main()

if(op==1

) printf(

"%lld\n

",query(1,1

,n));

else

change(

1,1,n);

}return0;

}

資料結構習題 線段樹 樹狀陣列

說明 這是去年寫了一半的東西,一直存在草稿箱裡,今天整理東西的時候才發現,還是把它發表出來吧。以下所有題目來自lrj的 訓練指南 la 2191 單點修改,區間和 fenwick直接搞 uva 12299 給出n個數,支援迴圈移動某些數 30個 然後問區間最小值 因為移動小於30個數,所以直接單點修...

高階資料結構(1) 線段樹與樹狀陣列

鑑於去年西安賽區被吐槽為線段樹專題賽區,就先更一發線段樹2333333 線段樹 segment tree 本質上來講是一棵二叉搜尋樹。它與區間樹類似,它的每乙個結點都是一段區間。線段樹的功能是快速查詢某個結點在若干線段中出現的次數,時間複雜度為o logn 單純空間複雜度為o 2n 實際應用中,為了...

資料結構刷題 陣列

給定乙個矩陣 a,返回 a 的轉置矩陣。先建立乙個與原始矩陣行列數互換的新矩陣 做兩個迴圈巢狀,內迴圈遍歷原始矩陣的行轉列,外矩陣遍歷原始矩陣的列 class solution return v 逐行的細緻解釋 vector 建立了二維陣列,兩個空格可以在c 11標準中可以剔除 a 0 size 獲...