線段樹 離散化 染色

2021-08-29 01:23:10 字數 1285 閱讀 6342

這個題目太坑了,一直給報超時,然後調了一下午發現多開了乙個map。。。。。

ac**:

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

# define maxn 10000000+100

# define lson l,m,rt<<1

# define rson m+1,r,rt<<1|1

//# define m (l+r)>>1

int a[maxn];

int tot[maxn];

int fi[maxn],se[maxn];

int col[maxn];//0代表沒有顏色,-1代表有多種顏色。

int q1[maxn];

mapw;

int ans;

void cal(int rt)

void update(int l,int r,int l,int r,int rt,int num)

//染色的過程

if(col[rt]>=0)//這個地方的染色始終是比線段樹的整體程序快一步的,可以畫圖理解一下。

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

if(l<=m)update(l,r,lson,num);

if(r>m)update(l,r,rson,num);

if(col[rt]>=0)

col[rt]=-1;//如果有多個顏色出現的話,應該等到左子樹和右子樹都更新完畢後才能賦值為-1,

}void f(int l,int r,int rt)

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

f(lson);

f(rson);

}int main()

//離散化的過程

sort(tot+1,tot+cnt+1);

ans=0;

q1[tot[1]]=++ans;

for(int i=2; i<=cnt; i++)

//之前超時就一直因為這個,因為在這個多開了乙個map所以超時了,因為已經排好序了,直接判斷和前乙個是否相等就可以去重了。

col[1]=0;

// build(1,ans,1);

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

f(1,ans,1);

int anss=w.size();

printf("%d\n",anss);

w.clear();

}return 0;

}

HFUT 1363 木條染色 線段樹 離散化

description 小明是乙個非常浪漫的畫家,他喜歡畫各種奇奇怪怪的畫,雖然沒人理解他畫的究竟是什麼東西。有一天,他突發奇想,對於一根木條,他每次從木條中選取乙個區間 l,r 進行染色,經過多次染色後,他想知道在 a,b 區間中有幾個未被染色的子區間?可惜小明雖然畫畫非常厲害,但是並不擅長解決這...

離散化 線段樹

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

poj2528 線段樹離散染色)

思路 l,r範圍很大,需要離散化,離散化時注意排序後如果相鄰兩個數字則可以賦相鄰的值,如果二者之間差大於一這需要賦值相差2,例如1 10為紅色,1 2為綠色,9 10為藍色,正確答案為3.include include includeusing namespace std const int n 1...