spoj GSS3
codeforces ???
tioj 1224
key \(\leq 3\)
key \(\geq 3\)
比較 pri
?
比較 pri
比較 pri
比較 pri
比較 pri
比較 pri
比較 pri
\(k = 4\)
unsigned ran() {
static unsigned x = 19;
return ++(x *= 0xdefaced);
}
struct node {
node * left = NULL, * right = NULL;
int key;
unsigned pri;
node(int key):key(key), pri(ran()){};
};
node * merge (node* a, node* b) {
if (!a)return b;
if (!b)return a;
if (a->pri < b->pri) {
a->right = merge(a->right, b);
return a;
}
else {
b->left = merge(a, b->left);
return b;
}
}
void split(node* now, int key, node* &a, node* &b) {
if (!now) {
a = b = NULL;
return;
}
if (now->key < key) {
a = now;
split(now->right, key, a->right, b);
}
else {
b = now;
split(now->left, key, a, b->left);
}
}
維護一個序列,操作有以下
請維護一個集合,使得他支援兩種操作 :
\(x \leq 10^5\)
操作數量 \(\leq 10^5\)
請維護一個集合,使得他支援兩種操作 :
ojdl 7129
# : \(x \leq 10^9\)
操作數量 \(\leq 3 \cdot10^5\)
有一些城市 編號由 \(1 ~ n\)
有一些科學家想採集隕石樣本,而第 \(i\) 個城市需要採集 \(p_i\) 個
有 \(k\) 筆事件兩兩事件時間差為 1 且按照時間順序 \(l_i, r_i, a_i\) 表達在從 \([l_i, r_i]\) 都將會有 \(a_i\) 顆隕石墜落
請輸出 \(n\) 行代表在第 \(i\) 座城市至少要多久才能完成樣本採集
\(1 \leq n \leq 300000, 1 \leq k \leq 300000\)
第 \(i\) 顆線段樹紀錄了時間從 \([1, i]\) 的所有事件,
那就對於每個 \(i\) 就可以二分搜答案了!
struct node {
node *left = NULL, *right = NULL;
int val;
};
node* add(node* old, int pos, int val) {
node* res = new node(old), * now = res;
int l = 1, r = n, m;
res->val += val;
while (l < r) {
m = l + r >> 1;
if (pos > m) {
now->right = new node(old->right);
now->right->val += val;
now = now->right;
old = old->right;
r = m;
}
else {
now->left = new node(old->left);
now->left->val += val;
now = now->left;
old = old->left;
l = m+1;
}
}
return res;
}
node* add(node* old, int pos, int val) {
node* res = new node(old), * now = res;
int l = 1, r = n, m;
res->val += val;
while (l < r) {
m = l + r >> 1;
if (pos > m) {
now->right = new node(old->right);
now->right->val += val;
now = now->right;
old = old->right;
r = m;
}
else {
now->left = new node(old->left);
now->left->val += val;
now = now->left;
old = old->left;
l = m+1;
}
}
return res;
}
靜態區間第 \( K \) 大
有兩種工作,總共有 n 個
第一種會佔用一個處理器 使用從 \(l_i\) 到 \(r_i\) 的所有時間 並且從頭到尾只能使用同一個處理器
第二種有完成期限,可以分配給不同的處理器,必須在 \(d_i\)之前完成,需要花 \(w_i\) 的時間
請問至少需要幾個處理器 才能完成所有工作
NOTE : 一個處理器在任何時刻都只能處理一個工作
第二種工作在任何時刻也最多只能被一個處理器處理
\(l_i \leq\ r_i \leq 10^6\)
\(n \leq 10^5\)
帶修改區間 \(K\) 大
struct bit {
node* root[maxn];
void add(int x, int y, int val) {
for (;x <= maxn;x += x & -x)
modify(root[x], y, val);
}
};
struct bit{
void shift(vector<node*> &nodes, int dir) {
static const l_type = 0;
for (auto &i : nodes) i = (dir == l_type ? i->left : i->right);
}
int left_sum(vector<node*> &nodes) {
int res = 0;
for (auto i : nodes) res += i->left->cnt;
return res;
}
int query(int l, int r, int k) {
vector<node*> lnode, rnode;
for (int i = l;i;i ^= i & -i) lnode.pb(root[i]);
for (int i = r;i;i ^= i & -i) rnode.pb(root[i]);
int L = 1, R = n, M;
while (L < r) {
M = L + R >> 1;
if (int lcnt = left_sum(rnode) - left_sum(lnode) ; lcnt >= k) {
shift(rnode, 0), shift(lnode, 0);
R = M;
}
else {
k -= lcnt;
shift(rnode, 1), shift(lnode, 1);
L = M+1;
}
}
return L;
}
};
\(dp_i := \) 以數值 \(i\) 結尾最長的答案
用 map<int,int> dp;
有 \(q, (q \leq 10^5)\) 筆操作
在碼頭上,你擁有一個碼頭,根據政府規定,一個碼頭一天最多只能有兩艘船停靠卸貨,你手上有一份名單上面有
\( n \leq 10^5 \) 個資訊,告訴你今天所有船的
停靠時間,離開時間,以及獲利
\(l_i, r_i, c_i, (l_i \leq r_i \leq 10^5, c_i \leq 10^9)\)
在任意時刻,一個碼頭最多都只能停靠一艘船,你可以選擇要不要讓他停靠,請問你今天最多能夠獲利多少呢?