資料結構大師

2022-09-18 03:48:35 字數 1437 閱讀 6641

時間限制: 1 sec 記憶體限制: 128 mb

[提交] [狀態]

小z是個資料結構高手,這天他得到了乙個由左括號和右括號組成的字串。隨之而來的是m次詢問,對於第i次詢問,小z需要回答出這個字串的第li到ri個字元組成的字串中最長的合法括號子串行的長度。

小z認為乙個由左右括號組成的序列a合法,當且僅當其滿足至少乙個以下條件。

·a為空。

·a=(b)其中b是乙個合法的括號序列。

·a=bc,其中bc都是合法的括號序列。

比如合法的括號序列有(),()(),(())等。

第一行讀入兩個數字n,m,分別表示長度和詢問次數,接下來一行讀入字串s。

最後m行每行讀入兩個數li,ri,表示這次詢問的區間。

對於每個詢問輸出一行表示答案。

4 1(())

2 4對於30%的資料,滿足n,m<=500。

對於60%的資料,滿足n,m<=5000。

對於100%的資料,滿足1≤n≤\(10^6\),1≤m≤\(10^5\)。

想到是區間問題自然想到了線段樹,由於子串行不連續,我們用線段樹維護'('和')'的數量記為l,r。

那麼合併ls和rs新增匹配min(l,r),設為x,(若記mx為區間最長匹配對數)也即t[p].mx+=x;

同時我們累和ls,rs的長度,最終t[p].mx=t[ls].mx+t[rs].mx+x;

對l,r的維護顯然,減去已經匹配成功的即可;

#include using namespace std;

typedef long long ll;

const int maxn=1e6+5;

char s[maxn];

#define ls (rt<<1)

#define rs ((rt<<1)+1)

int n,m;

struct node ;

node(int l, int r, int mx) : l(l), r(r), mx(mx) {};

int l, r, mx;

}t[maxn<<2];

void build(int rt,int l,int r)

int mid = l + r >> 1;

build(ls, l, mid);

build(rs, mid + 1, r);

int x = min(t[ls].l, t[rs].r);

t[rt].mx = t[ls].mx + x + t[rs].mx;

t[rt].l = t[ls].l - x + t[rs].l;

t[rt].r = t[ls].r + t[rs].r - x;

}node ask(int rt,int l,int r,int x,int y)

}int main()

return 0;

}

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...