BZOJ2743 HEOI2012 採花 題解

2022-05-16 12:00:44 字數 1570 閱讀 6612

蕭薰兒是古國的公主,平時的一大愛好是採花。

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

花園足夠大,容納了n朵花,花有c種顏色(用整數1-c表示),且花是排成一排的,以便於公主採花。公主每次採花後會統計採到的花的顏色數,顏色數越多她會越高興!同時,她有一癖好,她不允許最後自己採到的花中,某一顏色的花只有一朵。為此,公主每採一朵花,要麼此前已採到此顏色的花,要麼有相當正確的直覺告訴她,她必能再次採到此顏色的花。

由於時間關係,公主只能走過花園連續的一段進行採花,便讓女僕福涵潔安排行程。福涵潔綜合各種因素擬定了m個行程,然後一一向你詢問公主能採到多少朵花(她知道你是程式設計高手,定能快速給出答案!),最後會選擇令公主最高興的行程(為了拿到更多獎金!)。

聽說又是一道套路題……?還是hh的項鍊變形版?emm那不是個分塊/莫隊嗎,這題資料範圍這麼大怎麼做a……

以及這題被某大佬標為0分sb題emmm……感覺到了深深的差距。

參考:如果我們知道hh的項鍊如何用樹狀陣列來做的話這題就異常簡單了。

我們將詢問離線,然後從左往右掃,保證每種顏色出現第二次的位置標上1,這樣我們詢問$[l,r]$就相當於直接樹狀陣列區間查詢$[1,r]$的1的個數就行了。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=2e6+5

;inline

intread()

while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}struct

datad[n];

intn,m,c,b[n],tr[n],ans[n],lst[n],nxt[n];

bool

vis[n];

inline

bool

cmp(data a,data b)

inline

int lowbit(int t)

inline

void add(int x,int

y)inline

int qry(int

x)int

main()

nxt[

0]=0

;

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

sort(d+1,d+m+1

,cmp);

for(int i=1,j=1;i<=n;i++)

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

bzoj4032 HEOI2015 最短不公共子串

字尾自動機 序列自動機 序列自動機這東西好像很高階的樣子。其實很簡單的啦。詳細可以看一下我的部落格序列自動機 對字串a構建字尾自動機 str a 和序列自動機 seq a 類似地,對字串b也構建字尾自動機 str b 和序列自動機 seq b 然後對於4個詢問我們分別拿出1個自動機,如第乙個詢問拿出...