loj2461 完美的佇列

2021-08-18 03:03:55 字數 2141 閱讀 8258

有n個佇列,每個佇列有乙個上限ai

。 當佇列上限滿時,如果還要push,其會先執行一次pop。

現在有m

個操作。

每次操作都會給乙個區間的佇列push同乙個x。

要求回答每次操作後所有佇列中數的種類數。

當乙個數

x進入第

i 個佇列,這個佇列再push ai

次會pop掉這個

x 。

這個非常顯然。

現在對於每個操作,我們需要知道最早在第幾次操作後,這次操作加入的

x全部被pop,就得到了這個

x 的存在時間。

接下來對於同乙個

x的若干存在時間取並,差分字首和可以算出答案。

於是難點在求出什麼時候pop完。

我們將序列分塊,然後先考慮對於每個操作求出其所覆蓋的每個整塊什麼時候pop完,再求出散塊中每個位置什麼時候pop完。

我們列舉乙個整塊,然後考慮順序列舉操作j,同時維護乙個指標k,表示執行(j,k]的操作可以把每個位於整塊的位置彈完。假如能維護出這個指標k,顯然如果操作j包含這個整塊,就可以將k和j的答案取max。

維護的具體是我們對整塊內每個元素維護乙個val,初始為a,表示執行了(j,k]後的散塊操作其還有多少次才能彈完,同時維護val中的mx。用ad表示(j,k]中有多少操作覆蓋了整塊,那麼當mx-ad<=0時,k是合法的。

增加乙個操作時,如果其完整覆蓋了這個整塊,讓ad++。否則如果其與該整塊有交,暴力將交的部分的val–,並更新mx,減少乙個操作同理。

對於乙個操作,其只會貢獻2 sqrt n的暴力改val。

接下來解決散塊。

在處理整塊時可以維護出乙個字首和,表示覆蓋整塊的次數。

同樣要維護每種字首和第一次出現的位置。

現在我們列舉乙個位置,把散塊包含其的操作提出來,同樣two-pointer,然後用上面提到的兩個資訊就可以了。詳見**。

複雜度乙個根號。

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using namespace std;

const

int maxn=100000+10,b=3;

int belong[maxn],val[maxn],sum[maxn],fi[maxn];

int l[maxn],r[maxn],data[maxn],a[maxn],b[maxn],c[maxn],id[maxn];

struct dong

} p[maxn*4];

queue dl[maxn];

int i,j,k,l,r,t,n,m,tot,top,ad,mx,len;

int read()

while (ch>='0'&&ch<='9')

return x*f;

}void ins(int

id,int f)

else

if (r[id]id]>r) return;

int i,j=l,k=r;

j=max(j,l[id]);

k=min(k,r[id]);

fo(i,j,k) val[i]-=f;

mx=0;

fo(i,l,r) mx=max(mx,val[i]);

}void work(int p,int q)

k=0;

fo(j,1,tot)

else}}

}}int main()

top=mx;

fo(i,1,n) belong[i]=(i-1)/b+1;

fo(i,1,m)

else

}fo(i,1,belong[n])

ins(k=1,1);

fo(j,1,m)

fo(j,1,m)

}len=sum[m];

work(l,r);

}tot=0;

fo(i,1,m)

mx=top;

fo(i,1,mx)

sort(p+1,p+tot+1);

r=0;

fo(i,1,mx)}}

t=0;

fo(i,1,m)

}

luogu2461遞迴數列

題目描述 乙個由自然數組成的數列按下式定義 對於i k ai bi 對於i k ai c1ai 1 c2ai 2 ckai k 其中bj 和 cj 1 j k 是給定的自然數。寫乙個程式,給定自然數m n,計算am am 1 am 2 an,並輸出它除以給定自然數p的餘數的值。輸入輸出格式 輸入格式...

hdu 2461 容斥原理 Rectangle

題意 給你n n很小 個長方形,求這中間任意長方形的面積並。題解 容斥原理。include include include using namespace std int n,q struct recrec 30 int s 1 20 3 a 22 cnt,add,id rec intersec r...

HDU 2461 Rectangles(容斥原理)

題意 給出n個矩形的左下角和右上角座標,要求進行m次操作,每次對t個矩形進行塗色 給出這t個矩形的序號 要求計算出每次塗色時需要塗色的面積。塗色可以覆蓋,即每次操作不受前面任何操作的影響 分析 矩形之間可以覆蓋,每次操作要計算覆蓋後圖形的面積,這裡就要用到容斥原理 每次操作時有如下關係式 需要塗色的...