這道題想了很久,發題解是為了理解的更深刻一點。。。(管理放我過好嘛qwq)
步入正題:這道題應該是很多做法,我選擇的是離線+樹狀陣列。
首先輸入陣列。用fisrt陣列先記錄元素最開始出現的位置,對應的每乙個樹狀陣列的位置add一下(樹狀陣列洛谷也有模板題的了解一下就ok啦)。
然後倒著更新一遍陣列,對每個元素用last陣列記錄當前下標元素的下乙個出現的位置(可以模擬一遍就理解了)rep
(i,1
,n)}
接下來就是存一下詢問啦。用vector存結構體應該快一點,結構體用左端點為關鍵字進行sort排序。per
(i,n,1)
接下來就是詢問的處理啦(jd)struct uzi};
vector val;
rep(i,
0,m-1)
);//將詢問存入
}sort
(val.
begin()
,val.
end())
;//排序
因為已經按左端點排序好了,所以 直接對樹狀陣列動態更新,然後記錄答案。這裡用了乙個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從小...