BZOJ 2743 採花(樹狀陣列)

2021-07-14 17:38:54 字數 1831 閱讀 4486

#includeusing namespace std;

const int maxn = 1e6+7;

int c[maxn],a[maxn],p[maxn],next[maxn];

int lowbit(int x)

void update(int i,int d)

}int query(int i)

return ans;

}struct node

que[maxn];

bool cmp1(node a,node b)

{ if(a.l==b.l)

return a.r=1;i--)

next[i]=p[a[i]],p[a[i]]=i;

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

if(next[p[i]])

update(next[p[i]],1);

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

scanf("%d%d",&que[i].l,&que[i].r),que[i].id=i;

sort(que+1,que+1+m,cmp1);

int l = 1;

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

{ while(l

description

蕭芸斕是

z國的公主,平時的一大愛好是採花。

今天天氣晴朗,陽光明媚,公主清晨便去了皇宮中新建的花園採花。花園足夠大,容納了n

朵花,花有

c種顏色(用整數

1-c表示),且花是排成一排的,以便於公主採花。

公主每次採花後會統計採到的花的顏色數,顏色數越多她會越高興!同時,她有一癖好,

她不允許最後自己採到的花中,某一顏色的花只有一朵。為此,公主每採一朵花,要麼此前

已採到此顏色的花,要麼有相當正確的直覺告訴她,她必能再次採到此顏色的花。

由於時間關係,公主只能走過花園連續的一段進行採花,便讓女僕福涵潔安排行程。福

涵潔綜合各種因素擬定了

m個行程,然後一一向你詢問公主能採到多少朵花(她知道你是編

程高手,定能快速給出答案!),最後會選擇令公主最高興的行程(為了拿到更多獎金!)。

input

第一行四個空格隔開的整數n、

c以及m。

接下來一行

n個空格隔開的整數,每個數在

[1, c]

間,第i

個數表示第

i朵花的顏色。

接下來m

行每行兩個空格隔開的整數l和

r(l ≤

r),表示女僕安排的行程為公主經過第l

到第r朵花進行採花。

output共m

行,每行乙個整數,第

i個數表示公主在女僕的第

i個行程中能採到的花的顏色數。

sample input

5 3 5

1 2 2 3 1

1 51 2

2 22 3

3 5

sample output

2 

0 0 1 0

【樣例說明】

詢問[1, 5]:公主採顏色為1和2的花,由於顏色3的花只有一朵,公主不採;詢問[1, 2]:顏色1和顏色2的花均只有一朵,公主不採;

詢問[2, 2]:顏色2的花只有一朵,公主不採;

詢問[2, 3]:由於顏色2的花有兩朵,公主採顏色2的花;

詢問[3, 5]:顏色1、2、3的花各一朵,公主不採。

hint

【資料範圍】

對於100%的資料,1 ≤ n ≤    10^6,c ≤ n,m ≤10^6。

BZOJ 2743 採花(樹狀陣列)

題意 給出乙個數列,每個詢問查詢 l,r 中至少出現兩次的數字有多少種?思路 1 記錄每個位置i的數字的前乙個相同數字出現的位置pre i 沒有前乙個相同的pre i 為0。2 詢問按照r公升序。3 開始計算 列舉i從1到m m為詢問個數 對於某個位置x,將pre pre x 1增加1,pre x ...

BZOJ2743 HEOI2012 採花 題解

蕭薰兒是古國的公主,平時的一大愛好是採花。今天天氣晴朗,陽光明媚,公主清晨便去了皇宮中新建的花園採花。花園足夠大,容納了n朵花,花有c種顏色 用整數1 c表示 且花是排成一排的,以便於公主採花。公主每次採花後會統計採到的花的顏色數,顏色數越多她會越高興!同時,她有一癖好,她不允許最後自己採到的花中,...

樹狀陣列 luogu4113 採花

花園裡有c種花共計n朵,公主要在乙個區間 l,r 內採花,僅當該顏色的花必須至少可以採到兩朵,公主才會採它,問公主可以才多少種花。此外,題目會給出m個這樣的閉區間用來詢問。0 c顯然,這個問題和之前的luogu1972 hh的項鍊是很類似的,本質是在求區間內不同元素的數目,只是僅當該元素至少出現兩次...