JSOI2018 軍訓列隊

2022-05-20 08:12:50 字數 992 閱讀 9931

\(n(n\le5\times10^5)\)個學生排成一排,第\(i\)個學生的位置為\(a_i\)。\(m(m\le5\times10^5)\)次命令,每次將編號在\([l,r]\)之間的學生移動到\([k,k+r-l]\)位置上,每個位置站乙個人,順序自定(無需考慮原來在\([k,k+r-l]\)位置上的人)。每次的代價為每個人移動距離之和。求每次操作的最小代價。

建立主席樹,維護每個區間內人數和與座標和。

考慮所有人都在區間\([k,k+r-l]\)以左/右的情況,答案就是每個人座標和與區間\([k,k+r-l]\)座標和之差。

否則將學生按照座標大小分成兩部分考慮,若座標較小的學生有\(d\)個,統計將兩部分人分別放入區間\([l,l+d)\)和\([l+d,r]\)的代價即可。

時間複雜度\(\mathcal o(n\log n)\)。

#include#includetypedef long long int64;

inline int getint()

const int n=5e5+1,m=1e6,logm=30;

class fotiletree ;

node node[n*logm];

int sz,new_node(const int &p)

int length(const int &b,const int &e) const

public:

int root[n];

void insert(int &p,const int &b,const int &e,const int &x)

int64 query(const int &q,const int &p,const int &b,const int &e,const int &l,const int &r) const

};fotiletree t;

int main()

for(register int i=0;ireturn 0;

}

JSOI2018 絕地反擊

loj 明顯是二分答案.首先考慮每乙個點在乙個時間內能夠到達的點是乙個圓,那麼如果圓和大圓相離,顯然不行.現在考慮有交,你取的一定是兩個端點中的乙個,接著你就可以發現這個東西可以網路流.唯一的問題在於,你需要考慮這段區間外要把這個匹配刪除,那麼可以考慮模擬退流的過程.include include ...

JSOI2018 防禦網路

題面 題解這道題對我來說意義重大,是我花了很長時間獨立完成的dp。分析題目 給出乙個仙人掌,對於乙個點集 s 把原圖中使他聯通的最小的邊集記做 h s 求 sum h s 從考慮邊的貢獻的思路開始。對於非環邊,假設它把 v 分成了 s 和 t 兩個區域,如果它被使用,當且僅當其中存在兩個點 a,b ...

JSOI2018 潛入行動

題目 我好菜啊,嚶嚶嚶 原來本地訪問陣列負下標不會報 re 或者 wa 甚至能跑出正解啊 這道題還是非常呆的 我們發現 k 很小,於是斷定這是乙個樹上揹包 發現在乙個點上安裝控制器並不能控制這個點,可能需要到父親那邊才能控制這個點,於是我們設 dp i j 0 1 0 1 表示在以 i 為根的子樹裡...