有\(n\)個插線板,每個插線板會在\(l_i\)時刻初插入到佇列中(佇列是按插線板的編號排序的),\(r_i\)時刻末移除。
插入乙個插線板時會對當前所有接在佇列中這個插線的下乙個插線板上的用電器造成\(1\)的代價。
有\(q\)個詢問,每次給你\(x,y\),問你你要在\(x\)時刻把用電器接在插線板上,\(y\)時刻移除,最少的代價是多少。
\(n,q\leq 50000\)
先處理每個時刻那個插線板上的用電器得到了\(1\)的代價。這個東西的總和是\(o(n)\)的。
可以用分塊在\(o(n\sqrt n)\)內預處理,\(o(1)\)查詢如果把用電器接在乙個插線板上,那麼代價是多少。
按時間分塊,預處理出每一塊的左端點到右邊任意乙個點的答案。
可以列舉左端點然後從最右邊往左掃一遍,維護當前的最小值。
那麼對於乙個詢問\(x,y\),找到包含這個詢問左端點的塊的左端點\(l\),那麼答案只有可能是三種情況:
1.詢問\([l,y]\)的答案,這個已經處理好了。
2.插到乙個在\([l,x]\)中有修改的插線板上。
3.插到乙個在\([l,x]\)中插入的插線板上。
暴力統計即可。
取塊大小\(size=\sqrt n\)可以得到最優時間複雜度\(o((n+q)\sqrt n)\)
#include#include#include#include#include#includeusing namespace std;
int rd()
typedef pairpii;
const int inf=0x3fffffff;
setst;
int b1[100010];
int b2[100010];
void add(int x,int y)
int al[100010];
int ar[100010];
pii c[100010];
const int n=100000;
const int size=500;
struct orz
void add(int x)
s[(i-1)/size][j]=now;
if(c[j].second==1&&b1[j])
}} int x,y;
int last=0;
for(int i=1;i<=q;i++)
int ans=s[(x-1)/size][y];
for(int j=(x-1)/size*size+1;j<=x;j++)
if(ans==inf)
ans=-1;
printf("%d\n",ans);
if(ans==-1)
last=0;
else
last=ans;
} return 0;
}
XSY2759 coin DP 線性插值
有 n 種面值不同的硬幣,每種有無限個,且任意兩個 x,y 要麼 x 是 y 的倍數,要麼 y 是 x 的倍數。你要取 m 元錢,問你有多少種不同的取法。n leq 50,m leq 假設面值為 a 1,a 2,ldots,a n 先把所有硬幣按面值從小到大排序。那麼考慮從小到大取錢。如果前面 i ...
主機板前置 插線接法大全
機箱前置 usb線如何與主機板進行連線,對於一些新手有一定難度,要知道一旦接線出錯,輕則無法使用usb裝置,重則燒毀usb裝置或主機板。一 機箱前置usb接線的定義 首先還是了解一下機箱上前置usb各個接線的定義。通常情況下 紅線 電源正極 接線上的標識為 5v或vcc 白線 負電壓資料線 標識為 ...
士兵殺敵(樹狀陣列 插點問線)
描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入只有一組測試資料 第一行是兩個整數n...