很簡單的線段樹水題。。。不知道為啥一年前不會。。。
每行開乙個線段樹,最後一列再開乙個線段樹。
對每個操作分兩種情況討論:在最後一列,不在最後一列。
如果不在最後一列,現在行線段樹上把那個位置刪去,在列線段樹末尾插入它。並且找到列線段樹對應的行的值,把他從列線段樹中刪除,加入到行線段樹中去。
用動態加點的方式可以避免tle和mle
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 15000100
using namespace std;
void
read
(int
&x)typedef
long
long ll;
int n,m,q,cnt;
int tree[maxn]
;ll val[maxn]
;int tag[maxn]
;int ls[maxn]
,rs[maxn]
;void
pushdown
(int x,
int l,
int r)
void
add(
int id,
int l,
int r,
int pl,
int pr,
int val)
int mid=
(l+r)
>>1;
if(pl<=mid)
if(pr>mid)
tree[id]
=tree[ls[id]
]+tree[rs[id]];
}pairint>
que(
int id,
int l,
int r,
int k)
int mid=
(l+r)
>>1;
if(tree[ls[id]
]>=k)
else
}void
addval
(int id,
int l,
int r,
int pos,ll v)
int mid=
(l+r)
>>1;
if(pos<=mid)
else
tree[id]
=tree[ls[id]
]+tree[rs[id]];
}int len[maxn]
;int
main()
add(n+1,
1,n+q,
1,n,1)
; len[n+1]
=n;int x,y;
for(
int i=
1;i<=q;i++
)else
}}
NOIP2017整數 線段樹
題目背景 在人類智慧型的山巔,有著一台字長為10485761048576 位 此數字與解題無關 的超級計算機,著名理論計算機科 學家p博士正用它進行各種研究。不幸的是,這天颱風切斷了電力系統,超級計算機 無法工作,而 p 博士明天就要交實驗結果了,只好求助於學過oi的你.題目描述 p 博士將他的計算...
資料結構 線段樹
啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...
資料結構 線段樹
一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...