BZOJ 2038 小Z的襪子(莫隊演算法)

2021-07-09 21:48:54 字數 2979 閱讀 2084

莫隊演算法的話,看這個比較好懂:

.net/bossup/article/details/39236275

不過這裡面的部落格的**貌似有點問題,所以**的話,

.net/lwt36/article/details/50583757

這個是對的,看我的也行。

什麼時候用莫隊?

1、區間不會被修改

2、可以離線

3、對於[l,r],可以直接退出[l,r+1],[l,r-1],[l+1,r],[l-1,r]

4、資料規模合適,莫隊的複雜度nsqrt(n)

題意:

題意我就不說了,其實這題對於公式的化簡也算是乙個難點,不過,都把他

當做莫隊的模板題,所以也就忽視了推導過程。

對於l,r的詢問。設其中顏色為x,y,z...

.的襪子的個數為a,b,c。。。

那麼答案即為(a*(a-

1)/2

+b*(b-

1)/2

+c*(c-

1)/2.

...)/((r-l

+1)*

(r-l)/2)化簡得:(a^2

+b^2

+c^2

+...x^2

-(a+b+c+d+

.....))/

((r-l

+1)*(r-l))

即:(a^2

+b^2

+c^2

+...x^2

-(r-l

+1))/((r-l

+1)*(r-l))

這就是推導過程,恩,看了就懂了。

莫隊有乙個關鍵,就是塊內的r是上公升的,一定要記住,不然和暴力

就沒區別了。

我已開始排序的時候寫成這樣:

struct query

bool operator < (const query& rhs) const

};

結果t到死。

**:

//

// created by cqu_cst_wuerli

//// #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define clr(x) memset(x,0,sizeof(x))

#define off(x) memset(x,-1,sizeof(x))

#define mem(x,a) memset((x),(a),sizeof(x))

#define for_uva if (kase!=1) cout << endl

#define bug cout << "i am here" << endl

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

#define si(a) scanf("%d",&a)

#define sii(a,b) scanf("%d%d",&a,&b)

#define siii(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define rep(flag,start,end) for(int flag=start;flag<=end;flag++)

#define rep(flag,start,end) for(int flag=start;flag>=end;flag--)

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define root 1,n,1

#define biginteger bign

const

int max_l=2005;// for biginteger

const

int inf_int=0x3f3f3f3f;

const

long

long inf_ll=0x7fffffff;

const

int mod=1e9+7;

const

double eps=1e-9;

const

double pi=acos(-1);

typedef

long

long ll;

using

namespace

std;

inline

int read()

return x;

}const

int n=5e4+10;

const

int m=250;

int n,m;

int c[n];

int num[n];

ll ans,up[n],dw[n];

struct query

bool

operator

< (const query& rhs) const

int main()

ans=0ll;

clr(num);

rep(i,0,n/m+2) sort(block[i].begin(),block[i].end());

int pl,pr;

rep(i,0,n/m+2) if (block[i].size())

rep(j,pl,pr) update(j,-1);

}rep(i,1,m) printf("%lld/%lld\n",up[i],dw[i]);

}return

0;}

BZOJ2038 小Z的襪子 莫隊

bzoj2038 題意 q 5000 次詢問,問在區間中隨意取兩個值,這兩個值恰好相同的概率是多少?分數表示 感覺自己複述的題意極度抽象,還是原題意有趣 逃 思路 設在l到r這個區間中,x這個值得個數為a個,y這個值的個數為b個,z這個值的個數為c個。那麼答案即為 a a 1 2 b b 1 2 c...

BZOJ2038,小Z的襪子(莫隊演算法)

莫隊演算法。這道題wa了很多次,猜測可能是跟oj系統有關,有點坑。如下 include include include includeusing namespace std typedef long long ll const int maxn 5e4 5 const int mm 2e6 5 in...

BZOJ2038 小Z的襪子(莫隊演算法)

題目 分析 莫隊演算法 莫隊演算法是一種思想 處理問題 不帶修改的區間詢問 使用要求 l 1,r l,r 1 的結果可由 l,r 的答案在o 1 或o logn 的時間內推出 具體步驟 1 對整個區間軸分成根號n塊 2 以l所在的塊的編號為第一關鍵字,r為第二關鍵字給所有詢問排序方便處理 3 對於每...