莫隊演算法的話,看這個比較好懂:
.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 對於每...