bzoj2038
題意:q(5000)次詢問,問在區間中隨意取兩個值,這兩個值恰好相同的概率是多少?分數表示;
感覺自己複述的題意極度抽象,還是原題意有趣(逃;
思路:設在l到r這個區間中,x這個值得個數為a個,y這個值的個數為b個,z這個值的個數為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+.....)) / ((r-l+1)*(r-l))
顯然其中(a+b+c+.....)就是區間的長度,每個值得個數總和。
即: (a^2+b^2+c^2+...x^2-(r-l+1))/((r-l+1)*(r-l))
每次sum記錄a^2+b^2+c^2+...x^2,用莫隊轉移即可。
#include #includebzoj2038#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
//#pragma comment(linker, "/stack:102400000,102400000")
//c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queuetypedef
long
long
ll;typedef unsigned
long
long
ull;
typedef pair
pll;
typedef pair
pii;
//priority_queueq;
//這是乙個大根堆q
//priority_queue,greater>q;
//這是乙個小根堆q
#define fi first
#define se second
#define endl '\n'
#define okc ios::sync_with_stdio(false);cin.tie(0)
#define ft(a,b,c) for(int a=b;a <= c;++a) //
用來壓行
#define rep(i , j , k) for(int i = j ; i < k ; ++i)
//priority_queue, greater>que;
const ll mos = 0x7fffffff; //
2147483647
const ll nmos = 0x80000000; //
-2147483648
const
int inf = 0x3f3f3f3f
;const ll inff = 0x3f3f3f3f3f3f3f3f; //
18template
inline t read(t&x)
//#define _debug; //*
//#ifdef _debug
freopen(
"input
", "r"
, stdin);
//freopen("output.txt", "w", stdout);
#endif
/*-----------------------show time----------------------
*/const
int b = 233
;
#define bel(x) ((x-1)/b + 1)
intn,m;
ll sum = 0
;
const
int maxn = 50009
;
struct
node
q[maxn];
struct
resans[maxn];
intcnt[maxn],col[maxn];
bool
cmp(node a,node b)
return bel(a.le)
}void del(int
x)
void add(int
x)int
main()
sort(q+1,q+1+m,cmp);
int pl = 1, pr = 0
; sum = 0
;
for(int i=1; i<=m; i++)
ans[q[i].id].a = sum - (q[i].ri - q[i].le + 1
); ans[q[i].id].b = (q[i].ri - q[i].le + 1) * (q[i].ri -q[i].le);
}for(int i=1; i<=m; i++)
else printf("
%lld/%lld\n
", ans[i].a/tmp, ans[i].b/tmp);
}return0;
}
BZOJ 2038 小Z的襪子(莫隊演算法)
莫隊演算法的話,看這個比較好懂 net bossup article details 39236275 不過這裡面的部落格的 貌似有點問題,所以 的話,net lwt36 article details 50583757 這個是對的,看我的也行。什麼時候用莫隊?1 區間不會被修改 2 可以離線 3 ...
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 對於每...