水題乙個,但是由於自己太弱還是寫了很久,線段樹的理解不是很好,到現在也不是很懂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...