題意:1~n號插線板 每個插線板有乙個存在的時間每個人有乙個使用時間 問插在哪個插線板可以挪動次數最少 每次乙個插線板的插入和取走都只會對他後面的乙個產生影響
將每個人的操作拆成兩個 然後預處理succ表示我操作這個之後會對後面的哪個插線板產生挪動次數的貢獻
然後分塊 表示這段時間之前到所有點的區間挪動最優值處理出來 針對每個操作使用可持久化塊狀陣列維護 (查詢o(1))查詢的時候因為我塊前面的已經處理出來了 那麼顯然我只需要考慮我這個塊到我這個人需要時間的這些區域裡的最小值 我已在sqrt的時間處理出來
#include
#include
#include
#include
#define n 100010
#define bk 350
#define inf 0x3f3f3f3f
using
namespace
std;
inline
char gc()
return *s++;
}inline
int read()
while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc();
return x*f;
}struct persistent_block_array
inline
int query(int x)
}arr[n];
struct nodeopt[n];
inline
bool cmp(const node &a,const node &b);opt[++cnt]=(node);
}sort(opt+1,opt+(n=cnt)+1,cmp);
for (int i=1;i<=n;++i)
for (int i=1;i<=n;++i)
for (int j=1;j<=n;j+=bk)pre_ans[j/bk][i]=mn;
if (opt[i].op&&su)}}
for (int i=1;i<=q;++i)last_ans=mn;
printf("%d\n",last_ans!=inf?last_ans:-1);
last_ans=type==0?0:last_ans;last_ans=last_ans==inf?0:last_ans;
}return
0;}
BJ 集訓測試10 城市
圓上均勻分布n 個點 然後 在這n個點中連n 3條邊 且這些邊不相交 有q次詢問每次詢問兩點間的最短距離 因為原圖是平面圖所以可以考慮轉成對偶圖 然後點分治 不想寫對偶圖 點分治可以考慮邊分治 每次選擇一條邊 將這條邊左右的邊的數量盡量平均分布 因為這題比較特殊是在乙個圓環上 所以考慮 我給所有點標...
BJ 集訓測試13 鋼琴
題意給乙個序列 1e6 給乙個字符集大小為n且 100 每次1 n的概率生成其中乙個字元 求每個字首生成的期望 公式 dp i dp next i n i 證明 include define rep i,x,y for register int i x i y i define repd i,x,y...
BJ 集訓測試12 coin
題意 有n種貨幣,每種貨幣有乙個價值vi,並且滿足任意兩種貨幣的價值成倍數關係。即對於第i種貨幣和第j種貨幣,有vi整除vj,或者vj整除vi。現在給出這n種貨幣的價值,請你計算有多少種方案能湊出價值為m的貨幣組合。假設每種貨幣的數量是無限的,貨幣的價值互不相同。為了保證有解,我們約定存在一種貨幣的...