區間眾數問題,線段樹

2021-09-08 02:39:58 字數 1322 閱讀 7217

區間眾數,利用線段樹,維護區間眾數轉換的平度序列。

線段樹記錄區間最大值,即為連續區間眾數連續個數。

平度序列例如:

1 1 1 1 2 3 3 3 

1 2 3 4 1 1 2 3

**:

#include #include #include #include #include #include using namespace std;

const int m=1e6+100;

long long tr[m],ls[m],rs[m],m[m];//m記錄區間最大值,ls,rs記錄區間從左數多少個相同,rs右數,tr記錄原數列

void pushup(int i,int l,int r)

if(rs[i]==r-mid)

m[i]=max(m[i*2],m[i*2+1]);

if(tr[mid]==tr[mid+1])

m[i]=max(m[i],ls[i*2+1]+rs[i*2]);

} void build(int i,int l,int r)

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

build(i*2,l,mid);

build(i*2+1,mid+1,r);

pushup(i,l,r);

} void update(int i,int l,int r,int x,long long t)

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

if(x<=mid)update(i*2,l,mid,x,t);

else update(i*2+1,mid+1,r,x,t);

pushup(i,l,r);

} int query(int i,int l,int r,int x,int y)

int mid=l+r>>1;

//注意下列操作,對於相鄰兩區間進行的維護。

int sum1=0,sum2=0;

if(mid>=x) sum1=query(i*2,l,mid,x,y);

if(midif(sum1==0) return sum2;

if(sum2==0) return sum1;

int l1=min(mid-x+1,(int)rs[i*2]);

int r1=min(y-mid,(int)ls[i*2+1]);

if(tr[mid+1]==tr[mid]) return max(sum1,max(sum2,l1+r1));

else return max(sum1,sum2);

}int main()

else}}

return 0;

}

線段樹(區間樹)

目錄 為什麼要使用線段樹 什麼是線段樹 線段樹融合介面 線段樹實現 線段樹例題 融合介面 author administrator param public inte ce merger package com.suanfa.segmenttree 線段樹 區間樹 author administra...

線段樹 區間樹

每乙個節點儲存的是乙個區間中相應統計值 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treeindex,int l,int r int lefttreeindex leftchild treeindex int rig...

線段樹區間合併 連續區間問題

hdu 1540 資料很奇葩。用討論區裡面的話形容這題很合適 九九八十一難,這道題比北大的資料真是坑出翔來了 poj 2892 原題 一摸一樣 題意 給定n個村莊排成一行,它們相鄰的村莊通過地道相連,有三種操作 1 炸毀第x個村莊 2 修復上乙個被炸毀的村莊 3 詢問 輸出 第x個村莊還能和幾個村莊...