HDU5124,線段樹加離散化

2021-07-10 15:56:22 字數 1243 閱讀 8440

水題乙個,但是由於自己太弱還是寫了很久,線段樹的理解不是很好,到現在也不是很懂pushdown的精髓,只會照貓畫虎,接下來的一段日子裡打算做水題的同時穿插做一些資料結構。

這道題的離散化很簡單,就是對於出現過的點排序即可,可以用map之類的隨便搞一下,據說這個題有貪心演算法,希望學習一下。最後也是壓時間過得主要還是線段樹理解不透徹,蒟蒻乙隻啊。。。

#include#include#include#include#include#include using namespace std;

const int max=1000000;

int arr[500005][2];

vectorv;

unordered_mapmp;

struct pr tr[max+10];

int n;

inline int ll(int k) //左邊的下標

inline int rr(int k) //右邊的下標

inline int mid(int kk1,int kk2)

void pushdown(int k)

}void build(int k,int s,int t) //開始最下面是多少

build(ll(k),s,mid(s,t));

build(rr(k),mid(s,t)+1,t);

tr[k].sum=tr[ll(k)].sum+tr[rr(k)].sum; //如果是最大就是max

}void modify(int k,int s,int t,int x)

pushdown(k);

int mi=mid(l,r);

if(t<=mi) modify(ll(k),s,t,x);

else if(s>mi) modify(rr(k),s,t,x);

else

tr[k].sum=tr[ll(k)].sum+tr[rr(k)].sum;

}int query(int k,int s,int t)

int main()

{ int t;

cin>>t;

while(t--){

cin>>n;

mp.clear();

v.clear();

memset(tr,0,sizeof(tr));

for(int i=0;i::iterator it=mp.begin();

build(1,1,nn);

for(int i=0;i

HDU 3333 線段樹 離散化

只查詢區間不同的數的和 思路好題 對查詢離線 不斷的往每個位置插值 並把前面位置的值置為0 每查到乙個右端點 查詢一下 等價操作的轉換 離散化一下 include define mem a,b memset a,b,sizeof a define lson root 1 define rson ro...

HDU1199 離散化線段樹

題目大意 一段長度未知的線段,一種操作 a b c 表示區間 a,b 要塗的顏色,c w塗白色,c b塗黑色,問你最長的白色區間段時多長。解題思路 就快去南京邀請賽了,最近做題超沒狀態,cf rating一直掉,這麼簡單的線段樹離散化居然搞了我乙個晚上,糾結。開始用線段樹區間合併的方法做,wa到死,...

離散化 線段樹

題目 分析 每次1操作會往序列底加first個second,first 和 second 都是最大1e9的資料,每次2操作詢問序列中第first到第second個數的和 一開始就感覺有點像線段樹,輸入資料太大我們可以離線處理把資料離散化下,然後扔到線段樹上,維護兩個陣列 sum 區間數的值的和 nu...