BZOJ2138 stone 霍爾定理 線段樹

2022-05-07 21:12:07 字數 1751 閱讀 3374

一共有 \(n\) 堆石子,每堆石子有乙個數量 \(a\) ,你要進行 \(m\) 次操作,每次操作你可以在滿足前 \(i-1\) 次操作的回答的基礎上選擇在 \([l_i,r_i]\) 區間中拿走至多 \(b\) 顆石子,保證區間不存在包含關係,求每次你最多拿走多少顆石子。

\(n\le 4\times 10^4\)

#includeusing namespace std;

typedef long long ll;

#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)

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

#define pb push_back

#define re(x) memset(x, 0, sizeof x)

inline int gi()

while(isdigit(ch))

return x * f;

}template inline void max(t &a, t b)

template inline void min(t &a, t b)

const int n = 4e4 + 7;

int n, m;

int a[n], r[n], l[n], sa[n], k[n], tt[n], rk[n];

#define ls o << 1

#define rs (o << 1 | 1)

struct sgt

void pushdown(int o)

adv[o] = 0;

} void pushup(int o)

void build(int l, int r, int o) int mid = l + r >> 1;

build(l, mid, ls);

build(mid + 1, r, rs);

pushup(o);

} void modify(int l, int r, int l, int r,int o, int v)

pushdown(o);int mid = l + r >> 1;

if(l <= mid) modify(l, r, l, mid, ls, v);

if(r > mid) modify(l, r, mid + 1, r, rs, v);

pushup(o);

} int query(int l, int r, int l, int r, int o)

}t[2];

bool cmp(int a, int b)

int main()

m = gi(), k[1] = gi(), k[2] = gi(), x = gi(), y = gi(), z = gi(), p = gi();

if(!m) return 0;

rep(i, 3, m)

rep(i, 1, m) l[i] = gi(), r[i] = gi();

rep(i, 1, m) tt[i] = i;

sort(tt + 1, tt + 1 + m, cmp);

rep(i, 1, m) rk[tt[i]] = i;

t[1].id = 1; t[0].build(1, m, 1); t[1].build(1, m, 1);

rep(i, 1, m)

return 0;

}

21 3 進度事件

事件 說明loadstart 接收到響應的第乙個位元組時觸發 progress 接收響應期間連續觸發 error 請求發生錯誤時觸發 abort 通過 abort 方法終止連線時觸發 load 接收到完整的響應資料時觸發 loadend 通訊完成或觸發 error abort load 事件後觸發 ...

《演算法導論》習題2 1 3

考慮以下查詢問題 輸入 n個數的乙個序列a 和乙個值 v 輸出 下標i使得 v a i 或者當 v 不在 a中時,v 為特殊值nil。寫出線性查詢的偽 它掃瞄整個序列來查詢 v。使用乙個迴圈不變式來證明你的演算法是正確的。確保迴圈不變式滿足三條必要的性質。偽 find key a,v fori 1 ...

牛客2 13題解

題意給兩字串,每次可以執行以下三種操作,1是將乙個字母變成乙個字母,另乙個就是從後面加乙個字母,再乙個就是從後面刪除乙個字母問最少可以轉換多少次讓這兩個字串相同 思路 這題其實特別簡單,就是先求兩個字串的長度差,這個長度差 肯定是轉換次數的一部分,用23其實都一樣,然後看 他們長度相同的那一段有多少...