description
作為乙個生活散漫的人,小z每天早上都要耗費很久從一堆五顏六色的襪子中找出一雙來穿。終於有一天,小z再也無法忍受這惱人的找襪子過程,於是他決定聽天由命……
具體來說,小z把這n只襪子從1到n編號,然後從編號l到r(l 儘管小z並不在意兩隻襪子是不是完整的一雙,甚至不在意兩隻襪子是否一左一右,他卻很在意襪子的顏色,畢竟穿兩隻不同色的襪子會很尷尬。
你的任務便是告訴小z,他有多大的概率抽到兩隻顏色相同的襪子。當然,小z希望這個概率盡量高,所以他可能會詢問多個(l,r)以方便自己選擇。
input
輸入檔案第一行包含兩個正整數n和m。n為襪子的數量,m為小z所提的詢問的數量。接下來一行包含n個正整數ci,其中ci表示第i只襪子的顏色,相同的顏色用相同的數字表示。再接下來m行,每行兩個正整數l,r表示乙個詢問。
output
包含m行,對於每個詢問在一行中輸出分數a/b表示從該詢問的區間[l,r]中隨機抽出兩隻襪子顏色相同的概率。若該概率為0則輸出0/1,否則輸出的a/b必須為最簡分數。(詳見樣例)
sample input
6 41 2 3 3 3 2
2 61 3
3 51 6
sample output
2/50/1
1/14/15
【樣例解釋】
詢問1:共c(5,2)=10種可能,其中抽出兩個2有1種可能,抽出兩個3有3種可能,概率為(1+3)/10=4/10=2/5。
詢問2:共c(3,2)=3種可能,無法抽到顏色相同的襪子,概率為0/3=0/1。
詢問3:共c(3,2)=3種可能,均為抽出兩個3,概率為3/3=1/1。
注:上述c(a, b)表示組合數,組合數c(a, b)等價於在a個不同的物品中選取b個的選取方案數。
【資料規模和約定】
30%的資料中 n,m ≤ 5000;
60%的資料中 n,m ≤ 25000;
100%的資料中 n,m ≤ 50000,1 ≤ l < r ≤ n,ci ≤ n。
演算法版權歸屬:莫濤
這是乙個沒有修改的莫隊,實際上就是把詢問離線分塊排序,假設我們已經知道了(l,r)的答案,我們就可以暴力轉移(l+1,r),(l,r+1),(l-1,r),(l,r-1)
去網上找了很多題解之類的,都沒有詳細的注釋,於是我就在程式中良心的詳細解釋了
這裡寫**片
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int n=5010;
int n,m,a[n*10];
struct node;
node nod[n*10];
int num[n*10]; //記錄每種顏色出現的次數
struct node2;
node2 ans[n*10];
int unit;
int cmp(const node & a,const node & b)
//m個查詢先按照第幾個塊(l)排序,再按照 r排序。
return b;
}void huajian(int bh)
void work()
while (r>nod[i].r) //暴力把右端點向左移動,相當於範圍減小了,所以後--
while (l//暴力將左端點向右移動,相當於範圍減小了,所以後++
while (l>nod[i].l) 暴力將左端點向左移動
ans[nod[i].id].a=tmp-(r-l+1);//講真,我也不是特備明白為什麼要這麼幹
ans[nod[i].id].b=(ll)(r-l+1)*(r-l); //區間的總的方案數為(r-l+1)×(r-l)/2
//是不是奇怪(/2)去哪了,如果分子分母都要/2,我們就乾脆把/2扔了吧
huajian(nod[i].id);
}return;
}int main()
unit=(int)sqrt(n); //分塊,每個塊的大小是sqrt(n)
sort(nod+1,nod+1+m,cmp);
work();
for (int i=1;i<=m;i++)
printf("%d/%d\n",ans[i].a,ans[i].b);
return
0;}
小z的襪子(莫隊)
description 作為乙個生活散漫的人,小z每天早上都要耗費很久從一堆五顏六色的襪子中找出一雙來穿。終於有一天,小z再也無法忍受這惱人的找襪子過程,於是他決定聽天由命 具體來說,小z把這n只襪子從1到n編號,然後從編號l到r l 儘管小z並不在意兩隻襪子是不是完整的一雙,甚至不在意兩隻襪子是否...
BZOJ2038 小Z的襪子 莫隊
bzoj2038 題意 q 5000 次詢問,問在區間中隨意取兩個值,這兩個值恰好相同的概率是多少?分數表示 感覺自己複述的題意極度抽象,還是原題意有趣 逃 思路 設在l到r這個區間中,x這個值得個數為a個,y這個值的個數為b個,z這個值的個數為c個。那麼答案即為 a a 1 2 b b 1 2 c...
2038 國家集訓隊 小Z的襪子 莫隊
作為乙個生活散漫的人,小z每天早上都要耗費很久從一堆五顏六色的襪子中找出一雙來穿。終於有一天,小z再也無法忍受這惱人的找襪子過程,於是他決定聽天由命 具體來說,小z把這n只襪子從1到n編號,然後從編號l到r l 儘管小z並不在意兩隻襪子是不是完整的一雙,甚至不在意兩隻襪子是否一左一右,他卻很在意襪子...