BZOJ 3809 Gty的二逼妹子序列

2022-05-11 23:48:12 字數 1678 閱讀 9961

題意:n個元素(1<=n<=100000)每個元素有一權值<=n。q個詢問,1<=q<=1000000,每次詢問區間[l, r]的權值在區間[a, b]的種類數。時限35s...

#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

#define pb push_back

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define cc(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << (#x) << " = " << (x) << endl

#define error(x) (!(x)?puts("error"):0)

#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)

inline int getint()

const int n=100005;

int n, pos[n], cnt[n], sum[n], m, ans[n*10], w[n], sq;

struct dat a[n*10];

inline bool cmp(const dat &a, const dat &b)

for1(i, bl+1, br-1) ret+=sum[i];

bl=sq*bl;

br=sq*(br-1)+1;

for1(i, l, bl) ret+=cnt[i]>0;

for1(i, br, r) ret+=cnt[i]>0;

return ret;

}void update(int x, int k)

int main()

for1(i, 1, m) printf("%d\n", ans[i]);

return 0;

}

好神的一題orz

一開始寫裸的線段樹+莫隊t了....沒分析複雜度果然會跪...如果是這樣寫,單次查詢$o(logn)$,修改$o(logn)$,而有$q$個詢問,所以總的複雜度為$o(n^logn+qlogn)$...tle成翔....單組極限資料大概就要5s以上的樣子?

於是看題解,orz rausen orz hzwer

因為權值的範圍在n內,我們可以將權值也分塊!即統計對應塊內的種類數即可...

這樣的話,單次修改可以到$o(1)$,單次查詢$o(n^)$,總的複雜度為$o(n^+qn^)$,單組資料大概3s左右....

於是就水過了...

聽說xyz大爺的集訓隊**有更優越的做法,先留個坑...

BZOJ3809 Gty的二逼妹子序列

空間這麼小 然後就莫隊了 不知道三維kd tree能不能過 本來想打bit,結果發現過不了的樣子,因為修改比較多,詢問比較少,所以可以考慮平衡複雜度,用分塊維護 單次修改o 1 詢問o n code include include include include include include in...

bzoj3809 Gty的二逼妹子序列

先說一種很顯然的做法,大體框架肯定是莫隊,然後每來一種顏色就處理下,如果是新出現的就在bit當中把這個位置 1,如果這種顏色消失了就在bit中對應位置 1。這樣的時間複雜度是o nn log 2n 我交了一次發現超時了。那怎麼辦?觀察下,我們查詢和修改的複雜度都是o logn 但是顯然查詢的次數要遠...

bzoj 3809 Gty的二逼妹子序列

autumn和bakser又在研究gty的妹子序列了!但他們遇到了乙個難題。對於一段妹子們,他們想讓你幫忙求出這之內美麗度 a,b 的妹子的美麗度的種類數。為了方便,我們規定妹子們的美麗度全都在 1,n 中。給定乙個長度為n 1 n 100000 的正整數序列s 1 si n 對於m 1 m 100...