ZOJ 1610 線段樹區間更新

2021-09-24 02:21:53 字數 1140 閱讀 8826

裸題。

注意到只有一次查詢,那麼查詢的時候直接到葉子節點將葉子節點的值放到陣列中,統計結果相當於離散化的乙個過程。

對於這道題來說我們進行區間更新不需要像普通的那種求區間和的那樣建立lazy標記,因為我們最後只關心葉子節點的值,故不需要lazy標記。

注意的地方,區間長度為[1,8000]在這個區間上進行操作。

如果某兩段區間顏色相同,中間某一段沒有顏色,這樣算兩段區間。

#include#include#include#include#includeusing namespace std;

const int maxn=8e3+9;

int x[maxn<<2|1];

int sum[maxn];

void build()

void pushdown(int k)

}void updata(int l,int r,int v,int l,int r,int k)

pushdown(k);

int mid=(l+r)>>1;

if(l<=mid) updata(l,r,v,l,mid,k<<1);

if(r>mid) updata(l,r,v,mid+1,r,k<<1|1);

//if(x[k<<1]==x[k<<1|1]) x[k]=x[k<<1];

//else x[k]=-1;

}int xx[maxn];

int top;

void myfind(int l,int r,int k)

pushdown(k);

int mid=(l+r)>>1;

myfind(l,mid,k<<1);

myfind(mid+1,r,k<<1|1);

}int main()

myfind(1,8000,1);

for(int i=1;i<=top;++i)

if(i==1||xx[i]!=xx[i-1]) if(xx[i]!=-1) ++sum[xx[i]];

for(int i=0;i<=8000;++i)

if(sum[i]) printf("%d %d\n",i,sum[i]);

printf("\n");

}return 0;

}

ZOJ 1610 線段樹區間染色

給長度8000公尺的板,對其中區間染色,問最後能看到的顏色,和該顏色一共出現了幾段 線段覆蓋法 資料比較水 也可以暴力水過 線段樹 include stdio.h include string.h struct node data 40010 int color 8011 void build in...

ZOJ 1610 (線段樹區間set)

題意 在一段線段上塗色,新塗的顏色會覆蓋舊的,問最後每種顏色各有多少段。思路 線段樹區間覆蓋,最後dfs查詢一遍把每個位置的顏色查詢出來,再掃一遍統計有多少段。include include include include include include include include includ...

ZOJ 1610 思維 線段樹

zoj 1610 思維 include include using namespace std const int maxn 1e4 int n int e maxn 3 int color maxn int ans maxn int main for int i 1 i 8000 i 遍歷每乙個位...