日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ONTAK2010 Peaks加强版(离线在线)

發(fā)布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ONTAK2010 Peaks加强版(离线在线) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題面

弱化版:luogu
強制在線版:bzoj

題解

本題有兩種解法

離線算法:線段樹合并

先看一道簡單題[USACO18JAN]MooTube

本題就是在此基礎(chǔ)上求第\(k\)高的點

首先把詢問和路徑都排一下序

然后記一個指針,如果當(dāng)前路徑可以對這個詢問有貢獻(xiàn),就加入這條邊

本題也是一樣

在此基礎(chǔ)上,線段樹合并即可求第\(k\)高的點

Code

#include<bits/stdc++.h>#define LL long long #define RG registerusing namespace std; template<class T> inline void read(T &x) {x = 0; RG char c = getchar(); bool f = 0;while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();x = f ? -x : x;return ; } template<class T> inline void write(T x) {if (!x) {putchar(48);return ;}if (x < 0) x = -x, putchar('-');int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ; } const int N = 1e5+10, M = 5e5+10; int h[N];struct node {int a, b, c, id;bool operator < (const node & z) const {return c < z.c;} }e[M], Q[M];struct ST_tree {int ls, rs, v; }t[N*20]; int root[N], tot;void insert(int &now, int l, int r, int k) {if (!now) now = ++tot;t[now].v++;if (l == r) return;int mid = (l + r) >> 1;if (k <= mid) insert(t[now].ls, l, mid, k);else insert(t[now].rs, mid+1, r, k); }int query(int rt, int l, int r, int k) {if (l == r) return l;int mid = (l + r) >> 1, cnt = t[t[rt].ls].v;if (k <= cnt) return query(t[rt].ls, l, mid, k);return query(t[rt].rs, mid+1, r, k-cnt); } int fa[N], siz[N]; int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]); }int o[N], len, ans[M];int Merge(int x, int y) {if (!x || !y) return x+y;t[x].v += t[y].v;t[x].ls = Merge(t[x].ls, t[y].ls);t[x].rs = Merge(t[x].rs, t[y].rs);return x; }void merge(int x, int y) {x = find(x); y = find(y);if (x == y) return ;fa[y] = x;root[x] = Merge(root[x], root[y]); siz[x] += siz[y]; }int main() {int n, m, q, p = 1;read(n), read(m), read(q);for (int i = 1; i <= n; i++) read(h[i]), fa[i] = i, o[i] = h[i], siz[i] = 1;sort(o+1, o+1+n);len = unique(o+1, o+1+n) - o - 1;for (int i = 1; i <= n; i++) { h[i] = lower_bound(o+1, o+1+len, h[i]) - o;insert(root[i], 1, len, h[i]);}for (int i = 1; i <= m; i++)read(e[i].a), read(e[i].b), read(e[i].c);for (int i = 1; i <= q; i++)read(Q[i].a), read(Q[i].c), read(Q[i].b), Q[i].id = i;sort(e+1, e+1+m);sort(Q+1, Q+1+q); /* for (int i = 1; i <= q; i++)printf("%d %d %d\n", Q[i].a, Q[i].b, Q[i].c);*/for (int i = 1; i <= q; i++) {while (p <= m && e[p].c <= Q[i].c) merge(e[p].a, e[p].b), p++;if (siz[find(Q[i].a)] < Q[i].b) ans[Q[i].id] = -1;else ans[Q[i].id] = o[query(root[find(Q[i].a)], 1, len, siz[find(Q[i].a)]-Q[i].b+1)];}for (int i = 1; i <= q; i++)printf("%d\n", ans[i]);return 0; }

在線算法:主席樹+Kruskal重構(gòu)樹

一開始以為加強版是數(shù)據(jù)加強..

Kruskal重構(gòu)樹

滿足堆的性質(zhì)

所以我們可以倍增找到最大的小于等于一個權(quán)值的點
然后它的子樹里的所有點都可以互相到達(dá)

求第\(k\)大的點,在\(dfs\)序上主席樹即可

Code

