花園裡有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...