樹狀陣列 luogu4113 採花

2021-09-29 22:47:25 字數 1315 閱讀 4982

花園裡有c種花共計n朵,公主要在乙個區間[l,r]內採花,僅當該顏色的花必須至少可以採到兩朵,公主才會採它,問公主可以才多少種花。此外,題目會給出m個這樣的閉區間用來詢問。

0<=c顯然,這個問題和之前的luogu1972-hh的項鍊是很類似的,本質是在求區間內不同元素的數目,只是僅當該元素至少出現兩次時才計入統計。所以處理該問題的基本方法與項鍊問題也應該基本一致,區別主要在於對二次出現統計的處理。

在項鍊中,我們給上次出現的位置置零,給這次出現為位置置一,也就是只統計最後一次出現。類似地,為實現兩次出現才統計的效果,我們可以在這次出現時,給上次出現置一給上上次出現置零,也就是只統計倒數第二次出現

在實現只統計倒數第二次出現的過程中,由於需要記錄上次、上上次的情況,所以需要設定

int last[maxn][2

]//last[i][0]、last[i][1]分別為i的上上次、上次出現的位置

#include

#include

#include

struct query};

const

int maxf=

2e6+10;

const

int maxn=maxf;

int last[maxf][2

];int c[maxn]

;int a[maxn]

;int ans[maxn]

;query queries[maxn]

;int pos[maxn]

;void

add(

int x,

int t)

}int

sum(

int x)

return ans;

}using

namespace std;

intmain()

ans[queries[i]

.idx]

=sum

(r)-

sum(l-1)

;}for(

int i=

1;i<=m;i++

)printf

("%d\n"

,ans[i]);

return0;

}

BZOJ 2743 採花(樹狀陣列)

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...

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 ...

luogu3374 3368樹狀陣列

引人入勝的3374 include include using namespace std int c 500005 n,m,u,v,w,k inline int lowbit int x void add int pos,int num int sum int pos return temp in...