說明:這是去年寫了一半的東西,一直存在草稿箱裡,今天整理東西的時候才發現,還是把它發表出來吧。。
以下所有題目來自lrj的《訓練指南》
la 2191
單點修改,區間和 fenwick直接搞
uva 12299
給出n個數,支援迴圈移動某些數(<30個),然後問區間最小值
因為移動小於30個數,所以直接單點修改就行,線段樹。
la 4108
類似線段樹,每次插入乙個建築時想線段樹一樣二分區間,當遇到乙個完整的區間時,修改或返回,否則繼續二分區間。nlogn.
uva 11525
有題解說可以逆向考慮用線段樹,我沒明白怎麼回事。
說一下我的做法:
考慮問題(k,n)表示1~k的全排列中第n個。顯然1~k的全排列可以分為k種,每種有(k-1)!種情況,那麼如果確定了第n個排列屬於哪一種,問題就轉化為了(k-1,m);
再考慮題目的輸入。n的輸入形式正好是按以上思想給出的,那麼我們是需要把這個式子轉化為標準形式即可。
判斷每個si,若si>(k-i+1),就要」進製」。所以從後向前掃瞄,可以在o(n)時間內解決。
la 4730
並查集+線段樹。用並查集維護每個州,同時維護每個州的上端點(up)和下端點(down)。
用線段樹維護[a,b]內有多少個城市。方法是連線a和b時,[a.down,a.up]-=a.count; [b.down,b.up]-=b.count; [new.down,new.up]+=new.count;
二維線段樹
先存一下(以下**僅供參考 準確性無法保證233)
view code
1 #include 2 #include 3 #include 4 #include 5#define rs(x) (x*2+1)
6#define ls(x) (x*2)
7#define bigger(a,b) ((a)>(b)?(a):(b))
8#define minner(a,b) ((a)
9#define maxn (2000+10)
10#define root (1)
11#define inf (9999999)
12using
namespace
std;
13struct
segment_tree_2d;
19 typedef struct
treey treey;
20struct
treex;
25 typedef struct
treex treex;
26int
x1,x2,y1,y2,val,max_ans,min_ans,x0,y0;
27treex t[maxn];
28void queryy(int f,int r,int fa,int p)else39}
40void queryx(int f,int r,int p)else50}
51void modifyy(int fa,int p)else
60 t[fa].t[p].max=bigger(t[fa].t[ls(p)].max,t[fa].t[rs(p)].max);
61 t[fa].t[p].min=minner(t[fa].t[ls(p)].min,t[fa].t[rs(p)].min);62}
63void maintainy(int fa,int p)else
72 t[fa].t[p].max=bigger(t[fa].t[ls(p)].max,t[fa].t[rs(p)].max);
73 t[fa].t[p].min=minner(t[fa].t[ls(p)].min,t[fa].t[rs(p)].min);74}
75void modifyx(int
p)else84}
8586
void query()
87void
modify()
88};
89 typedef struct
segment_tree_2d st2;
90st2 t;
91int
main()
92102
}103 scanf("
%d",&q);
104for (i=0;i)else
114}
115return0;
116 }
刷題 資料結構 樹狀陣列 線段樹
1 數星星 複製自他人部落格 由於題目中給的資料是按y軸排序,我們只需構建x軸的樹狀陣列,也就是說我們只需統計星星i之前一共有多少個x座標小於或等於xi的星星,這個數值也就是星星i的等級 又因為樹狀陣列無法處理下標為0的元素 會死迴圈 所以要把每個x座標 1 include include incl...
高階資料結構(1) 線段樹與樹狀陣列
鑑於去年西安賽區被吐槽為線段樹專題賽區,就先更一發線段樹2333333 線段樹 segment tree 本質上來講是一棵二叉搜尋樹。它與區間樹類似,它的每乙個結點都是一段區間。線段樹的功能是快速查詢某個結點在若干線段中出現的次數,時間複雜度為o logn 單純空間複雜度為o 2n 實際應用中,為了...
模板 線段樹 資料結構 線段樹練習題三
給定一條長度為m的線段,有n個操作,每個操作有3個數字x,y,z表示把區間 x,y 染成顏色z,詢問染完色之後,這條長度為m的線段一共有幾種顏色。規定 線段的顏色可以相同。連續的相同顏色被視作一段。問x軸被分成多少段。乙個n,乙個l,n行x1,x2,color 被分成多少段 4 2010191 29...