洛谷P1972 SDOI2009 HH的項鍊

2021-09-10 01:23:00 字數 1918 閱讀 1825

這道題想了很久,發題解是為了理解的更深刻一點。。。(管理放我過好嘛qwq)

步入正題:這道題應該是很多做法,我選擇的是離線+樹狀陣列。

首先輸入陣列。用fisrt陣列先記錄元素最開始出現的位置,對應的每乙個樹狀陣列的位置add一下(樹狀陣列洛谷也有模板題的了解一下就ok啦)。

rep

(i,1

,n)}

然後倒著更新一遍陣列,對每個元素用last陣列記錄當前下標元素的下乙個出現的位置(可以模擬一遍就理解了)

per

(i,n,1)

接下來就是存一下詢問啦。用vector存結構體應該快一點,結構體用左端點為關鍵字進行sort排序。

struct uzi};

vector val;

rep(i,

0,m-1)

);//將詢問存入

}sort

(val.

begin()

,val.

end())

;//排序

接下來就是詢問的處理啦(jd)

因為已經按左端點排序好了,所以 直接對樹狀陣列動態更新,然後記錄答案。這裡用了乙個j。當j比左端點小,就在j下標元素下個出現的位置對樹狀陣列更新。(add)。。然後記錄詢問的結果就好啦。。。

for(auto k:val)

#define rep(a,b,c) for(int a=b;a<=c;a++)

#define per(i,n,a) for (int i=n;i>=a;i--)

#define max(a,b) (a)>(b)?(a):(b)

#define min(a,b) (a)<(b)?(a):(b)

#define pii pair

#define yxdl(qt) priority_queue,greater>qt

#define xgd(qt) priority_queue,less>qt

#define inf 0x3f3f3f3f

#define lowbit(x) x & -x

#define cs(s) freopen(s,"r",stdin)

#define debug(x) printf(" case-->%d ",x );

using

namespace std;

typedef

long

long ll;

int a[

500010

],tree[

500011

],first[

5000101

],last[

5100001

],n,m,ans[

510001];

struct uzi};

inline

void

add(

int x)

inline

int sum (

int x)

intmain()

}per

(i,n,1)

scanf

("%d"

,&m)

; vector val;

rep(i,

0,m-1)

);//將詢問存入

}int j=1;

sort

(val.

begin()

,val.

end())

;//排序

for(

auto k:val)

ans[k.id]

=sum

(k.y)

-sum

(k.x-1)

;}rep(i,

0,m-1)

}

洛谷P1972 SDOI2009 HH的項鍊

題目描述 p1972 sdoi2009 hh的項鍊 hh 有一串由各種漂亮的貝殼組成的項鍊。hh 相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh 不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不...

洛谷 P1972 SDOI2009 HH的項鍊

1.按每個要求的區間的右端點排序一下 2.樹狀陣列tree j 維護從1到j區間內不同數字的個數有多少個 3.然後用字首和的思想就好 tree r tree l 1 1 include2 include3 include4 define maxn 1000002 5 define next nex ...

洛谷 P1972 SDOI2009 HH的項鍊

p1972 sdoi2009 hh的項鍊 法一 樹狀陣列,離線 翻譯 給出乙個數列a n 還有許多請求,請求由l,r兩個數組成,要求對於每個請求輸出數列中從a l 到a r 中不重複的數的個數。方法 首先讀入數列a n 並預處理next1,boo兩個輔助陣列,方法見程式。然後讀入請求,把請求按l從小...