洛谷P1494 [國家集訓隊]小Z的襪子(莫隊)
從總的襪子數中任意選取 2 個作為分母,再從任意顏色相同的襪子數中選取 2 個,可以先與處理一下 ,這樣每次更新減去上一次的值,在加上這一次的值。
雖然資料量不大,但是預處理的時候會爆 int ,累加答案的時候也會爆,所以採用 long long
const int N=5e4+5;
int i,j,k;
int n,m,t;
int a[N];
int num,block,bel[N];
struct Node
{
int id;
int l,r;
bool operator<(Node b)
{
return bel[l]^bel[b.l] ? l<b.l : (bel[l]&1 ? r<b.r : r>b.r);
}
}q[N];
ll cnt[N],cur;
pll ans[N];
ll jc[N];
void init()
{
jc[0]=jc[1]=0;
for(ll i=2;i<N;i++) jc[i]=(i-1)*i/2;
}
void build()
{
block=sqrt(n);
num=n/block; if(n%block) num++;
for(int i=1;i<=num;i++){
int l=block*(i-1)+1;
int r=min(block*i,n);
for(int j=l;j<=r;j++) bel[j]=i;
}
}
void add(int pos)
{
int x=a[pos];
cur-=jc[cnt[x]];
cnt[x]++;
cur+=jc[cnt[x]];
}
void del(int pos)
{
int x=a[pos];
cur-=jc[cnt[x]];
cnt[x]--;
cur+=jc[cnt[x]];
}
int main()
{
//IOS;
init();
while(~sdd(n,m)){
for(int i=1;i<=n;i++) sd(a[i]);
for(int i=1;i<=m;i++) sdd(q[i].l,q[i].r),q[i].id=i;
build(); sort(q+1,q+1+m);
int l=1,r=0; cur=0;
for(int i=1;i<=m;i++){
while(l>q[i].l) add(--l);
while(l<q[i].l) del(l++);
while(r>q[i].r) del(r--);
while(r<q[i].r) add(++r);
ans[q[i].id].fr=cur;
ans[q[i].id].sc=jc[r-l+1];
}
for(int i=1;i<=m;i++){
ll d=__gcd(ans[i].fr,ans[i].sc);
//dbg(ans[i].fr);
if(d==0) printf("0/1\n");
else printf("%lld/%lld\n",ans[i].fr/d,ans[i].sc/d);
}
}
//PAUSE;
return 0;
}
相關文章
- C112 莫隊演算法 P1494 [國家集訓隊] 小 Z 的襪子演算法
- 洛谷P1972(莫隊演算法)演算法
- [國家集訓隊] Tree I
- 洛谷P4074糖果公園(帶修莫隊)
- 洛谷團隊
- [國家集訓隊] Crash的數字表格 / JZPTAB
- P1501 [國家集訓隊]Tree II
- P1407 [國家集訓隊] 穩定婚姻
- P2757 [國家集訓隊] 等差子序列 與 CF452F Permutation
- 洛谷P1223 排隊接水
- 莫隊
- 神奇的莫隊
- P1505 [國家集訓隊]旅遊 (樹鏈剖分)
- 洛谷P2062 分隊問題(dp)
- P2371-[國家集訓隊]墨墨的等式【同餘最短路】
- 分塊 and 莫隊
- 莫隊詳解
- 集訓隊互測 2024
- 省隊集訓遊記
- 莫隊演算法演算法
- 根號分治莫隊
- 基礎莫隊模板
- 分塊與莫隊
- 洛谷:P2814 家譜(並查集)並查集
- 洛谷P1422 小玉家的電費
- [集訓隊互測2016] Unknown
- 莫隊學習筆記筆記
- 「2021集訓隊互測」Lovely Dogs
- IOI2021集訓隊作業
- 【演算法學習】莫隊演算法
- 基礎莫隊演算法演算法
- 洛谷 P2257 YY的GCD(莫比烏斯反演)GC
- 莫隊的 1.5 近似構造 題解
- 【2024-ZR-C Day 5】資料結構(3):莫隊(帶修莫隊、回滾莫隊)、邊分治、點分治、樹分治、動態點分治資料結構
- C116 莫隊二次離線 P4887 莫隊二次離線
- 分塊莫隊學習筆記筆記
- 回滾莫隊學習筆記筆記
- cf375D. Tree and Queries(莫隊)