#include<bits/stdc++.h>#define LL long long #define RG registerusing namespace std; template<class T> inline void read(T &x) {x = 0; RG char c = getchar(); bool f = 0;while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();x = f ? -x : x;return ; } template<class T> inline void write(T x) {if (!x) {putchar(48);return ;}if (x < 0) x = -x, putchar('-');int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ; } const int N = 2e5+10, M = 5e5+10; int n, m, q, h[N];struct Edge {int u, v, w;bool operator < (const Edge &z) const {return w < z.w;} }e[M];int fa[N], val[N], tot; int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]); } struct node {int to, nxt; }g[N]; int last[N], gl; void add(int x, int y) {g[++gl] = (node) {y, last[x]};last[x] = gl; }void kruskal() {sort(e+1, e+1+m);for (int i = 1; i <= n; i++)fa[i] = i;int cnt = 0;for (int i = 1; i <= m; i++) {int u = e[i].u, v = e[i].v, w = e[i].w;u = find(u), v = find(v);if (u == v) continue;h[++tot] = w;add(tot, u), add(tot, v);fa[u] = fa[v] = fa[tot] = tot;if (++cnt == n-1) break;}return ; }int dfn[N], cnt, l[N], r[N]; int anc[N][21];void dfs(int u) {if (u <= n)dfn[++cnt] = h[u];l[u] = cnt;for (int i = 1; i <= 20; i++)anc[u][i] = anc[anc[u][i-1]][i-1];for (int i = last[u]; i; i = g[i].nxt) {int v = g[i].to;anc[v][0] = u;dfs(v);}r[u] = cnt;return ; } int o[N];struct Tree {struct node {int ls, rs, v;}t[N*20];int cnt, root[N];void insert(int &now, int l, int r, int pos) {t[++cnt] = t[now];now = cnt;t[now].v++;if (l == r) return ;int mid = (l + r) >> 1;if (pos <= mid) insert(t[now].ls, l, mid, pos);else insert(t[now].rs, mid+1, r, pos);}int query(int rt1, int rt2, int l, int r, int k) {if (l == r) return l;int mid = (l + r) >> 1, tmp = t[t[rt2].ls].v - t[t[rt1].ls].v;if (tmp < k) return query(t[rt1].rs, t[rt2].rs, mid+1, r, k-tmp);else return query(t[rt1].ls, t[rt2].ls, l, mid, k);} }T;int main() {read(n), read(m), read(q);tot = n;for (int i = 1; i <= n; i++) read(h[i]), o[i] = h[i];for (int i = 1; i <= m; i++) read(e[i].u), read(e[i].v), read(e[i].w);kruskal();dfs(tot);sort(o+1, o+1+n);int K = unique(o+1, o+1+n) - o - 1;for (int i = 1; i <= n; i++)dfn[i] = lower_bound(o+1, o+1+K, dfn[i]) - o;int ans = 0;for (int i = 1; i <= n; i++) {T.root[i] = T.root[i-1];T.insert(T.root[i], 1, K, dfn[i]);}h[0] = 2147483647;while (q--) {if (ans == -1) ans = 0;int v, x, k; read(v), read(x), read(k);v ^= ans, x ^= ans, k ^= ans;for (int i = 20; i >= 0; i--)if (h[anc[v][i]] <= x) v = anc[v][i];if (r[v] - l[v] < k) ans = -1;else ans = o[T.query(T.root[l[v]], T.root[r[v]], 1, K, r[v]-l[v]+1-k)];write(ans); putchar('\n');}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/zzy2005/p/10319754.html

總結(jié)

以上是生活随笔為你收集整理的ONTAK2010 Peaks加强版(离线在线)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 最好看的日本字幕mv视频大全 | 成都电影免费大全 | 成人激情五月天 | 8x8x永久免费视频 | 少妇一级淫片免费视频 | 欧美国产一区二区在线观看 | 久久久久久一区二区 | 97精品国产露脸对白 | 狠狠干男人的天堂 | 美女脱裤子打屁股 | 黄色片网站视频 | 狠狠综合久久 | 国产美女无遮挡永久免费 | 91麻豆精品秘密入口 | 91毛片在线观看 | 天天干天天操天天舔 | 欧美日韩免费一区 | 被黑人啪到哭的番号922在线 | 小俊大肉大捧一进一出好爽 | 免费av看 | 免费看日产一区二区三区 | 欧美色欧美色 | 乱精品一区字幕二区 | 先锋影音av资源在线观看 | 人人爱操 | h网站免费在线观看 | 久久精品人人做人人爽 | 中日韩黄色片 | 九九爱视频 | 亚洲欧美成人一区 | 黄a网站 | 老司机深夜视频 | 天堂在线 | 亚洲一区欧美日韩 | 超碰天天 | 精品成在人线av无码免费看 | 国产高潮久久久 | 欧美日韩激情在线观看 | www,色| av中亚 | 亚洲精品电影院 | 日韩福利 | 调教91| xxx国产 | 欧美另类在线视频 | 欧美7777 | 美女隐私免费 | 欧美被狂躁喷白浆精品 | 美梦视频大全在线观看高清 | 国产情侣激情 | 国产孕妇孕交大片孕 | 亚洲熟女乱综合一区二区 | 最近的中文字幕 | 香蕉久久久 | 日韩欧美久久久 | 国产不卡视频在线观看 | 懂色av一区二区夜夜嗨 | 日韩成人免费视频 | 五月开心网| 日韩精品在线观看中文字幕 | 成人免费自拍视频 | 91天堂素人 | 国产精品久久久久久久蜜臀 | 麻豆传媒映画官网 | 欧美67194 | 一级aa毛片 | 成年人观看视频 | 日韩视频免费在线观看 | 欧美黄色一级生活片 | 日本成人综合 | 国产第20页 | 中文字幕第三页 | 欧美亚洲日本国产 | 久久久久久综合网 | 超碰97人人在线 | 五十路中文字幕 | 久久人人看 | av青娱乐 | 亚洲毛片在线播放 | 他趴在我两腿中间添得好爽在线看 | 91成人免费视频 | 国产盗摄在线观看 | 午夜福利视频合集1000 | 日韩视频在线观看一区 | av日韩免费 | 小泽玛利亚一区二区三区在线观看 | 国产精品6 | 99视频在线观看免费 | 久久久久久久久久久久久av | 椎名由奈在线观看 | 国产福利小视频在线 | 日韩大尺度在线观看 | 亚洲精品成人网 | 韩国一级淫片免费看 | 在线se| 日韩视频免费在线播放 | 91精品国自产 | 阿的白色内裤hd中文 | 国产黄在线播放 |